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š.