;--------------------------------------------------------------------- ; STANDARD.ASM - SEQUENZA DI ISTRUZIONI COMUNI PER PROGRAMMI SU ; ST6220, SONO PREIMPOSTATI UN INTERRUPT A 19.2 mS E ; 4 TASK DA 4+1 STATI. ;--------------------------------------------------------------------- ;--------------------------------------------------------------------- ; UTILIZZO DELLE PORTE ;--------------------------------------------------------------------- ; ; PA0 ; PA1 ; PA2 ; PA3 ; ; PB0 ; PB1 ; PB2 ; PB3 ; PB4 ; PB5 ; PB6 ; PB7 ; ;--------------------------------------------------------------------- ; REGISTRI ST6220 ;--------------------------------------------------------------------- X .def 80h!m ; Index register. Y .def 81h!m ; Index register. V .def 82h ; Short direct register. W .def 83h ; Short direct register. A .def 0ffh!m ; Accumulator. PORT_A .def 0c0h ; Port a data register. PORT_B .def 0c1h ; Port b data register. PORT_C .def 0c2h ; Port c data register. PDIR_A .def 0c4h ; Port a direction register. PDIR_B .def 0c5h ; Port b direction register. PDIR_C .def 0c6h ; Port c direction register. IOR .def 0c8h ; Interrupt option register. DRWR .def 0c9h ; Data rom window register. POPT_A .def 0cch ; Port a option register. POPT_B .def 0cdh ; Port b option register. POPT_C .def 0ceh ; Port c option register. ADR .def 0d0h ; A/D data register. ADCR .def 0d1h ; A/D control register. PSC .def 0d2h ; Timer prescaler register. TCR .def 0d3h!m ; Timer counter register. TSCR .def 0d4h ; Timer status control register. WDOG .def 0d8h ; Watchdog register. ;--------------------------------------------------------------------- ; RAM UTENTE 60 BYTE CON BACKUP PER PORTE DI I/O E STATI DEI TASK ;--------------------------------------------------------------------- A_OUT .DEF 084H B_OUT .DEF 085H C_OUT .DEF 086H S_TASK1 .DEF 08AH S_TASK2 .DEF 08AH S_TASK3 .DEF 08AH S_TASK4 .DEF 08AH ;-----------------------------------------------------------; ; USO DEI BACKUP: SET x,A_OUT LD A,A_OUT LD PORT_A,A ; ; LD A,PORT_A JRS x,A,label ; ;-----------------------------------------------------------; ;------------------------------------------------------------------ ; INIZIO PROGRAMMA ;------------------------------------------------------------------ .ORG 0080H ; (0880H SU ST6210/15) START: RETI ; RETI DAL'INTERRUPT DI RESET LDI WDOG,255 ;------------------------------------------------------------------ ; INIZIALIZZAZIONI ;------------------------------------------------------------------ LDI PORT_A,00000000B LDI PDIR_A,00000000B LDI POPT_A,00000000B LDI PORT_B,00000000B LDI PDIR_B,00000000B LDI POPT_B,00000000B LDI PORT_B,00000000B LDI PDIR_B,00000000B LDI POPT_B,00000000B ;-------------------------------------------------------------------------; ; SETTAGGIO PORTE: IN P-UP IN IN INT. ANALOG. OPEN C. P-PULL ; ; PORT_ 0 1 0 1 1 1 ; ; PDIR_ 0 0 0 0 1 1 ; ; POPT_ 0 0 1 1 0 1 ; ;-------------------------------------------------------------------------; LDI S_TASK1,0 LDI S_TASK2,0 LDI S_TASK3,0 LDI S_TASK4,0 SET 4,IOR ; ABILITA INTERRUPT GLOBALI LDI TCR,100 ; IMPOSTA TEMPO PER 52.083 Hz LDI TSCR,01011111B ; AVVIA TIMER LDI WDOG,255 ;------------------------------------------------------------------ ; PROGRAMMA PRINCIPALE ;------------------------------------------------------------------ FINE: LDI WDOG,255 JP FINE ;------------------------------------------------------------------ ; SUBROUTINE ;------------------------------------------------------------------ TASK1: LD A,S_TASK1 CPI A,0 JRZ TASK1S11 JP TASK1S2 TASK1S11: RET TASK1S2: CPI A,1 JRZ TASK1S21 JP TASK1S3 TASK1S21: RET TASK1S3: CPI A,2 JRZ TASK1S31 JP TASK1S4 TASK1S31: RET TASK1S4: CPI A,3 JRZ TASK1S41 JP TASK1S5 TASK1S41: RET TASK1S5: RET ;------------------------------------------------------------------ TASK2: LD A,S_TASK2 CPI A,0 JRZ TASK2S11 JP TASK2S2 TASK2S11: RET TASK2S2: CPI A,1 JRZ TASK2S21 JP TASK2S3 TASK2S21: RET TASK2S3: CPI A,2 JRZ TASK2S31 JP TASK2S4 TASK2S31: RET TASK2S4: CPI A,3 JRZ TASK2S41 JP TASK2S5 TASK2S41: RET TASK2S5: RET ;------------------------------------------------------------------ TASK3: LD A,S_TASK3 CPI A,0 JRZ TASK3S11 JP TASK3S2 TASK3S11: RET TASK3S2: CPI A,1 JRZ TASK3S21 JP TASK3S3 TASK3S21: RET TASK3S3: CPI A,2 JRZ TASK3S31 JP TASK3S4 TASK3S31: RET TASK3S4: CPI A,3 JRZ TASK3S41 JP TASK3S5 TASK3S41: RET TASK3S5: RET ;------------------------------------------------------------------ TASK4: LD A,S_TASK4 CPI A,0 JRZ TASK4S11 JP TASK4S2 TASK4S11: RET TASK4S2: CPI A,1 JRZ TASK4S21 JP TASK4S3 TASK4S21: RET TASK4S3: CPI A,2 JRZ TASK4S31 JP TASK4S4 TASK4S31: RET TASK4S4: CPI A,3 JRZ TASK4S41 JP TASK4S5 TASK4S41: RET TASK4S5: RET ;------------------------------------------------------------------ ; GESTORI DI INTERRUPT ;------------------------------------------------------------------ NMI_INT: RETI A_INT: RETI BC_INT: RETI TIM_INT: LDI WDOG,255 LDI TCR,100 ; IMPOSTA TEMPO PER 52.083 Hz LDI TSCR,01011111B ; RIAVVIA TIMER CALL TASK1 CALL TASK2 CALL TASK3 CALL TASK4 ;-----------SCRIVERE QUI IL GESTORE DELL'INTERRUPT PERIODICO RETI ADC_INT: RETI ;------------------------------------------------------------------ ; VETTORI DI INTERRUPT ;------------------------------------------------------------------ .ORG 0FF0H JP ADC_INT ; INTERRUPT ADC CONVERTER (#4) JP TIM_INT ; INTERRUPT TIMER (#3) JP BC_INT ; INPERRUPT PORTE B E C (#2) JP A_INT ; INTERRUPT PORTA A (#1) NOP NOP NOP NOP JP NMI_INT ; NMI (#0) JP START ; INTERRUPT DI RESET .END ;------------------------------------------------------------------