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.