Sida 1 av 2

ATtiny2313 USART - konstig baudrate

Postat: 15 januari 2006, 22:58:41
av speakman
Har stött på ett märkligt fenomen under utveckling på ett ATtiny2313-projekt.
Jag använde USART:en i ett tidigare projekt, och där funkar den kalas. Precis som det sig bör.
Nu i det nya projektet vill jag spara lite tid, så jag kopierade in serial.[ch] från det gamla projektet in i det nya.
Eftersom det enda jag gör i serial.c är att konfigurera USARTen så kompilerade det fint utan problem... Men funkar gör det inte!
Har kopplat upp scopemetern, och där ser jag att bitlängderna är fantastiskt mycket längre (helt enormt, 20ms långa!!).

serial.c:

Kod: Markera allt

#include <avr/io.h>
#include <avr/delay.h>
#include <inttypes.h>

#include <avr/interrupt.h>
#include <avr/signal.h>

/* Initialize USART (9600-8N1) */
void ser_init(void)
{
        /* Set baud rate */
        UBRRH = 0x00;
        UBRRL = 0x19;

        /* X2-mode */
        UCSRA = _BV(U2X);

        /* Enable RX, TX and RX interrupt */
        UCSRB = _BV(TXEN) | _BV(RXEN) /*| _BV(RXCIE)*/;

        /* 8-bits, no parity, 1 stop bit */
        UCSRC = _BV(UMSEL) | _BV(UCSZ1) | _BV(UCSZ0);
}
(notera bortmarkeringen av RXCIE)

serial.h:

Kod: Markera allt

#ifndef INC_SERIAL_H
#define INC_SERIAL_H

void ser_init(void);

#endif/*INC_SERIAL_H*/
main.c (som den blev efter alla bortkommenteringar):

Kod: Markera allt

#include <avr/io.h>
#include <avr/delay.h>
#include <avr/wdt.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

#include "servo.h"

int main(void)
        ser_init();

        for(;;) {
                UDR = 0x55;
                _delay_ms(250);
        }

        return 0;
}
'make' output:

Kod: Markera allt

make -k clean all load
rm -f *.o *.map *.out
avr-gcc -g -mmcu=attiny2313 -Wall -save-temps -Wstrict-prototypes -Os -mcall-prologues -DF_CPU=4000000UL   -c -o main.o main.c
avr-gcc -g -mmcu=attiny2313 -Wall -save-temps -Wstrict-prototypes -Os -mcall-prologues -DF_CPU=4000000UL   -c -o serial.o serial.c
avr-gcc -g -mmcu=attiny2313 -Wall -save-temps -Wstrict-prototypes -Os -mcall-prologues -DF_CPU=4000000UL -o servo.out -Wl,-Map,servo.map main.o serial.o
avr-objcopy -R .eeprom -O ihex servo.out servo.hex
avrdude -c dapa -p t2313 -e -U flash:w:servo.hex -qqq

Compilation finished at Sun Jan 15 22:49:56
Ser något konstigt ut i detta? Hur kan bitlängderna bli 10ms långa i denna kod?
Ska man definera något utöver -mmcu=attiny2313 för att avr's .h-filer ska laddas rätt? Jag kan nämligen inte använda t.ex. UBRR istället för UBRRL å UBRRH, men den deklareras i io2313.h.
Jag måste ha missat något fatalt... Ska jämföra binärt mellan de två projekten så länge å se var det skiter sig. ;)

Mvh
speakman

Postat: 15 januari 2006, 23:14:36
av PaNiC
Notera att fusen "dela klockfrekvensen med åtta internt" är på by default.
Har du fixat detta? :)

Postat: 15 januari 2006, 23:17:35
av karlstedt
Vilken µC använde du förut?
Ställt om intern oscillator till rätt frekvens?

Postat: 15 januari 2006, 23:22:41
av speakman
Attans, glömde säga det. Har inte ställt om något alls i processorn! (Använde f.ö. exakt samma processor i förra projektet.)
Så här ser "fuse":arna ut:

Kod: Markera allt

>>> r lfuse
0000  62                                                |b               |
>>> r hfuse
0000  df                                                |.               |
>>> r efuse
0000  ff                                                |.               |
Fick för mig av databladet att köra processorn utan "prescaler" kunde skapa problem vid start? Bör jag ändå köra utan? (Eller *kan* snarare)
EDIT: Vilken hastighet bör jag köra i isåfall? Antog att den gick i 4MHz "by default". Läste om fuse:arna, men blev lite "skrämd", och förstod heller inte med säkerhet hur dom bör ställas.

Mvh
speakman

Postat: 15 januari 2006, 23:25:25
av karlstedt
Vilken frekvens tror du att du kör i och vilken BAUD-rate är det du vill ha/försöker sätta?

Postat: 15 januari 2006, 23:26:52
av speakman
Jag antog att den gick i 4MHz, och jag avser 9600baud.

Mvh
speakman

Postat: 15 januari 2006, 23:28:27
av karlstedt
Jag skulle tippa på att du kör i 1MHz och då ger det 2400 BAUD...

EDIT: öhm... elle, ja.. 4800 om du kör 2X...

Postat: 15 januari 2006, 23:32:45
av speakman
Får inte in något där heller. Men om bitlängden är 20ms, så går det 50 bitar/sek. Alltså 50baud. Går det ens med AVR?! :D

Mvh
speakman

Postat: 15 januari 2006, 23:36:14
av speakman
Hur bör fuse:arna stå för att få 4MHz (eller än heller 8MHz om det nu inte ställer till något)?

Postat: 15 januari 2006, 23:37:35
av sodjan
> Läste om fuse:arna, men blev lite "skrämd", och förstod heller
> inte med säkerhet hur dom bör ställas.

Låter som om det är här som "problemet" sitter... :-)

Postat: 15 januari 2006, 23:39:20
av karlstedt
EDIT:

Stopp ett tag här nu :)
jag sitter och läser i databladet för mega48!!!

det är inte helt rätt antar jag.... sorry..
måste lägga mig tidigt idag märker jag

Postat: 15 januari 2006, 23:43:16
av speakman
sodjan:
Förvisso, men jag tycker inte det bör ge sån markant skillnad. Jag kör dessutom med exakt samma "fuses" i båda projekten, varav ena fungerar (på samma processor). Hittar inget som skiljer dessa åt!

karlstedt:
Jag använder avrdude. Jag måste sätta hela fusen i det programmet, så jag hoppas jag inte förstör nån annan del. Verkar känsligt det dära. :D
Ska göra ett försök dock!

Tack så länge!

Mvh
speakman

Postat: 15 januari 2006, 23:45:29
av karlstedt
Ehm.. hoppas du inte har satt om dom isf...
se min edit :oops:

Postat: 15 januari 2006, 23:45:38
av speakman
Något som också förvirrar mig är varför inte UBRR går att använda? Den defineras ju i io2313.h och borde ju fungera. Om man läser io.h så läser den in ioXXXX.h beroende på vad som är definerat. Jag antar att dessa defineras av kompilatorn m.h.a. --mmcu

Mvh
speakman

Postat: 15 januari 2006, 23:50:41
av speakman
Har kollat i databladet, och vad jag kan se så bör lfuse (=0x62) betyda 4MHz, om jag tolkar det rätt?