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
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
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.
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...
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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.