Forum: Mikrocontroller und Digitale Elektronik Mehrfachabfrage des Uart


von Jürgen (Gast)


Lesenswert?

Hallo,

ich habe folgendes Problem ich will den Uart im Programmverlauf zweimal 
Abfragen, sodaß ich wenn ich im PC die erste Zahl eingebe ins erste 
Unterprogramm komme und beim 2 Mal ins weitere. Bei meinem Programm 
springt er ins erste und dann wieder zurück.

Vielen Dank im vorraus !!!

Jürgen


.include "4433def.inc"
.def temp = r16
.def data = r17
.def send = r18
.def ver = r19
.def tes = r21
.def qc = r22
; .equ quartz = 3686400 ; für Standard STK500
.equ quartz = 4000000 ; für 4 MHz
.equ baud = 9600 ; Baudrate




rjmp reset           ; Reset Handler
reti                 ; IRQ0 Handler
reti                                 ; IRQ1 Handler
reti                 ; Timer1 Capture Handler
reti                 ; Timer1 compare Handler
reti                 ; Timer1 Overflow Handler
reti                 ; Timer0 Overflow Handler
reti                 ; SPI Transfer Complete Handler
rjmp receive         ; UART RX Complete Handler : RXCIE
reti                 ; UDR Empty Handler
reti                 ; UART TX Complete Handler
reti                 ; ADC Conversion Complete Interrupt Handler
reti                 ; EEPROM Ready Handler
reti                 ; Analog Comparator Handler

reset:
    ldi temp, RAMEND
    out SP, temp    ; set stack pointer

    sbi UCSRB, RXCIE  ; enable receive completed interrupt
    sbi UCSRB, TXEN   ; enable transmit
    sbi UCSRB, RXEN   ; enable receive
    ldi temp, quartz / (baud * 16) - 1
    out UBRR, temp    ; BAUD Rate 9600

    sei ; interrupts generell aktivieren

main:
    loop:
        rjmp loop


;--------------------------------------------------
receive:

    out DDRB, r20
    ldi ver, $38

    in data, UDR

    cp data,ver
    breq version

    ldi send, 13  ; CR
    rcall transmit
    ldi send, 10  ; LF
    rcall transmit
    ldi send, 'A'
    rcall transmit

reti


;--------------------------------------------------
transmit:
  sbis UCSRA,UDRE   ; Warten, bis UDR bereit ist
    rjmp transmit
    out UDR, send
reti

version:
    ldi send, 'B'
    rcall transmit

   ldi qc, $37
    in tes, UDR

    cp tes,qc
    breq well
reti

well:



    ldi send, 'l'
    rcall transmit
    mov send, data
    rcall transmit
reti

von thkaiser (Gast)


Lesenswert?

Wenn ein Zeichen empfangen wurde, springt der Prozessor in den 
Interrupt, liest das UDR und vergleicht den Inhalt mit "ver", also r19. 
Abgesehen davon, daß r19 nirgendwo mit einem Wert definiert wird, würde 
bei Gleichheit SUB version angesprungen, dort wird dann das UDR nochmals 
abgefragt (in tes,UDR). Und da ist ein Problem: Du mußt nochmal den 
Status des UART abfragen und warten, bis das 2. Byte auch da ist.
Insgesamt würde ich eine solche Abfrage nicht in den Interrupt legen.

von Jürgen (Gast)


Lesenswert?

Wie frage ich denn den Status nochmal ab ich dachte mit

in tes, UDR

oder wie wüdest Du das ohne Interrupts lösen?


Vielen Dank im vorraus!!!

Jürgen

von thkaiser (Gast)


Lesenswert?

Hi,

Das Bit 7 im UCSRA ("RXC" = UART Receive Complete, Seite 57 im 
Datenblatt) wird bei einem empfangenen Zeichen gesetzt und läßt sich mit 
einem Skip-Befehl abfragen. Außer dem Interrupt ist die Initialisierung 
die Gleiche, wie bei Dir.

.
.
.
warte_1:
     sbis UCSRA,RXC
     rjmp warte_1
     in byte_1,UDR
.
.
.
warte_2:
     sbis UCSRA,RXC
     rjmp warte_2
     in byte_2,UDR
.
.
.

Das RXC wird übrigens durch Lesen des UDR automatisch gelöscht.
Den Interrupt kannst Du Dir in diesem Fall komplett sparen.

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.