Forum: Compiler & IDEs atmega32 - uart -


von Tobias (Gast)


Lesenswert?

Hallo Forum,

ich bin neu hier und habe eine Frage zum UART beim Atmega32. Ich weiß, 
leidiges Thema. Das Problem bei mir ist jedoch nicht, dass es nicht 
funktioniert, sondern, dass es mich verwirrt wie es funktioniert. Ich 
benutze unten stehenden Codeabschnitt zur Initialisiertung und zum Test 
des UART.

Laut Avr-Gcc-Tutorial müsste der Modus(?) auf 8N1 gesetzt sein. Wenn ich 
aber in meinem Terminalprogramm(GtkTerm) 8N1 einstelle, kommt nur Quark 
raus. Stelle ich das aber auf 7N1 funktioniert alles perfekt. Ich 
verstehe nicht warum das so ist?

Ach ja, Baudrate ist 9600 und Frequenz 16MHz.


1
  UBRRH=0;
2
  UBRRL=103;
3
  UCSRB |= (1<<TXEN);                            
4
  UCSRC |= (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); // Asynchron 8N1 
5
  
6
7
  while(1)
8
  {
9
    while (!(UCSRA & (1<<UDRE)))  
10
    {
11
    }
12
    UDR = 'a'; 
13
    while (!(UCSRA & (1<<UDRE)))  
14
    {
15
    }
16
    UDR = 'b'; 
17
    setGreen(1);
18
  }

Gruß Tobias

von Tobias (Gast)


Lesenswert?

ach mist vergessen, ignoriert das "setGreen(1);"

von Johannes M. (johnny-m)


Lesenswert?

Warum beschreibst Du die Steuerregister mit "|="? Lass das "|" weg.

Ansonsten: Wie sieht es mit Taktquelle und so aus? Quarz?

von Tobias (Gast)


Lesenswert?

Ok, ich hab die das "|" rausgenommen, keine Veränderung. Bin noch nicht 
so fit mit C.

Taktquelle ist ein Quarz. Fuses sind korrekt gesetzt.

von Johannes M. (johnny-m)


Lesenswert?

Tja, also die Einstellungen sind lt. Datenblatt offensichtlich 
tatsächlich korrekt. An obigem Code liegt es also wahrscheinlich 
nicht...

von Johannes M. (johnny-m)


Lesenswert?

Tobias wrote:
> Ok, ich hab die das "|" rausgenommen, keine Veränderung. Bin noch nicht
> so fit mit C.
Mit dem "|=" werden eventuell bereits gesetzte Bits beibehalten. Wenn am 
Register sonst noch nichts gemacht wurde, sollten zwar alle Bits 0 sein, 
aber sicher ist sicher. In so einem Fall ist das "|=" nicht ratsam 
(zumal es auch noch mehr Code erzeugt als ein einfaches "=").

von 900ss (900ss)


Lesenswert?

Wenn Du hast, nimm einen Ossi und messe mal die Bitzeit, sollte bei 9600 
Baud 104us sein.
Dann sende ein 'U' = 0x55 = 0b01010101.
Es sollte also 4 Null-Bits und 4 EINS-Bits + Startbit und Stopbit 
erscheinen.
Wenn er tatsächlich nur 7 Bits übertragt, dann fehlt ein Null-Bit.

Gruß 900ss

von Johannes M. (johnny-m)


Lesenswert?

900ss D. wrote:
> Wenn Du hast, nimm einen Ossi
Das ist Diskriminierung! Oder meinst Du, ein Ossi kann das besser, als 
ein Wessi?

von 900ss (900ss)


Lesenswert?

Johannes M. wrote:
> 900ss D. wrote:
>> Wenn Du hast, nimm einen Ossi
> Das ist Diskriminierung! Oder meinst Du, ein Ossi kann das besser, als
> ein Wessi?

Klaro. Zeig mir einen Wessi, der so kurze Bitzeiten messen kann. Ein 
Ossi schafft das locker.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

900ss D. wrote:

> Klaro. Zeig mir einen Wessi, der so kurze Bitzeiten messen kann. Ein
> Ossi schafft das locker.

Dann müsste es aber heissen

>> Dann sende ein 'U' = 0x58 = 0b01011000.

SCNR

von Tobias (Gast)


Lesenswert?

Ne, ein Oszilloskop hab ich leider nicht. Gibts noch andere Vorschläge?

von Tobias (Gast)


Lesenswert?

Ok, anscheinend gibt es ein Problem bei der Spannungsversorgung. Ich 
werde versuchen das zu korriegieren und melde mich dann nochmal.

von Tobias (Gast)


Lesenswert?

Alles klar. Problem gelöst. Es lag tatsächlich an einer falschen 
Spannungsversorgung. Danke für eure Hilfe!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.