Struktura a architektura počítačů Systémová struktura počítače Instrukční soubor II Příklady návrhu České vysoké učení technické Fakulta elektrotechnická Ver.1.30 J. Zděnek / M. Chomát 2014
Assembler (Jazyk symbolických instrukcí) Assembler Jazyk symbolických instrukcí (též Jazyk symbolických adres) Nejbližší vyšší stupeň nad strojovým kódem Používá symbolická jména instrukcí, proměnných, konstant, adres paměti programu i dat Umožňuje využít všechny vlastnosti daného typu počítače a jeho instrukčního souboru Nekontroluje téměř žádné nedovolené (nevhodné) kroky programátora (rozdíl od vyšších programovacích jazyků JAVA, C) Používá se v časové kritických částech programů, nebo tam kde danou operaci nelze naprogramovat ve vyšším jazyku V řídicích aplikací je typická kombinace částí programu v assembleru a částmi v jazyku C Program v assembleru je nepřenosný na jinou platformu, je vázaný na instrukční soubor určitého typu procesoru A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 2
Direktivy assembleru Direktivy assembleru umožňují: Řídit překlad Označit začátek programu Označit konec programu Určit umístění programu v paměti programu Určit umístění proměnných v paměti dat Založit symbolická jména zvolených míst v programu (adres) Založit symbolická jména proměnných Zajistit inicializaci (nast. počáteční hodnoty) vybraných proměnných Založit symbolická jména konstant a nastavit jejich hodnoty Vkládat do programu konstanty v různých formátech (dec,hex,bin) Nastavit konfigurační bity počítače Vkládat (zatahovat) do programu další části programu ze souboru Označit části programu (moduly) symbolickým jménem (Makro) a pod timto jménem moduly v programu používat A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 3
Příklad (Tlačítko, LED, přerušení, časovač) Příklad návrhu Zadání: V asembleru mikropočítače pic18f87j11 napište program, který testuje zda bylo zmáčknuto tlačítko S1. Při každém zmáčknutí se rozsvítí vždy jedna další LED dioda počínaje diodou připojenou na nejnižší bit portu. Po osmi zmáčknutí S1 bude svítit všech 8 LED diod a při dalším mačkání tlačítka zůstávají všechny diody rozsvícené. Tlačítko je připojena na bit RB0 portu B. V klidové poloze (nezmáčknuto) je stav tlačítka snímán jako logická '1', po zmáčknutí se snímá logická '0'. Osm světelných diod je připojeno na port D. Pokud se na příslušný bit portu D vysílá logická '0', dioda nesvítí. Logická '1' vyslaná na bit portu D diodu rozsvítí. Pro řešení použijte vzorkování stavu tlačítka s periodou přibližně 200ms. Vzorkování tlačítka zorganizujte s využitím jednohladinového systému přerušení a časovače TIMER0. Časovač naprogramujte do 16bitového módu, s hodinami odvozenými od hodin procesoru. Použijte vhodnou hodnotu předděličky u časovače TIMER0. Činnost programu dle zadání zapište do ISR (Interrupt Service Routine), která budu volaná vždy po žádosti o přerušení od časovače TIMER0 (žádost se vyvolá po přetečení časovače z maximální hodnoty (samé '1') do nuly. Na pozadí programu (background) bude pouze prázdná nekonečná smyčka. A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 4
pic18f Family Interrupt System (Priority Mode) High Priority Enable GIEH HIGH PRIORITY Priority Encoder INTRQ LOW PRIORITY xip yip GIEL IPEN xie yie Priority System On xif yif Low Priority Enable INPUT Event Detector........ Clk Timer Interrupt Priority INTERRUPT RESOURCES Interrupt Enable Interrupt Flag (Request) A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 5
pic18f Family Interrupt System (Non Priority Mode) Input Interrupt Enable NON PRIORITY MODE IPEN = 0 All Interrupt Enable INTRQ PEIE GIE IPEN = 0 xie yie Non Priority Mode xif yif INPUT Event Detector........ Clk Timer Interrupt Enable INTERRUPT RESOURCES Interrupt Flag (Request) A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 6
Nastavení systému přerušení - RCON A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 7
Nastavení systému přerušení - RCON A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 8
Nastavení systému přerušení - INTCON A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 9
Nastavení systému přerušení - INTCON A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 10
Nastavení systému přerušení INTCON2 A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 11
Nastavení systému přerušení INTCON2 A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 12
Nepodmíněný skok, absolutní adresa A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 13
Nepodmíněný skok, relativní adresa A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 14
Nastavení bitu registru A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 15
Nulování bitu registru A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 16
Návrat z obsluhy přerušení (ISR) A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 17
pic18f Family Program Memory PROGRAM COUNTER PROGRAM MEMORY SP STACK POINTER Top of Stack -TOS 5 PC STACK 1 31 018AF4h 21 21 000000h 000008h 000018h RESET HIGH PRIORITY LOW PRIORITY RESET VECTOR HIGH PRIORITY INTERRUPT VECTOR LOW PRIORITY INTERRUPT VECTOR INTERRUPT VECTOR TABLE TOS REGISTERS TOSU 01h 8 TOSH 8Ah 8 TOSL F4h 8 TABLE READ IMPLEMENTED MEMORY (FLASH) 01FFF8h 01FFFFh CONFIG. WORDs PROGRAM MEMORY ADDRESS SPACE Read as 0 1FFFFFh 16 A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 18
pic18f Family Interrupt System (Non Priority Mode) Input Interrupt Enable NON PRIORITY MODE IPEN = 0 All Interrupt Enable INTRQ PEIE GIE IPEN = 0 xie yie Non Priority Mode xif yif INPUT Event Detector........ Clk Timer Interrupt Enable INTERRUPT RESOURCES Interrupt Flag (Request) A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 19
Nastavení systému přerušení - inicializace ORG 0x00000 Reset_vector: goto Start ORG 0x00008 Interrupt_vector: goto Timer0_int ; Program start ; Interrupt vector table/ ; (one item here only) DIREKTIVY INSTRUKCE PROMĚNNÉ KONSTANTY ORG 0x00100 Start: ; bsf INTCON, TMR0IE ; Timer0 interrupt enable bsf INTCON, GIE ; Non priority mode (IPEN=0 by default) ; Loop: ; Background loop nop ; do nothing bra Loop KOMENTÁŘ A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 20
Obsluha žádosti o přerušení (Timer0 overflow) ; TIMER0 ISR (Interrupt Service Routine) ; Timer0_int: ; Save context, only example, background empty here/ ; (no context) ; bcf INTCON, TMR0IF ; Clear intrerrupt flag (NECESSARY) ; ; ; ; Restore context ; retfie ; Return from interrupt DIREKTIVY INSTRUKCE PROMĚNNÉ KONSTANTY KOMENTÁŘ A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 21
Časovač Timer0 konfigurace 16bitů TIMER0 Overflow Interrupt Flag TMR0IF A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 22
Nastavení časovače Timer0, 16bitů A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 23
Nastavení časovače Timer0, 16bitů A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 24
Konstanta do střadače A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 25
Střadač do registru A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 26
Nastavení časovače Timer0, 16bitů #define TIMER0_FOSC_PRESC8_16bit b'00000010' DIREKTIVY INSTRUKCE movlw TIMER0_FOSC_PRESC8_16bit movwf T0CON ; Configure Timer0 bsf T0CON, TMR0ON ; Timer0 ON PROMĚNNÉ KONSTANTY KOMENTÁŘ A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 27
Programovatelné vstupní nebo výstupní porty LAT nebo PORT Výstupní registr TRIS Nastavení směru 0 -> Output 1 -> Input PORT Vstupní registr A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 28
Nastavení vstupních a výstupních portů A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 29
Nulování střadače nebo registru A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 30
Rotace vlevo bez přenosu A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 31
Test bitu a podmíněný skok A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 32
Registr do registru A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 33
Zapojení portu D a B (LED diody a tlačítka S1, S2) PORTD S1 PORTB bit RB0 A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 34
Programovatelné vstupní nebo výstupní porty LAT nebo PORT Výstupní registr TRIS Nastavení směru 0 -> Output 1 -> Input PORT Vstupní registr A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 35
Inicializace a obsluha portu D a B ; Initialization clrf reg ; reg = 0 clrf WREG ; WREG = 0 movwf TRISD ; PORTD -> all bits outputs, LEDs movwf PORTD ; PORTD = 00h -> LEDs off bsf TRISB, BIT0 ; PORTB.bit0 = input, push button S1 DIREKTIVY INSTRUKCE PROMĚNNÉ KONSTANTY Timer0_int: ; ISR action ; rlncf reg, 1 ; Rotate one bit left, destination reg btfss PORTB, RB0 ;? Pushbutton S1 pressed bsf reg, BIT0 ; Yes, insert '1' to LSB movff reg, LATD ; Output reg to port D (or PORTD), LEDs ; retfie ; Return from interrupt KOMENTÁŘ A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 36
Souhrn programování SFR pro tento program A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 37
Příklad (Tlačítko, LED, přerušení, časovač) Souhrn informací k řešení příkladu Zadání: V asembleru mikropočítače pic18f87j11 napište program, který testuje zda bylo zmáčknuto tlačítko S1. Při každém zmáčknutí se rozsvítí vždy jedna další LED dioda počínaje diodou připojenou na nejnižší bit portu. Po osmi zmáčknutí S1 bude svítit všech 8 LED diod a při dalším mačkání tlačítka zůstávají všechny diody rozsvícené. Tlačítko je připojena na bit RB0 portu B. V klidové poloze (nezmáčknuto) je stav tlačítka snímán jako logická '1', po zmáčknutí se snímá logická '0'. Osm světelných diod je připojeno na port D. Pokud se na příslušný bit portu D vysílá logická '0', dioda nesvítí. Logická '1' vyslaná na bit portu D diodu rozsvítí. Pro řešení použijte vzorkování stavu tlačítka s periodou přibližně 200ms. Vzorkování tlačítka zorganizujte s využitím jednohladinového systému přerušení a časovače TIMER0. Časovač naprogramujte do 16bitového módu, s hodinami odvozenými od hodin procesoru. Použijte vhodnou hodnotu předděličky u časovače TIMER0. Činnost programu dle zadání zapište do ISR (Interrupt Service Routine), která budu volaná vždy po žádosti o přerušení od časovače TIMER0 (žádost se vyvolá po přetečení časovače z maximální hodnoty (samé '1') do nuly. Na pozadí programu (background) bude pouze prázdná nekonečná smyčka. A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 38
Sdílené prostředky (sdílí je procedury) Souhrn informací k řešení příkladu A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 39
Dynamické přemapování a přímá adresa REMAPPING & SHORT DIRECT ADDRESS 000h DATA MEMORY 00h Souhrn informací k řešení příkladu BANK 0 05Fh 060h 5Fh 60h 0FFh 100h FFh 00h GPR ACCESS BANK 00h DISABLED (HIDDEN) BANK 1 BANK 14 EFFh F00h FFh 00h SFR WREG STATUS 8 5Fh 60h FFh BANK 15 F5Fh F60h WREG STATUS 5Fh 60h SPECIAL FUNCTION REGISTERS MEMORY MAPPED INPUT/OUTPUT SPACE FFFh 8 FFh REMAPPING A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 40
pic18f Family Program Memory SP STACK POINTER Top of Stack -TOS TOS REGISTERS 5 PC TOSU 01h PROGRAM COUNTER STACK 1 31 8 018AF4h TOSH 8Ah IMPLEMENTED MEMORY (FLASH) 8 TOSL F4h 21 21 8 000000h 000008h 000018h 01FFF8h 01FFFFh PROGRAM MEMORY RESET HIGH PRIORITY LOW PRIORITY CONFIG. WORDs Souhrn informací k řešení příkladu RESET VECTOR HIGH PRIORITY INTERRUPT VECTOR LOW PRIORITY INTERRUPT VECTOR INTERRUPT VECTOR TABLE TABLE READ PROGRAM MEMORY ADDRESS SPACE Read as 0 1FFFFFh 16 A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 41
pic18f Family Interrupt System (Non Priority Mode) Souhrn informací k řešení příkladu Input Interrupt Enable NON PRIORITY MODE IPEN = 0 All Interrupt Enable INTRQ PEIE GIE IPEN = 0 xie yie Non Priority Mode xif yif INPUT Event Detector........ Clk Timer Interrupt Enable INTERRUPT RESOURCES Interrupt Flag (Request) A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 42
Časovač Timer0 konfigurace 16bitů Souhrn informací k řešení příkladu TIMER0 Overflow Interrupt Flag TMR0IF A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 43
Zapojení portu D a B (LED diody a tlačítka S1, S2) Souhrn informací k řešení příkladu PORTD S1 PORTB bit RB0 A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 44
Programovatelné vstupní nebo výstupní porty Souhrn informací k řešení příkladu LAT nebo PORT Výstupní registr TRIS Nastavení směru 0 -> Output 1 -> Input PORT Vstupní registr A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 45
Celý program (Timer0 overflow interrupt) - 1 ; Press Explorer pic18 S1 pushbutton -> switch on next led on port D #include P18F87J11.inc CONFIG FOSC = HS CONFIG WDTEN = OFF CONFIG XINST = OFF #define TIMER0_FOSC_PRESC8_16bit b'00000010' #define BIT0 0 #define F 1 UDATA_ACS wreg_tmp: res 1 ; Program variables status_tmp: res 1 bsr_tmp: res 1 reg: res 1 DIREKTIVY INSTRUKCE PROMĚNNÉ KONSTANTY KOMENTÁŘ ORG 0x00000 Reset_vector: goto Start ORG 0x00008 Interrupt_vector: goto Timer0_int ; Program start ; Interrupt vectro table (one item here) A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 46
Celý program (Timer0 overflow interrupt) - 2 ORG 0x00100 Start: clrf reg ; reg = 0 clrf WREG ; WREG = 0 movwf TRISD ; PORTD -> all bits outputs, LEDs movwf PORTD ; PORTD = 00h, LEDs off bsf TRISB, BIT0 ; PORTB.bit0 = input, push button S1 movlw TIMER0_FOSC_PRESC8_16bit movwf T0CON ; Configure Timer0 bsf T0CON, TMR0ON ; Timer0 ON ; bsf INTCON, TMR0IE ; Timer0 interrupt enable bsf INTCON,GIE ; Non priority mode ; (IPEN = 0 by default) Loop: nop ; Do nothing, background loop bra Loop A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 47
Celý program (Timer0 overflow interrupt) - 3 ; === Timer0 overflow ISR (Interrupt Service Routine) === Timer0_int: movff STATUS, status_tmp ; Save context, only example movff WREG, wreg_tmp ; background empty here movff BSR, bsr_tmp ; (no context save necessary) bcf INTCON, TMR0IF ; Clear intrerrupt flag (IMPORTANT) rlncf reg, F ; Rotate one bit left btfss PORTB, RB0 ;? Pushbutton S1 pressed bsf reg, BIT0 ; Yes, insert '1' to lsb movff reg, LATD ; Output reg to port D (or PORTD), LEDs movff bsr_tmp, BSR movff wreg_tmp, WREG movff status_tmp, STATUS retfie ; Restore context ; Return from ISR, reenable interrupt END A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 48
Detektor posloupnosti bitů 110 (FSA typu Moore) Příklad návrhu Navrhněte synchronní konečný automat (FSA Finite State Automaton), který v proudu vstupních bitů detekuje posloupnost 110. Detekci každé takové posloupnosti automat indikuje na výstupu blikáním LED diody. V ostatních stavech automatu LED dioda svítí nepřerušovaně. Náběžná hrana x 1 indikuje na vstupu 1, náběžná hrana x 0 pak 0. Automat realizujte programovými prostředky a využitím hardwareové podpory. Použijte jednohladinový systém přerušení a časovač. Vstupy x 1 a x 0 se zadávají tlačítky s mechanickým kontaktem a odskoky při změně hodnoty. Program automatu musí odskoky filtrovat, sestavte a použijte filtrační algoritmus ( debounce circuit ). I (Inputs) x 1 x 0 clk FSA S i y O (Outputs) (Moore) A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 49
Detektor posloupnosti bitů 110 (FSA typu Moore) Příklad návrhu I (Inputs) x 1 x 0 FSA S i y O (Outputs) clk (Moore) clk x 1 x 0 1 1 0 0 1 1 0 y LED svítí bliká A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 50
Detektor posloupnosti bitů 110 (FSA typu Moore) Co máme navrhnout? Příklad návrhu Budicí funkce Stavový registr Logika výstupů D Q LKO1 LKO2 0 I C clk A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 51
Detektor posloupnosti bitů 110 (FSA typu Moore) Stavový diagram I Vstupy (Inputs) O Výstupy (Outputs) S i i-tý stav I 0 I 0 S 0 0 0 I 1 Příklad návrhu 0 1 S 3 I 0 S 1 0 0 Tabulka přechodů I 1 Tabulka výstupů S i I 0 I 1 S i O i S 0 S 0 S 1 S 1 S 0 S 2 I 0 S 2 0 0 I 1 S 0 O 0 S 1 O 0 S 2 S 3 S 2 S 2 O 0 S 3 S 0 S 1 I 1 S 3 O 1 A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 52
Dekompozice problému - 1 Příklad návrhu START ISR INITIALIZATION X1, X2 INPUT DEBOUNCE FSA STATE LOGIC BACKGROUND DO NOTHING FSA OUTPUT LOGIC RET 6ms TIME IF TCLK TIMER A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 53
Dekompozice problému - 2 DEBOUNCE ALGORITHM PRINCIPLE Příklad návrhu SHIFT LEFT BOUNCE IN 1 x x x x x 1 0 1 RAW INPUT AND AND SAMPLE MASK 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 XOR XOR 1 s MASK 0 0 0 0 0 1 1 1 0 s MASK 0 0 0 0 0 0 0 0? = 0? = 0 CLEAR 1 CLEAR 0? (i.e. LAST VALUE WAS 0 ) YES, INPUT IS 1 YES, INPUT IS 0 A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 54
Dekompozice problému - 3 Příklad návrhu FSA STATE LOGIC I 0 SWITCH S 0 0 0 I 0 I 1 STATE 0 STATE 1 STATE 2 STATE 3 0 1 S 3 I 0 S 1 0 0 I 1 RET I 0 S 2 0 0 I 1 I 1 A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 55
Dekompozice problému - 4 Příklad návrhu FSA OUTPUT LOGIC SW TIMER - + T LED - +? 110 LED ON LED TOGGLE (300ms) RET A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 56
Detektor 110 Hlavička programu ; File: BSD3_110.asm Příklad návrhu ; Date: 04.04.2010 ; Version: 1.00 ; HW: Explorer pic18f87j11 ; IDE: MPLAB 7.50 ; Author: J.Z.; Institute: CTU in Prague, EEF Dept.13114 ; Function: Bitstream '110' detector, Moore type FSA ; Pushbutton S1 = input '1', pushbutton S2 = input '0' ; Program detects leading edge of S1, S2 pushbuttons ; FSA outputs: ; LED1,0 = FSA state_register ; LED7 = ON - no '110' bitstream detected ; LED7 = TOGGLE (approx 300 ms) - '110' bitstream detected ; Note: Pushbuttons S1, S2 are debounced (3 conscutive equal bits required) ; to be correct value detected ; Debounce S1, S2 pushbuttons routines detect leading edge only A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 57
Detektor 110 Konfigurace a konstanty Příklad návrhu #define DBG_MODE ; Conditional translation (simulator dbg) #include P18F87J11.inc CONFIG FOSC=HS CONFIG WDTEN=OFF CONFIG XINST=OFF #define F 1 #define BIT0 0 #define TIMER0_FOSC_PRESC8_16bit b'00000010' #define TIMER0_FOSC_PRESC64_8bit b'01000101 ; 6,6 ms, FOSC = 10 MHz A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 58
Detektor 110 Proměnné a konstanty Příklad návrhu UDATA_ACS ; Program variables ; Save context registers wreg_tmp: res 1 status_tmp: res 1 bsr_tmp: res 1 reg: res 1 ; FSA Moore variables and constants #define STATE_0 0 #define STATE_1 1 #define STATE_2 2 #define STATE_3 3 #define FSA_INPUT_BIT_VALUE 0 #define FSA_OUTPUT_LED_ON_TIME 45 ; t = 6.6 ms * 45 = 300 ms #define FSA_OUTPUT_LED_OFF_TIME 25 ; 170 ms A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 59
Detektor 110 Proměnné state_register res 1 next_state res 1 fsa_input res 1 fsa_output res 1 fsa_output_timer res 1 Příklad návrhu ; Pushbutton S1, S2 debounce and leading edge detection variables portb_dbg: res 1 porta_dbg: res 1 pb_s1_debounce: res 1 pb_s1_status: res 1 pb_s2_debounce: res 1 pb_s2_status: res 1 A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 60
Detektor 110 Konstanty (vstup FSA) Příklad návrhu ; Pushbutton S1, S2 debounce and leading edge detection constants #define PB_ON 0 ; Pb Sx on status bit position #define PB_OFF 1 ; Pb Sx off status bit position #define DEBOUNCE_MASK b'00000111' ; 3 equal bits required #define PB_xTIMES_ON b'00000111' #define PB_xTIMES_OFF b'00000000' A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 61
Detektor 110 Začátek programu a tab.vektorů přerušení code Příklad návrhu ORG Reset_vector: goto Start 0x00000 ; Program start ORG 0x00008 Interrupt_vector: goto Timer0_int ; Interrupt vector table (one item here) A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 62
Detektor 110 Inicializace Příklad návrhu ORG 0x00050 Start: ; Background Start clrf reg ; reg = 0 clrf WREG ; WREG = 0 movwf TRISD ; PORTD -> all bits outputs movwf PORTD ; PORTD = 00h bsf TRISB, BIT0 ; PORTB.bit0 = input, push button S1 bsf TRISA, RA5 bsf WDTCON, ADSHR bsf ANCON0, PCFG4 ; RA5 - digital input bcf WDTCON, ADSHR call Pushbutton_s1_init ; Initialize S1 debounce routine call Pushbutton_s2_init ; Initialize S2 debounce routine call Bitstream_detector_init call Bitstream_detector_output_init A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 63
Detektor 110 Inicializace a pozadí (prázdné) Příklad návrhu movlw TIMER0_FOSC_PRESC64_8bit movwf T0CON ; Configure Timer0 bsf T0CON, TMR0ON ; Timer0 ON ; bsf INTCON, TMR0IE ; Timer0 interrupt enable bsf INTCON, GIE ; Non priority mode (IPEN = 0 by default) Loop: nop ; Do nothing, background bra Loop ; ; Background END A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 64
Detektor 110 Inicializace (vstupní filtr tlačítek S1, S2) ; Init debounce pushbutton S1 (RB0) Pushbutton_s1_init: clrf pb_s1_debounce clrf pb_s1_status return ; Pushbutton_s1_init END Příklad návrhu ; Init debounce pushbutton S2 (RA5) Pushbutton_s2_init: clrf pb_s2_debounce clrf pb_s2_status return ; Pushbutton_s1_init END A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 65
Detektor 110 Vstupní filtr tlačítka S1 Pushbutton_s1: ; Debounce pushbutton S1 (RB0) Příklad návrhu movlw DEBOUNCE_MASK andwf pb_s1_debounce, F rlncf pb_s1_debounce, F ; Rotate one bit left #ifdef DBG_MODE btfss portb_dbg, RB0 ; dbg:? Push button S1 pressed (0 -> on) #else btfss PORTB,RB0 ;? Push button S1 pressed (0 -> on) #endif Pushbutton_s1_read_as_on: bsf pb_s1_debounce,bit0 ; Yes, insert '1' to LSB Pb_s1_test_off: movf pb_s1_debounce, W andlw DEBOUNCE_MASK xorlw PB_xTIMES_OFF bnz Pb_s1_test_on A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 66
Detektor 110 Vstupní filtr tlačítka S1 Pb_s1_set_off: ; Ok, S1 debounced, read off Příklad návrhu bcf pb_s1_status, PB_ON ; Clear pushbutton S1 on bsf pb_s1_status, PB_OFF ; Set pushbutton S1 off bra Pb_s1_exit Pb_s1_test_on: movf pb_s1_debounce, W andlw DEBOUNCE_MASK xorlw PB_xTIMES_ON bnz Pb_s1_exit ; S1 bounces yet Pb_s1_detect_leading_edge: btfss pb_s1_status, PB_OFF ; Detect leading edge bra Pb_s1_exit Pb_s1_set_pb_on: bcf pb_s1_status, PB_OFF bsf pb_s1_status, PB_ON ; Set pushbutton S1 on Pb_s1_exit: return ; Pushbutton_s1 END A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 67
Detektor 110 Vstupní filtr tlačítka S2 Pushbutton_s2: ; Debounce pushbutton S2 (RA5) Příklad návrhu movlw DEBOUNCE_MASK andwf pb_s2_debounce, F rlncf pb_s2_debounce, F ; Rotate one bit left #ifdef DBG_MODE btfss porta_dbg, RA0 ; dbg:? Push button S2 pressed (0->on) #else btfss PORTA, RA5 ;? Push button S1 pressed (0->on) #endif Pushbutton_s2_read_as_on: bsf pb_s2_debounce, BIT0 ; Yes, insert '1' to LSB Pb_s2_test_off: movf pb_s2_debounce, W andlw DEBOUNCE_MASK xorlw PB_xTIMES_OFF bnz Pb_s2_test_on A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 68
Detektor 110 Vstupní filtr tlačítka S2 Pb_s2_set_off: ; Ok, S2 debounced, read off Příklad návrhu bcf pb_s2_status, PB_ON ; Clear pushbutton S2 on bsf pb_s2_status, PB_OFF ; Set pushbutton S2 off bra Pb_s2_exit Pb_s2_test_on: movf pb_s2_debounce, W andlw DEBOUNCE_MASK xorlw PB_xTIMES_ON bnz Pb_s2_exit ; S2 bounces yet Pb_s2_detect_leading_edge: btfss pb_s2_status, PB_OFF ; Detect leading edge bra Pb_s2_exit Pb_s2_set_pb_on: bcf pb_s2_status, PB_OFF bsf pb_s2_status, PB_ON ; Set pushbutton S2 on Pb_s2_exit: return ; Pushbutton_s2 END A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 69
Detektor 110 Inicializace (FSA) ; Bitstream detector initialization Bitstream_detector_init: movlw STATE_0 movwf state_register movwf next_state bcf fsa_input, FSA_INPUT_BIT_VALUE return ; Bitstream_detector_init END Příklad návrhu A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 70
Detektor 110 Vlastní konečný automat FSA Příklad návrhu ; Bitstream detector '110', FSA Moore Bitstream_detector: ; Test FSA input value ('0' or '1' or none) btfsc pb_s1_status, PB_ON ; S1 -> input '1' bra Bd_input_1 btfss pb_s2_status, PB_ON ; S2 -> input '0' bra Bd_exit ; No input bit Bd_input_0: bcf pb_s2_status, PB_ON ; Consume input '0' bcf fsa_input, FSA_INPUT_BIT_VALUE ; Input = '0' bra Bd_state_switch Bd_input_1: bcf pb_s1_status, PB_ON ; Consume input '1' bsf fsa_input, FSA_INPUT_BIT_VALUE ; Input = '1' A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 71
Detektor 110 Vlastní konečný automat FSA Příklad návrhu ; In Java. switch (state_register){ } Bd_state_switch: movff state_register, next_state movf state_register, W sublw STATE_0 bz Bd_state_0 movf state_register, W sublw STATE_1 bz Bd_state_1 movf state_register, W sublw STATE_2 bz Bd_state_2 bra Bd_state_3 ; There is no more states ; A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 72
Detektor 110 Vlastní konečný automat FSA Příklad návrhu Bd_state_0: ; FSA state diagram logic (See state diagram) btfss fsa_input, FSA_INPUT_BIT_VALUE ;? '1' bra Bd_set_next_state ; No, no change movlw STATE_1 movwf next_state ; Goto STATE_1 bra Bd_set_next_state Bd_state_1: btfss fsa_input, FSA_INPUT_BIT_VALUE ;? '1' bra Bd_state_1_1 movlw STATE_2 ; Yes movwf next_state bra Bd_set_next_state Bd_state_1_1: movlw STATE_0 ; No movwf next_state bra Bd_set_next_state A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 73
Detektor 110 Vlastní konečný automat FSA Bd_state_2: Příklad návrhu btfsc fsa_input,fsa_input_bit_value ;? '0' bra Bd_set_next_state ; No, no change movlw STATE_3 ; Yes movwf next_state bra Bd_set_next_state Bd_state_3: btfss fsa_input,fsa_input_bit_value ;? '1' bra Bd_state_3_1 movlw STATE_1 ; Yes movwf next_state bra Bd_set_next_state Bd_state_3_1: movlw STATE_0 ; No movwf next_state bra Bd_set_next_state A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 74
Detektor 110 Vlastní konečný automat FSA Bd_set_next_state: movff next_state, state_register Bd_exit: return ; Bitstream_detector END Příklad návrhu A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 75
Detektor 110 Inicializace (FSA logika výstupů) ; Bitstream detector output initializtion ; Bitstream_detector_output_init: movlw FSA_OUTPUT_LED_ON_TIME movwf fsa_output_timer clrf fsa_output return ; ; Bitstream_detector END Příklad návrhu A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 76
Detektor 110 FSA - logika výstupů ; STATEs 0,1,2 -> LED7 ON Příklad návrhu ; STATE 3 -> sequence detected -> LED7 toggle, T= approx 400 ms Bitstream_detector_output: movlw STATE_3 cpfseq state_register bra Bdo_nothing_detected Bdo_bitstream_detected: btfsc LATD, RD7 ; Send state_register, no delay bsf WREG, RD7 movff WREG, LATD Bdo_testif_bit_toggle: decfsz fsa_output_timer bra Bdo_exit Bdo_toggle_led: btfss LATD, RD7 bra Bdo_set_ledtime_on A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 77
Detektor 110 FSA - logika výstupů Bdo_set_ledtime_off: movlw FSA_OUTPUT_LED_OFF_TIME movwf fsa_output_timer bra Bdo_send_output Bdo_set_ledtime_on: movlw FSA_OUTPUT_LED_ON_TIME movwf fsa_output_timer Bdo_send_output: movff state_register, WREG Bdo_preset_led_on: bsf WREG, RD7 btfsc LATD, RD7 Příklad návrhu A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 78
Detektor 110 FSA - logika výstupů Bdo_set_led_off: bcf WREG, RD7 Bdo_send_new_output: movff WREG, LATD bra Bdo_exit ; Bdo_nothing_detected: movff state_register, WREG bsf WREG, RD7 movff WREG, LATD Bdo_exit: return ; ; Bitstream_detector END Příklad návrhu A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 79
Detektor 110 - Timer0 ISR (Interrupt Service Routine) Příklad návrhu Timer0_int: ; Timer0 ISR (Interrupt Service Routine), T = 6.6 ms ; Save context (example, background empty-no context) movff STATUS, status_tmp movff WREG, wreg_tmp movff BSR, bsr_tmp ; bcf INTCON, TMR0IF ; Clear intrerrupt flag ; call Pushbutton_s1 ; Test S1 on (input '1') call Pushbutton_s2 ; Test S2 on (input '0') call Bitstream_detector ; FSA state logic call Bitstream_detector_output ; FSA output logic ; movff bsr_tmp, BSR ; Restore context movff wreg_tmp, WREG movff status_tmp, STATUS retfie ; Return from interrupt, reenable interrupt END A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 80
Struktura a architektura počítačů Systémová struktura počítače Instrukční soubor II Příklady návrhu KONEC České vysoké učení technické Fakulta elektrotechnická A7B14SAP Struktura a architektura počítačů 8 - Instrukční soubor II 81