Sida 2 av 4
Re: USART atmega88, nybörjare
Postat: 25 maj 2010, 06:55:08
av PHermansson
Samuel84 skrev:Har du ngt förslag på vilka fler inställningar man behöver och som är lämpliga? Var kan man läsa om dessa inställningar?
När jag t.ex. lägger till detta i initfunktionen:
får jag felmeddelandet:
../LAB6.c:23: error: 'UCSRC' undeclared (first use in this function)
../LAB6.c:23: error: (Each undeclared identifier is reported only once
../LAB6.c:23: error: for each function it appears in.)
../LAB6.c:23: error: 'UCSZ1' undeclared (first use in this function)
../LAB6.c:23: error: 'UCSZ0' undeclared (first use in this function)
Någon som vet varför?
Även U2Xn=0; fattar den inte.
Vad är det tänkt att de instruktionerna ska göra? Hittar inte de registren i databladet, antagligen är det något som används för någon annan AVR-modell.
Re: USART atmega88, nybörjare
Postat: 25 maj 2010, 09:10:18
av snigelen
> Har du ngt förslag på vilka fler inställningar man behöver och som är lämpliga? Var kan man läsa om dessa inställningar?
Kapitel 19 i databladet, speciellt 19.10 står beskrivningar av alla register.
> När jag t.ex. lägger till detta i initfunktionen:
Registret heter (för bl.a. mega88) UCSR0C och bitarna UCSZ01 resp UCSZ00 (stoppa in en nolla som näst sista tecken).
> Även U2Xn=0; fattar den inte.
Den är för att dubbla hastigheten, du får 19200 baud med UBRR0=51. Så den kan vara satt till noll.
Stoppar du in ovanstående i InitUART() borde det fungera med 9600 N81.
Re: USART atmega88, nybörjare
Postat: 25 maj 2010, 09:12:42
av sodjan
> Har du ngt förslag på vilka fler inställningar man behöver och som är lämpliga?
Vid all seriekommunikation brukar bl.a antal bitar, paritet och stoppbitar vara av intresse, eller hur ?
> Var kan man läsa om dessa inställningar?
Där du läser om alla andra inställningar för din AVR...
> När jag t.ex. lägger till detta i initfunktionen:
Varför lägger du in just det där ? Var är det dokumenterat ?
Eftersom varken register eller bitar verkar stämma mot din AVR-modell
så är det ju lite märkligt att du testar med just det...
Re: USART atmega88, nybörjare
Postat: 25 maj 2010, 09:13:04
av thepirateboy
Det kanske låter tråkigt men allt står i databladet hur du ska göra.
Tänk på att exemplen är generiska, och man måste själv ange vilken UART man tänker använda.
Eftersom Atmega88 bara har en UART så byter man ut n mot 0 i exemplen, t ex.
U2Xn --> U2X0
UDRn --> UDR0
Re: USART atmega88, nybörjare
Postat: 25 maj 2010, 13:25:31
av Samuel84
Tack för alla svar. Jo, det flesta exempel på nätet är ju för atmega16, och jag förstår ju att det inte går att skriva exakt som i dom exemplen. tack därför snigelen för översättningen. I data bladet står alla register lite kryptiskt. t.ex. UBRRn. varför står det "n" när det alltig verkar vara n=0 som gäller? Varför inte bara skriva 0?, alltså UBRR0.
För att sätta U2X0 borde denna rad fungera: UCSR0A &= ~(1 << U2X0);?
Re: USART atmega88, nybörjare
Postat: 25 maj 2010, 13:34:26
av E85
> varför står det "n" när det alltig verkar vara n=0 som gäller?
För att en del processorer har fler än en usart-modul. Det är inte alltid 0 som gäller men nästan...
Re: USART atmega88, nybörjare
Postat: 25 maj 2010, 13:52:03
av sodjan
I andra kapitel (t.ex för timers) är det bättre dokumenterat. T.ex så skriver man
i kapitel "17. 8-bit Timer/Counter2 with PWM and Asynchronous Operation" :
Many register and bit references in this document are written in general form. A lower case “n”
replaces the Timer/Counter number, in this case 2. However, when using the register or bit
defines in a program, the precise form must be used, i.e., TCNT2 for accessing Timer/Counter2
counter value and so on.
Motsvarande hade ju vara bra om de hade haft med i USART kapitlet, eller helt enkelt
(eftersom det i alla fall bara finns en USART) skrivit de korrekta register namnen direkt.
Det är möjligt (jag har inte kollat) att det finns motsvarande skrivning i datablad
för de AVR'er som har fler än en USART...
Å andra sidan så är det ju något man snabbt upptäcker om man försöker programmera
med ett "n" i den positionen. Efter 5 minuter så är detta att passerat kapitel och
knappast ett problem längre. Dessutom är det ju så att ett liten "n" nästan alltid
representerar en position där det ska stå en siffra i de flesta datablad oavsett om
det är för AVR eller något annat.
Re: USART atmega88, nybörjare
Postat: 25 maj 2010, 13:54:01
av Samuel84
Tackar! Kan man skriva UCSR0C = 0b00000110;, istället för att ställa in bitarna med logiska operatorer? De två ettorna är för att ställa UCSZ01 och UCSZ00 för att få 8-bitarsläge. Och när jag skickar mina bytes, måste jag skicka första 0:an i variabeln jag skickar (startbit)?
Re: USART atmega88, nybörjare
Postat: 25 maj 2010, 13:58:27
av sodjan
> Kan man skriva UCSR0C = 0b00000110;
Ja visst kan man det !
Det ända jag har imot det är att bitnamnen inte framgår tydligt.
Finns det inte C-macron för att nolla och sätta enskilda bitar direkt ?
Det blir sannolikt tydligare i koden...
> Och när jag skickar mina bytes, måste jag skicka första 0:an i variabeln jag skickar (startbit)
Nej. Du sätter upp USART moduel för det antal startbitar du vill ha och sedan
sköter den om det. Det enda du själv anger är data-bitarna.
Re: USART atmega88, nybörjare
Postat: 25 maj 2010, 14:11:57
av PHermansson
Finns ju en del olika sätt att sätta bitar. Fördelen med dessa här är att man inte pillar på fel bitar i byten i onödan.
// RGB-led pins
#define green PA5
#define red PA7
PORTA |=_BV(red); //Led on
PORTA &= ~_BV(red); //Led off
//Porta 5-7 = RGB-outputs
DDRA = (1<<PA5)|(1<<PA6)|(1<<PA7);
DDRA &= ~(1 << green); // Set pin as input.
Re: USART atmega88, nybörjare
Postat: 25 maj 2010, 14:17:13
av Samuel84
Så har man UCSR0C = 0b00000110;, har man ställt in alla bitar till 0 utom UCSZ01 och UCSZ00, vilket innebär att USBS0=0, vilket innebär 8 bitar och 1 startbit.
Nu ser min initiering ut såhär:
Kod: Markera allt
UBRR0H = (unsigned char)(baud>>8);
UBRR0L = (unsigned char)baud; //set the baud rate
UCSR0B = _BV(RXEN0) | _BV(TXEN0); //enable UART receiver and transmitter
UCSR0C = 0b00000110;
UCSR0A &= ~(1 << U2X0);
I övrigt som vanligt. Borde det inte fungera då? Får fortfarande bara nonsens. i dockight är inställningarna 9600 baudrate, 1 stoppbit, 0 paritetbit. Var ställer man in antal startbitar?
Re: USART atmega88, nybörjare
Postat: 25 maj 2010, 14:19:24
av snigelen
> För att sätta U2X0 borde denna rad fungera: UCSR0A &= ~(1 << U2X0);?
Ja. Men det behövs inte. Den är den satt till noll vid reset (Initial Value i registerbeskrivningen).
Sen finns det många sätt att sätta bittar till noll och ett. Men det har visst PHermansom skrivit under tiden jag skrev detta. Det är bra att lära sig alla metoder så att man kan läsa andras kod, men sen anväder du den som känns bäst för dig.
Re: USART atmega88, nybörjare
Postat: 25 maj 2010, 14:21:26
av sodjan
> Får fortfarande bara nonsens i dockight...
Ja, men det är ju en helt annan fråga !

Det har sannolikt med något annat att göra, fel baudrate (i någon
av ändarna) ligger väl närmast. Eller felkopplat helt enkelt...
Re: USART atmega88, nybörjare
Postat: 25 maj 2010, 14:29:30
av Samuel84
Tack! Men du skrev Snodjan att man ska sätta antal startbitar. Hur gör man detta? Eller var det stoppbitar du menade?
1000 tack alla!
Re: USART atmega88, nybörjare
Postat: 25 maj 2010, 14:32:24
av sodjan
Whatever.
Databladet anger *vad* du kan sätta.
Sätt allt så som du vill ha det...