NAME qtl_int(16) RSEG CODE EXTERN tick EXTERN ADU EXTERN Flag EXTERN state EXTERN cnt EXTERN CnvIx EXTERN machin_param EXTERN HalfSecCnt EXTERN BlinkPattern EXTERN SwitchCnt EXTERN OpMode EXTERN PrevOpMode PUBLIC TimerXInterrupt PUBLIC Timer3Interrupt PUBLIC SignalMode PUBLIC ChangeMode #define ASM #include "qtl_def.h" /****************************************************************************** Name : SignalMode Syntax : SignalMode() Input : none Output : anzeigen des Operationszustandes Return Type : BlinkPattern Return Value : none Description : Die Funktion wertet den OpMode- Status aus und setzt die Variable BlinkPattern um die Ausgabe zu aktivieren. ******************************************************************************/ SignalMode: LDA np:OpMode SWITCH A CASE #SLEEP2 LDA #2 ; 1 mal blinken STA np:BlinkPattern BREAK 1 CASE #SAMPLE LDA zp:machin_param+30 ;ScanMode IF A == #DELAY LDA #1AH ; 1 kurz, 1 lang STA np:BlinkPattern ELSEIF A == #DELAY_RAW LDA #1AH ; 1 kurz, 1 lang STA np:BlinkPattern ELSE LDA #0AH ; 2 kurz STA np:BlinkPattern ENDIF BREAK 1 CASE #SLEEP3 LDA #2AH ; 3 kurz STA np:BlinkPattern BREAK 1 CASE #TRANSFER_BRK LDA #6AH ; 2 kurz, 1 lang STA np:BlinkPattern BREAK 1 ENDS RTS SetBrk MACRO LDA np:Flag ORA #2 STA np:Flag ENDM SetMark MACRO LDA np:Flag ORA #$10 STA np:Flag ENDM /****************************************************************************** Name : ChangeMode Syntax : jsr ChangeMode Input : Register A, Anzahl der Tastendruecke, 0 fuer Adapter. Output : Variable OpMode, PrevOpMode Return Type : none Return Value : none Description : In Abhaengigkeit des aktuellen Operationszustandes wird in einen neuen Operationszustand gewechselt. Der alte Zustand wird in "PrevOpMode" gespeichert. ******************************************************************************/ ChangeMode: TAY ; LDA np:OpMode ; jetziger Zustand SWITCH A CASE #SLEEP1 CASE #SLEEP2 IF Y == #2 LDA np:OpMode STA np:PrevOpMode LDA #SAMPLE STA np:OpMode SetBrk ELSEIF Y == #0 LDA np:OpMode STA np:PrevOpMode LDA #TRANSFER_S STA np:OpMode SetBrk ENDIF jmp _ENDSWITCH ;BREAK 1 CASE #SAMPLE IF Y == #3 LDA np:OpMode STA np:PrevOpMode LDA #SLEEP3 STA np:OpMode SetBrk ELSEIF Y == #2 LDA #2 ;Funktion aktiviert ? BIT zp:machin_param+37 ;Eco, Bit 1 IF SetMark ; Marke setzen jsr SignalMode ENDIF ENDIF BREAK 1 CASE #SLEEP3 IF Y == #0 LDA np:OpMode STA np:PrevOpMode LDA #TRANSFER_E STA np:OpMode SetBrk ENDIF BREAK 1 CASE #TRANSFER_BRK IF Y == #0 LDA np:OpMode STA np:PrevOpMode LDA #TRANSFER_E STA np:OpMode SetBrk ELSEIF Y == #2 LDA np:OpMode STA np:PrevOpMode LDA #SAMPLE STA np:OpMode SetBrk ENDIF BREAK 1 _ENDSWITCH: ENDS RTS /****************************************************************************** Name : StoreADU Syntax : jsr StoreADU Input : none Output : ADU[CnvIx] Return Type : none Return Value : none Description : Der ADU Wert wird in das FIFO ADU[] uebertragen, wenn der Zeiger "CnvIx" kleiner als 8 ist. Abschliessend wird der ADC erneut gestartet. ******************************************************************************/ StoreADU: LDA np:CnvIx ;if(CnvIx<8) CMP #8 BCS StEnd LDA np:CnvIx ; ADU[CnvIx]=AD TAY LDA zp:53 ; AD- Register STA np:ADU,Y INC np:CnvIx ; CnvIx+=1 CLB 3,zp:52 ; StartADU() StEnd: RTS /****************************************************************************** Name : TimerXInterrupt Syntax : Interruptgesteuert Input : none Output : none Return Type : none Return Value : none Description : Diese Interruptroutine realisiert die Messung im 200Hz DFT- Mode. ******************************************************************************/ TimerXInterrupt: CLT ; Register retten PHA TYA PHA JSR StoreADU ; Messwert erfassen PLA ; Register wiederherstellen TAY PLA RTI /****************************************************************************** Name : Timer3Interrupt Syntax : Interruptgesteuert Input : none Output : none Return Type : none Return Value : none Description : Diese Interruptroutine steuert alle zyklischen Vorgaenge (1/64s), wie Zeitmessung, Messwerterfassung, abfrage des Tasters und des Adaptersignals, Zustandsuebergaenge. ******************************************************************************/ Timer3Interrupt: CLT PHA TYA PHA INC np:tick ;tick+=1 // 1/64s Zaehler LDA np:Flag ;Int=1 // Interruptsynchronisierungsflag ORA #1 STA np:Flag BBC 2,A,I001 ;if(Convert) JSR StoreADU ; StoreADU() // Messung laeuft I001: LDA zp:machin_param+38 ;if(tick==(machin_param.OneSec>>1)) LSR A CMP np:tick BNE I003 INC np:HalfSecCnt ; HalfSecCnt+=1 // 1/2s vergangen LDA zp:machin_param+39 ;if(machin_param.Delay!=0) ORA zp:machin_param+40 ORA zp:machin_param+41 ORA zp:machin_param+42 BEQ I010 DEC zp:machin_param+39 ; machin_param.Delay-=1; LDA zp:machin_param+39 CMP #$FF BNE I032 DEC zp:machin_param+40 LDA zp:machin_param+40 CMP #$FF BNE I032 DEC zp:machin_param+41 LDA zp:machin_param+41 CMP #$FF BNE I032 DEC zp:machin_param+42 BRA I032 I010: LDA np:Flag ; else ORA #32 ; Flag.Start=1 STA np:Flag I032: JMP I006 I003: LDA zp:machin_param+38 ;if(tick==machin_param.OneSec) CMP np:tick BNE I004 LDA #0 ; tick=0 STA np:tick INC zp:machin_param+43 ; machin_param.IniTime+=1 // Uhr aktualisieren BNE I005 INC zp:machin_param+44 BNE I005 INC zp:machin_param+45 BNE I005 INC zp:machin_param+46 I005: INC np:HalfSecCnt ; HalfSecCnt+=1 // 1/2s Zaehler erhoehen JMP I006 I004: LDA np:BlinkPattern ; if(BlinkPattern==0 && Brk==0) BEQ I030 ; // Tasterabfrage nur wenn gerade keine JMP I007 ; // Ausgabe erfolgt und kein Zustandsuebergang I030: LDA np:Flag ; // bearbeitet wird. BBC 1,A,I031 JMP I007 I031: CLB 7,zp:12 ; SWITCH_GND=0 BBC 3,zp:8,I008 ; if(Adapter==1) // QTL im Adapter LDA #0 ; ChangeMode(0) JSR ChangeMode JMP I009 I008: LDA np:SwitchCnt ; switch(SwitchCnt) // Zustandsmaschine fuer SWITCH A ; // Tasterabfrage CASE #0 BBS 1,zp:10,I011 ; if(Switch) // warten bis Taste 1s INC np:cnt ; cnt+=1 // gedrueckt wurde LDA np:cnt ; if(cnt==machin_param.OneSec) CMP zp:machin_param+38 BNE I012 CLB 0,zp:10 ; LED_on() // LED ein INC np:SwitchCnt ; SwitchCnt+=1 // naechster State LDA #0 ; cnt=0 STA np:cnt I012: JMP ENDSWITCH ; break I011: LDA #0 ; else STA np:cnt ; cnt=0 // Taste losgelassen JMP ENDSWITCH ; break CASE #1 ; // 2s warten INC np:cnt ; cnt+=1 LDA np:cnt ; if((cnt>>1)==machin_param.OneSec) LSR A CMP zp:machin_param+38 BNE I013 SEB 0,zp:10 ; LED_off() // LED aus INC np:SwitchCnt ; SwitchCnt+=1 // naechster State BBS 1,zp:10,I014 ; if(Switch) // wenn Taste noch gedrueckt, // ist nur Zustandsabfrage gewuenscht LDA zp:machin_param+38 ; cnt=machin_param.OneSec<<1 ASL A STA np:cnt BRA I015 I014: LDA #0 ; else STA np:state ; state=0 // Statevariable fuer Tastenzustand STA np:cnt ; cnt=0 I013: I015: BREAK 1 DEFAULT ; // 2s lang Tastendruecke zaehlen INC np:cnt ; cnt+=1 LDA np:cnt ; if((cnt>>1)=machin_param.OneSec) CMP zp:machin_param+38 BCC I026 LDA #0 ; cnt=0 STA np:cnt LSR np:BlinkPattern ; BlinkPattern=BlinkPattern>>1 // Muster verschieben LDA np:BlinkPattern ; if(BlinkPattern&1) // wenn Bit 0 gesetzt LED ein AND #1 BEQ I027 CLB 0,zp:10 ; LED_on() BRA I028 ; else I027: SEB 0,zp:10 ; LED_off() // sonst LED aus I028: I026: I025: SEB 7,zp:12 ; SWITCH_GND=1 // Taster stromlos I006: PLA ; Register rekonstruieren TAY PLA RTI /****************************************************************************** Description : Interruptvektortabelle ******************************************************************************/ COMMON INTVEC BLKB 12 BYTE LOW(Timer3Interrupt),HIGH(Timer3Interrupt) BLKB 4 BYTE LOW(TimerXInterrupt),HIGH(TimerXInterrupt) END