Hallo, ich sende aus meiner SW ein High- und LowByte und empfange es mit meinem ATmega32 via USART-Interrupt. Allerdings funktioniert das nicht mit Zahlen >1 Byte. Wie stelle ich es an um Werte bis 512 auszuwerten? Vielen Dank! RESET_START: LDI temp, LOW(RAMEND) OUT SPL, temp LDI temp, HIGH(RAMEND) OUT SPH, temp //outputs LDI temp, 0xFF OUT DDRA, temp LDI temp, 0x0F OUT DDRC, temp // init Interrupts LDI temp, (1<<ISC01) | (1<<ISC11) OUT MCUCR, temp LDI temp, (1<<INT0) | (1<<INT1) OUT GICR, temp //InitUSART CLR temp OUT UBRRH, temp LDI temp, ((CLOCK/4000000)-1) OUT UBRRL, temp LDI temp, (1<<URSEL)|(3<<UCSZ0)|(1<<USBS) OUT UCSRC, temp IN temp, UDR CLR temp OUT UCSRA, temp SBI UCSRB, RXCIE SBI UCSRB, RXEN SEI loop: RJMP loop //Interrupt USART_RXC: in R4, HIGH(udr) in R5, LOW(udr) //rcall binBCD OUT PORTA, R3 OUT PORTC, R2 RETI
Das UDR ein high-byte hat, ist mir neu. Falls du an das 8. Datenbit heran möchtest, geht der Weg über ein "UART Control and Status Register". Schau dazu am besten mal ins Datenblatt: USART-->Register Description Gruß Skriptkiddy
1 | USART_RXC:
|
2 | in R4, HIGH(udr) |
3 | in R5, LOW(udr) |
4 | |
5 | //rcall binBCD
|
6 | |
7 | OUT PORTA, R3 |
8 | OUT PORTC, R2 |
9 | |
10 | RETI
|
Du musst schon warten, bis beide Bytes da sind! Wenn 2 Bytes daherkommen, werden auch 2 Interrupts ausgelöst. Für jedes einer. Das heißt du zählst mit, der wievielte Interrupt es ist und bei jeweils jedem 2.ten sind beide Bytes da. Das jeweils andere musst du eben in der Zwischenzeit irgendwo zwischenspeichern. in R4, HIGH(udr) in R5, LOW(udr) darüber schweigen wir mal lieber.
BerndB schrieb: > in R4, HIGH(udr) > in R5, LOW(udr) Dein UDR ist nur 8 bit lang. Folglich ist obiges Unsinn. Zahlen, die länger als 8 bit sind, müssen in 8 bit große Stücke zerlegt und nacheinander empfangen und wieder zusammengesetzt werden. Gruss Andreas
Hi Der ATMega32 kann auch 9 Datenbits auf einmal empfangen. Wenn der Sender das auch kann, lassen sich Werte von 0...511 auch in einem Rutsch übertragen. MfG Spess
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.