**=========Registers PORTA EQU $0000 ;PORT A(0) : OUTPUT DDRA EQU $0004 PORTB equ $0001 ;PORT B(0) : OUTPUT DDRB equ $0005 PORTC equ $0002 ;PORT C(0,1) : INPUT ( LONG OR SHORT PULSE, TRIGGER) DDRC equ $0006 BEGIN equ $8000 * **=========Main Program * ORG BEGIN INIT: * *=========initialize for main program======== * SEI ;DISABLE INTERRUPT MOV #$FF,DDRA MOV #$FF,DDRB MOV #$00,DDRC BCLR 0,PORTA ;OUTPUT LOW BCLR 0,PORTB START: LDA #$01 ;TEST THE FIRST BIT OF PORTC BIT PORTC ;DETERMINE LONG OR SHORT PULSE REGIME BNE LONG ;IF Z!=0, LONG PULSE REGIME SHORT: SEI ;SHORT PULSE REGIME, DISABLE IRQ INTERRUPT LDHX #0000 ;CLEAR TIME COUNTER BSET 0,PORTA ;OUTPUT HIGH BSET 0,PORTB S_T_H_LOOP: AIX #1 ;INCREASE H:X CPHX #S_T_H BLO S_T_H_LOOP ;LESS THAN S_T_H, INCREASE NEXT LDHX #0000 ;CLEAR TIME COUNTER BCLR 0,PORTA ;OUTPUT LOW BCLR 0,PORTB S_T_L_LOOP: AIX #1 ;INCREASE H:X CPHX #S_T_L BLO S_T_L_LOOP ;LESS THAN S_T_L, INCREASE NEXT BRA START ;RETURN TO THE MAIN RUNNING LOOP LONG: LDA #$02 ;TEST THE SECOND BIT OF PORTC BIT PORTC ;DETERMINE IF TRIGGERED BEQ ISR_IRQ ;IF Z=0, OUTPUT PULSE BRA START ;RETURN TO THE MAIN RUNNING LOOP ISR_IRQ: ;IRQ INTERRUPT SERVICE LDHX #0000 ;CLEAR TIME COUNTER BSET 0,PORTA ;OUTPUT HIGH BSET 0,PORTB L_T_H_LOOP: AIX #1 ;INCREASE H:X CPHX #L_T_H BLO L_T_H_LOOP ;LESS THAN L_T_H, INCREASE NEXT BCLR 0,PORTA ;OUTPUT LOW BCLR 0,PORTB L_T_L_LOOP: ;ADD A LOW LEVEL AFTER OUTPUT LDA #00 INNER_2: INCA CMP #TIMES BLO INNER_2 AIX #1 ;INCREASE H:X CPHX #L_T_L BLO L_T_L_LOOP ;LESS THAN L_T_L, INCREASE NEXT BRA START * *========= Vector Table ========== * ORG $DFFE RESET_VECTOR DW INIT * *========= DATA STORE ========== * S_T_H EQU $0013 ;SHORT PULSE WIDTH, 70us S_T_L EQU $30C2 ;SHORT PULSE INTERVAL, 40ms L_T_H EQU $03A8 ;LONG PULSE WIDTH, 3ms L_T_L EQU $FFFF ;AVOID LONG PULSE WIDTH, 200ms TIMES EQU $0F ;TOTAL AVOID WIDTH = L_T_L * TIMES = 3.0s