ATtiny2313 USART - konstig baudrate

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

ATtiny2313 USART - konstig baudrate

Inlägg 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
Användarvisningsbild
PaNiC
Inlägg: 2610
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

Notera att fusen "dela klockfrekvensen med åtta internt" är på by default.
Har du fixat detta? :)
Användarvisningsbild
karlstedt
EF Sponsor
Inlägg: 966
Blev medlem: 14 oktober 2003, 16:55:23
Ort: Lund
Kontakt:

Inlägg av karlstedt »

Vilken µC använde du förut?
Ställt om intern oscillator till rätt frekvens?
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg 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
Senast redigerad av speakman 15 januari 2006, 23:26:16, redigerad totalt 2 gånger.
Användarvisningsbild
karlstedt
EF Sponsor
Inlägg: 966
Blev medlem: 14 oktober 2003, 16:55:23
Ort: Lund
Kontakt:

Inlägg 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?
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Jag antog att den gick i 4MHz, och jag avser 9600baud.

Mvh
speakman
Användarvisningsbild
karlstedt
EF Sponsor
Inlägg: 966
Blev medlem: 14 oktober 2003, 16:55:23
Ort: Lund
Kontakt:

Inlägg 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...
Senast redigerad av karlstedt 15 januari 2006, 23:32:54, redigerad totalt 1 gång.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg 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
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg 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)?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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... :-)
Användarvisningsbild
karlstedt
EF Sponsor
Inlägg: 966
Blev medlem: 14 oktober 2003, 16:55:23
Ort: Lund
Kontakt:

Inlägg 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
Senast redigerad av karlstedt 15 januari 2006, 23:44:42, redigerad totalt 1 gång.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg 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
Användarvisningsbild
karlstedt
EF Sponsor
Inlägg: 966
Blev medlem: 14 oktober 2003, 16:55:23
Ort: Lund
Kontakt:

Inlägg av karlstedt »

Ehm.. hoppas du inte har satt om dom isf...
se min edit :oops:
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg 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
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Har kollat i databladet, och vad jag kan se så bör lfuse (=0x62) betyda 4MHz, om jag tolkar det rätt?
Skriv svar