Stránka 1 z 1
Vyvolání přerušení u x51
Napsal: 13 bře 2025, 22:34
od martinkopp
Pokud někde v programu softwarově nastavím flag RI nebo TI (pomocí setb TI) indikující přerušení od příjmu/vysílání po UARTU, vyvolá to následně skok do rutiny obsluhy přerušení nebo ne? Samozřejmě že ta přerušení jsou povolena.
Já už tyhle MCU moc nepoužívám, takže si takové detaily nepamatuju a momentálně to bohužel nemám jak vyzkoušet.
Napsal: 14 bře 2025, 08:50
od petrfilipi
U Microchipu si pamatuji na větu :"Na konci rutiny vyhodnocující přerušení je nutné smazat příznak přerušení ještě před tím, něž opět povolíte globálně vyhodnocování přerušení, jinak dojde opět ke skoku do rutiny přerušení".
Takže za mě, naslepo a bez záruky, dojde ke skoku do rutiny přerušení při nastavení flagu přerušení.
PF
Napsal: 14 bře 2025, 10:57
od Celeron
Koukám do chytrý knihy a píšou:
Přerušení od UARTu je buď HW funkcí OR od signálu RI nebo TI nebo SW nastavením příznaků. Příznaky se musí SW nulovat.
Napsal: 14 bře 2025, 12:42
od Zmije
Jestli si to ještě pamatuji, tak by to mělo být nějak takto. Jo na konci obsluhy přerušení se musí použít RETI (nikoliv RET).
Kód: Vybrat vše
; Příklad pro 8051 s přerušovacími vektory
;
; Standardní tabulka přerušovacích vektorů 8051:
; RESET : 0000h - Restart/Reset
; INT0 : 0003h - Externí přerušení 0
; Timer0 : 000Bh - Přerušení Timer 0
; INT1 : 0013h - Externí přerušení 1
; Timer1 : 001Bh - Přerušení Timer 1
; UART : 0023h - Přerušení sériového portu (UART)
;
; Vektorové adresy jsou pevně dány a ISR rutiny jsou na těchto adresách
ORG 0000h
ljmp MAIN ; Skok na začátek hlavního programu po resetu
; Vektor přerušení UART na adrese 0023h
ORG 0023h
ljmp UART_ISR
ORG 0100h
MAIN:
; Inicializace Timer1 pro generování baud rate
mov TMOD, #20h ; Timer1: režim 2 (8-bitový auto-reload)
mov TH1, #0FDh ; Nastavení pro 9600 baud při 11.0592 MHz
mov SCON, #50h ; UART: režim 1 (8 bitů), povolení příjmu (REN=1)
setb TR1 ; Spuštění Timer1
; Povolení přerušení
setb ES ; Povolení UART přerušení
setb EA ; Globální povolení přerušení
MAIN_LOOP:
sjmp MAIN_LOOP ; Nekonečná smyčka hlavního programu
;---------------------------------------------------------
; UART ISR - obsluha přerušení sériového portu
;---------------------------------------------------------
UART_ISR:
jb RI, UART_receive ; Pokud je nastaven příznak RI (příjem dat)
jb TI, UART_transmit ; Pokud je nastaven příznak TI (vysílání dat)
reti ; Návrat z přerušení, pokud není žádný flag
UART_receive:
clr RI ; Ruční vymazání příznaku RI
mov A, SBUF ; Načtení přijatého znaku z UART registru SBUF
; Zde lze přijatý znak dále zpracovat, např. uložit do paměti
reti ; Návrat z ISR
UART_transmit:
clr TI ; Ruční vymazání příznaku TI
; Zde lze připravit další znak k odeslání, např. vložit do SBUF
reti ; Návrat z ISR
Ještě nějaké emulátory, aby to šlo vyzkoušet:
https://sourceforge.net/projects/mcu8051ide/
https://github.com/jarikomppa/emu8051
https://www.edsim51.com/
Napsal: 14 bře 2025, 16:43
od martinkopp
Jo, to RI a TI se musí nulovat ručně, to vím. x51 sdílí poněkud nešťastně stejný vektor preřušení pro příjem a vysíláni UARTu, SPI a kdoví čeho ještě, takže v rutině obsluhy preřušení se musí podle těchto flagů zjistit co ho vlastně vyvolalo. RET a RETI je prakticky to samé, vybere adresu ze stacku a nahraje ji do program counteru. RETI navíc ještě k tomu povolí dané přerušení.
Mi šlo jen o to, co se stane pokud nastavím flag RI někde v programu. Nikde v DS jsem to nenašel, takže budu veřit Celeronově chytré knize a počítat s tím, že takto přerušení skutečně vyvolám. Dík moc.
Napsal: 14 bře 2025, 17:13
od Celeron
Je to z knihy Architektura a technické vlastnosti jednočipových mikrořadičů 8051, Tesla Eltos 1987. Snad to přečteš.