Forum: Mikrocontroller und Digitale Elektronik Zahl >1Byte über USART-Interrupt auswerten


von BerndB (Gast)


Lesenswert?

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

von Oliver J. (skriptkiddy)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Andreas V. (tico)


Lesenswert?

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

von BerndB (Gast)


Lesenswert?

Ich werde also die Interrupts mitzählen!
danke euch.

von spess53 (Gast)


Lesenswert?

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