Forum: Mikrocontroller und Digitale Elektronik große probleme bei serieller übertragung


von andrea (Gast)


Lesenswert?

hallo leute!habt ihr eine idee, wie man die serielle übertragung am
besten löst? ich verwende einen atmega32 und die programmiersoftware
ist codevisionavr. ich hab schon das programm versucht,dass im
datenblatt steht. aber leider funktioniert dies nicht.

void USART_Transmit()
{
  while ( !( UCSRA & (1<<UDRE)) );
            UDR = '3';
}

dies funktioniert aber nicht, da ich UDRE nicht ansprechen kann.ich hab
herausgefunden, dass man das bit UDRE bei mir nur mit UCSRA.5 ansprechen
kann.weil es ja im UCSRA register das 5. bit ist.
dann hab ich es so probiert:

void USART_Transmit1()
{
  while ( !( UCSRA & (1<<UCSRA.5)) );
  UDR = 3;

}

aber beim simulieren geht er einfach nicht aus der while schleife
heraus.

ich versuch es schon seit ein paar wochen.aber im internet find ich
immer die programme vom datenblatt, die bei anderen funktionieren,aber
bei mir nicht
habt ihr vl eine idee wie ich das machen kann?

mfg
andrea

von Sebastian (Gast)


Lesenswert?

versuch mal statt UCSRA.5 einfach nur 5 zu schreiben also:

while ( !( UCSRA & (1<<5)) );

vielleicht ist es das gleiche vielleicht auch nicht.

mit dem "1<<??" erzeugt man eine bitmaske wenn ich das richtig
deute.
soll heißen 1(setze bit)<< an Position ?? im Byte

von andrea (Gast)


Lesenswert?

naja, i hab das auch so ausprobiert:

void USART_Transmit()
{
  while (!(UCSRA & 0x20));
            UDR = '3';
}

die 8 bit hab ich aufgeteilt, vier und vier, das fünfte bit ist 1..also
0x20 in hex...
aber so gehts a net...

so hab i die bitmaske selber geschrieben
das UBRE bit muss auf 1 sein, damit ich senden kann oder so.
so hab ichs vom datenblatt. zumindest hab i des so verstanden.

von Rahul (Gast)


Lesenswert?

dann musst du im Simulator das entsprechende Bit mal setzen...
Erklärung zu "1<<UDRE":

UDRE ist ein Makro oder eine konstante. In diesem Fall steht UDRE für
5.
1<<5 bedeutet, dass die 1 um 5 Stellen nach links verschoben wird (oder
auch 2^5=32 bzw 0x20)
Ich vermute in deinem Simulator muß das Bit gesetzt werden, da es ja
"UART Data Register enabled" oder so ähnlich heisst.
Das UDRE-Bit wird gesetzt, wenn der Transmit-Puffer der UART leer ist,
als Zeichen, dass das nächste Byte übertragen werden kann.
Im Normalfall muss man noch TXEN und RXEN im UCR (oder so) gesetzt
werden, um eine Übertragung überhaupt erst zu ermöglichen.
Steht aber eigentlich alles im Datenblatt...

von andrea (Gast)


Lesenswert?

das UDRE-bit ist im simulator gesetzt bzw. es ist dort angehackelt. aber
es kommt einfach aus der while schleife net raus.

d.h. i sollt UDRE mit 5 ersetzen.
TXEN also das senden ist bei mir durch einen Codegenerator schon
automatisch gesetzt worden, sowie ich die Baudrate, Bits, usw..
das hab ich nur auswählen brauchen und er hat es mir als HEX Code
hingeschrieben.

von andrea (Gast)


Lesenswert?

hi!
das mit dem ausbessern mit 5 geht leider a net. das UDRE bit wird nach
einiger zeit nicht zurückgesetzt. macht das der µC automatisch oder
muss i des mittels programmieren nachhelfen?

Mff

von Sven (Gast)


Lesenswert?

Hallo,

wenn UDRE, also das 5. Bit im UCSRA Register, gestzt ist heißt es, dass
das UDR Register leer ist und das nächste Byte reingeschrieben werden
kann.
Die Schleife sollte also verlassen werden, wenn UDRE 1 ist.

UDRE zurücksetzen würde nichts bringen bzw. macht der proc selbst, wenn
UDR voll ist.

Gruß, Sven

von Dominik (Gast)


Lesenswert?

Hast du es mal im Live-System getestet? Ich hab damals beim Simulieren
feststellen müssen dass ich das Byte abholen muss bevor ich aus while
wieder rauskomme. Bei mir gings allerdings ums empfangen in einem IRQ,
vielleicht ist es bei dir ja ähnlich. Auf dem Target war das dann kein
Problem mehr.

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.