UART s přerušením atmega8
Napsal: 03 kvě 2020, 10:28
Ahoj,
už nevím kudy kam, mám tu úplně triviální program pro příjem po UARTu a někde mám něco blbě.
Když mám verzi bez přerušení a volání rutiny pro výpis z UDR do registru provozuji v hlavní smyčce, vše funguje. Vlastně to čte UDR pořád za běhu programu hlavní smyčky.
ALE jak to udělám systémem přerušení, tj že při příjmu Rx vyvolám přerušení, které mě odkáže na výčet UDR do registru a zpět do hlavní smyčky, tak mi to přečte data jen jednou a při dalším příjmu dat to absolutně nic nedělá. Jako by se mi UDR nevyprázdnilo a tak nepřijme další hodnoty.
Už nevím co a jak, tak prosím o radu. Ti, co mne chtějí odkázat na datasheet, tak z toho jsem to prostě nepochopil, nejsem znalec AJ a google překladač to jako vždy kazí.
už nevím kudy kam, mám tu úplně triviální program pro příjem po UARTu a někde mám něco blbě.
Když mám verzi bez přerušení a volání rutiny pro výpis z UDR do registru provozuji v hlavní smyčce, vše funguje. Vlastně to čte UDR pořád za běhu programu hlavní smyčky.
ALE jak to udělám systémem přerušení, tj že při příjmu Rx vyvolám přerušení, které mě odkáže na výčet UDR do registru a zpět do hlavní smyčky, tak mi to přečte data jen jednou a při dalším příjmu dat to absolutně nic nedělá. Jako by se mi UDR nevyprázdnilo a tak nepřijme další hodnoty.
Už nevím co a jak, tak prosím o radu. Ti, co mne chtějí odkázat na datasheet, tak z toho jsem to prostě nepochopil, nejsem znalec AJ a google překladač to jako vždy kazí.
Kód: Vybrat vše
.NOLIST
.INCLUDE "m8def.inc"
.LIST
.def reg=R16
.def reg2=r17
.EQU DATAIND=DDRD
.EQU LEDD=DDRC
.EQU DATAIN=PORTD ;RX DATA
.EQU LED=PORTC ;PC0-PC4 LED
.cseg
.org $0
rjmp ini
.org $00b
rjmp USART_Receive
Ini: ldi reg, 0b00000000
out DATAIND, REG
ldi reg, 0b11111111
out LEDD, reg
out LED, reg
ldi reg, 0b00000000
out DATAIN, REG
ldi reg,LOW(RAMEND)
out SPL,reg
ldi reg,HIGH(RAMEND)
out SPH,reg
; Set baud rate
ldi reg, 51
ldi reg2, 0
out UBRRH, reg2
out UBRRL, reg
; Enable receiver and transmitter
ldi reg, (1<<RXEN)|(1<<RXCIE)
out UCSRB, reg
; Set frame format: 8data, 1stop bit
ldi reg, (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1)
out UCSRC, reg
ldi reg, 0b00000000
out led, reg
rcall time2s
ldi reg, 0b11111111
out led, reg
sei
;----------------- Vektory přerušení ----------------------
START:
out led, reg
rjmp start
USART_Receive:
sbis UCSRA, RXC
rjmp USART_Receive
in reg, UDR
rjmp start
time2s:
; =============================
; delay loop generator
; 16000000 cycles:
; -----------------------------
; delaying 15999993 cycles:
ldi R20, $53
WGLOOP0: ldi R21, $FB
WGLOOP1: ldi R22, $FF
WGLOOP2: dec R22
brne WGLOOP2
dec R21
brne WGLOOP1
dec R20
brne WGLOOP0
; -----------------------------
; delaying 6 cycles:
ldi R20, $02
WGLOOP3: dec R20
brne WGLOOP3
; -----------------------------
; delaying 1 cycle:
nop
; =============================
ret