mikrocontroller.net

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


Autor: andrea (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: andrea (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: andrea (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: andrea (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dominik (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.