Sida 2 av 2

Postat: 21 juli 2005, 19:28:49
av Icecap
Sån rent omedelbart (har aldrig kört AVR) ser jag ingen interrupt-enabling i initialiseringen av USART'en.....eller också kanske du ska peka ut den för mig....fast strunt samma, jag kommer aldrig att köra med AVR.

Men kolla det med att enabla interrupten...

Postat: 21 juli 2005, 19:35:58
av björn
Som jag fattat det så försöker jag köra med polling istället för interupt (jag trodde det var enklare)

Jag får väl återgå till PIC igen....

Postat: 21 juli 2005, 20:06:40
av Erik_Lind
björn skrev:
UCSRC = (1<<USBS | 3<<UCSZ0);
Ska det inte vara?

Kod: Markera allt

UCSRC = (1<<USBS) | ( 1<<UCSZ0);


Postat: 21 juli 2005, 20:46:50
av Icecap
Visst kör du med polling....sorry, är lite trött efter grannens festande i natt....

Postat: 21 juli 2005, 21:09:37
av frejo
björn skrev:Jag har kopplat:

AVR->MAX203
RXD(pin14)->R1OUT(PIN 3)
TXD(PIN15)->T1IN(PIN2)

Sen har jag kopplat från serie porten till max 203 pin4 och pin5.

EDiT:tillägg:Jag får bara nollor i det andra terminalprogrammet med, tex om jag skall skicka 0xff blir det nollor bara.
Har du kopplat signal ground från serieporten till GND på avr:n?

Postat: 21 juli 2005, 21:09:58
av cykze
Låter märkligt det där. Säker på att AVR:en tar emot rätt värde från datorn?

Prova att köra med vanliga "8 bitar, ingen paritet, 1 stoppbit". Ställ in det i terminalprogrammet på datorn och ta bort dessa rader från AVR-koden:

Kod: Markera allt

/*set frameformat : 8 databits 2 stop bits*/
UCSRC = (1<<USBS | 3<<UCSZ0);
Erik_Linde: Det är inte ofta man ser någon annan siffra än 1 till vänster om vänsterskifttecknet, men i det här fallet ska det faktiskt vara en 3:a precis som det står.

Postat: 21 juli 2005, 23:32:07
av erixon
vad kör du för typ av klocka? den interna 1Mhz eller kristall (den interna är oftast fördålig presition för att köra uarten på) sedan måste du sätta URSEL när du ska skriva till UCSRC annars kommer du att skriva till UBRRH (se data bladet på sidan 155)

så....
UCSRC = (1<<URSEL) | (1<<USBS) | (3<<UCSZ0);
då borde det fungera bättre

Det förklara också varför det enda du får tillbaka är noller...

Hoppas att det hjälper :)

Postat: 22 juli 2005, 11:27:33
av björn
Tack för det, nu funkar det :D . och ja jag kör med den interna klockan, skall lägga på externa så fort jag får hem.

Tack alla för hjälpen, vad skulla man ta sig till utan er ??

Postat: 22 juli 2005, 13:02:29
av cykze
Bra att det löste sig så att du slapp gå tillbaka till PIC. ;)

Jag tycker du ska göra som jag skrev att helt strunta i att ändra värdet i UCSRC. Då blir det nämligen det vanliga med 8 databitar, ingen paritet och en stoppbit automatiskt.

Istället för att sätta både UBRRH och UBRRL när du ställer in baudraten så räcker det med att sätta UBRR till rätt 16-bitarsvärde, så sköter kompilatorn automatiskt uppdelningen i H- och L-delen av UBRR. Så här:

Kod: Markera allt

/*set budrate*/
UBRR = ubrr;

Postat: 22 juli 2005, 13:42:21
av björn
Ja, väldigt skönt att slippa pic (viss humor, men sant). Ja det verkar betydligt smidigare att göra så.

cykze: Om jag använder UBRR istället får jag kompileringsfel, måste jag includa något mer än io.h för att använda det??

Postat: 22 juli 2005, 20:14:15
av björn
En fråga till, vad använd igentligen '|' till i c-programm? alltså när det används som i
UCSRC = (1<<USBS | 3<<UCSZ0);
eller
ADCSRA|=0x10;
?

Postat: 22 juli 2005, 20:21:18
av frejo
"bitwise or", eller på svenska, "bitvis eller"
dvs 01000010 | 10010000 = 11010010

google är ett utmärkt verktyg när man undrar något ;)
http://www.google.se/search?hl=sv&q=c+% ... %B6k&meta=
första träffen var hjälpsam: http://www.difranco.net/cop2220/op-prec.htm

Postat: 22 juli 2005, 20:53:42
av björn
ok, tack. Förlåt för min dåliga googleförmåga....

Postat: 22 juli 2005, 22:16:40
av cykze
björn skrev:cykze: Om jag använder UBRR istället får jag kompileringsfel, måste jag includa något mer än io.h för att använda det??
Fel av mig. På Mega16 ligger visst inte UBRRL (8 bitar) och UBRRH (8 bitar) efter varandra i minnet, därför fungerar det inte med UBRR (16 bitar) i det här fallet. Men i de flesta andra fall fungerar det att slå ihop två 8-bitarstilldelningar till en 16-bitarstilldelning på det sättet (t ex med TCNT0L och TCNT0H)...

Postat: 22 juli 2005, 22:27:44
av frejo
björn skrev:ok, tack. Förlåt för min dåliga googleförmåga....
Ingen fara, alltid kul att kunna hjälpa till ;)