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