avr at90sub162 UART
-
- EF Sponsor
- Inlägg: 2109
- Blev medlem: 27 augusti 2005, 20:57:58
- Ort: Borlänge
Använd Code-taggarna så man ser din kod lättare.
Vid start av MCU:n sätts alla register till noll. Du har t ex (vad jag kan se) inte definerat antal bitar. Kolla tabell 17.7 i databladet. Du behöver sätta bit 2 och 1 i register UCSR1C för att få 8 bitar.
Använd gärna ett bättre terminalprogram som t ex Bray Terminal när du försöka kommunicera så ska du se det ordnar sig.
Vid start av MCU:n sätts alla register till noll. Du har t ex (vad jag kan se) inte definerat antal bitar. Kolla tabell 17.7 i databladet. Du behöver sätta bit 2 och 1 i register UCSR1C för att få 8 bitar.
Använd gärna ett bättre terminalprogram som t ex Bray Terminal när du försöka kommunicera så ska du se det ordnar sig.
Är du hundra säker på att verkligen lyckats sätta den till 9600 i mikrokontrollern? Det brukar vara lite räknande hit och dit med frekvenser och delningar för att få det rätt. Lätt att missa någonting. Även värt att kolla på det som Piratpojken skrev.gripner skrev: böt ut den, nu kommer skräp fram iaf..dock blir det inget U utan ett skumt C med flerpar under/över.....
baudraten är satt till 9600 på både
Frågan är vad,
uträkningen är rätt. dock använder jag inte den iom att databladet har en tabel som säger att tex 51 är 9600baud vid 8MHz
står klart märkt på min kristall att det e 8MHz.
databladet har oxå kod som sätter registret för baudrate, vilken jag använder.
dock är den lite fel tror jag
edit
http://www.olimex.com/dev/avr-usb-162.html
är dev kortet jag använder med 8MHz kristall
uträkningen är rätt. dock använder jag inte den iom att databladet har en tabel som säger att tex 51 är 9600baud vid 8MHz
står klart märkt på min kristall att det e 8MHz.
databladet har oxå kod som sätter registret för baudrate, vilken jag använder.
dock är den lite fel tror jag
Kod: Markera allt
UBRRHn = (unsigned char)(baud>>8);
UBRRLn = (unsigned char)baud;
måste va
UBRRnH = (unsigned char)(baud>>8);
UBRRnL = (unsigned char)baud;
för att komilera, nog en typo i databladet.
http://www.olimex.com/dev/avr-usb-162.html
är dev kortet jag använder med 8MHz kristall
Fuses är ganska grundläggande att veta om när man pysslar med AVR. LFUSE, HFUSE och EFUSE bestämmer saker som vilken oscillator som används, BOD, bootarea, watchdog etc.
AVR-Studio? I dialogen där man programmerar AVR:en finns en flik med fuses.
avrdude? 'dump lfuse' läser LFUSE, 'write 0 0x12 lfuse' skriver 0x12 till LFUSE
Har du ingen makefile som definierar F_CPU?
Om du ändrar detta till 1000000 och F_CPU redan är definierad i makefilen så har inte din ändring någon effekt.
AVR-Studio? I dialogen där man programmerar AVR:en finns en flik med fuses.
avrdude? 'dump lfuse' läser LFUSE, 'write 0 0x12 lfuse' skriver 0x12 till LFUSE
Har du ingen makefile som definierar F_CPU?
Om du ändrar detta till 1000000 och F_CPU redan är definierad i makefilen så har inte din ändring någon effekt.
Kod: Markera allt
#ifndef F_CPU
#define F_CPU 8000000
#endif
-
- EF Sponsor
- Inlägg: 2109
- Blev medlem: 27 augusti 2005, 20:57:58
- Ort: Borlänge
Det verkar rätt att 8 databitar sätts som default nu när jag simulerar i AVR-studio. För den skull finns det ingen anledning att inte sätta registret.
UCSR0C = (3<<UCSZ00); översätts till UCSR0C = 0x06; se listfilen som kompilatorn genererar för fler detaljer.
För att ändra fuses behöver du en programmerare, det går inte med FLIP.
Försök på något sätt verifiera vilken klockfrekvens den verkligen kör på.
UCSR0C = (3<<UCSZ00); översätts till UCSR0C = 0x06; se listfilen som kompilatorn genererar för fler detaljer.
För att ändra fuses behöver du en programmerare, det går inte med FLIP.
Försök på något sätt verifiera vilken klockfrekvens den verkligen kör på.
jag är kass på asm, inte rört det sedan amiga 500 var het 
skulle vilja skriva ett program som lopar igenom 10000000 simpla adderingar, tar det ca 10sec ere 1MHz, addering tar tydlingen likt de allra flesta instruktioner 1 klockcykel.
någon som vet hur många instruktioner:
for(i=1; i < 10000001; i++)
tar, dvs, hur många instruktioner behöver en for-loop?
jag får det till 3. addering, gämför, branch till start om mindre än.
4 första snurren iom att i=1; men ointresant vid 10000000 snurrar.
om nu inte avr:en saknar förmåga att compara etc mot minne, blir det en massa till dock, måste in med datan i register då ju..
tycker iaf att det är mycket skumt om dom har lödit på en 8MHz extern kristall o sen inte använder den..... men men, om så är fallet, finns det någon snäll själ som kan progga om mitt dev-kort? kanske i sthlm trakten?

skulle vilja skriva ett program som lopar igenom 10000000 simpla adderingar, tar det ca 10sec ere 1MHz, addering tar tydlingen likt de allra flesta instruktioner 1 klockcykel.
någon som vet hur många instruktioner:
for(i=1; i < 10000001; i++)
tar, dvs, hur många instruktioner behöver en for-loop?
jag får det till 3. addering, gämför, branch till start om mindre än.
4 första snurren iom att i=1; men ointresant vid 10000000 snurrar.
om nu inte avr:en saknar förmåga att compara etc mot minne, blir det en massa till dock, måste in med datan i register då ju..
tycker iaf att det är mycket skumt om dom har lödit på en 8MHz extern kristall o sen inte använder den..... men men, om så är fallet, finns det någon snäll själ som kan progga om mitt dev-kort? kanske i sthlm trakten?
-
- EF Sponsor
- Inlägg: 2109
- Blev medlem: 27 augusti 2005, 20:57:58
- Ort: Borlänge
Antagligen används kristallen, men det finns klockdiv i AVR:n så den verkliga klockfrekvensen kan ju vara en annan. Du har lite att läsa på sid 25-29 samt kolla i koden.
Loopen
unsigned long i;
for(i=1; i < 10000001; i++)
;
genererar på en Atmega48
1b0: 01 96 adiw r24, 0x01 ; 1
1b2: a1 1d adc r26, r1
1b4: b1 1d adc r27, r1
1b6: 81 38 cpi r24, 0x81 ; 129
1b8: 26 e9 ldi r18, 0x96 ; 150
1ba: 92 07 cpc r25, r18
1bc: 28 e9 ldi r18, 0x98 ; 152
1be: a2 07 cpc r26, r18
1c0: 20 e0 ldi r18, 0x00 ; 0
1c2: b2 07 cpc r27, r18
1c4: a8 f3 brcs .-22 ; 0x1b0 <main+0x52>
Simulering i AVR-studio säger att ovanstående snutt tar
16250ms och 129999999 cykler vid 8 MHz
Loopen
unsigned long i;
for(i=1; i < 10000001; i++)
;
genererar på en Atmega48
1b0: 01 96 adiw r24, 0x01 ; 1
1b2: a1 1d adc r26, r1
1b4: b1 1d adc r27, r1
1b6: 81 38 cpi r24, 0x81 ; 129
1b8: 26 e9 ldi r18, 0x96 ; 150
1ba: 92 07 cpc r25, r18
1bc: 28 e9 ldi r18, 0x98 ; 152
1be: a2 07 cpc r26, r18
1c0: 20 e0 ldi r18, 0x00 ; 0
1c2: b2 07 cpc r27, r18
1c4: a8 f3 brcs .-22 ; 0x1b0 <main+0x52>
Simulering i AVR-studio säger att ovanstående snutt tar
16250ms och 129999999 cykler vid 8 MHz