$TITLE (irremote) $DEBUG $OBJECT ;************************************************************************ ;* * ;* Version 1 * ;************************************************************************ ; Include file for 87LPC764 SFR Definitions ; Philips Semiconductors. Revision 1.0, 04/20/99 ACC data 0E0h ; Accumulator AUXR1 data 0A2h ; Auxiliary Function Register ADCON data 0C0H ; A/D control register ADCS bit ADCON.3 ; A/D start ADCI bit ADCON.4 ; A/D complete B data 0F0h ; B Register CMP1 data 0ACh ; Comparator 1 Control Register CMP2 data 0ADh ; Comparator 2 Control Register DIVM data 095h ; CPU Clock Divide-By-M Control DPL data 082h ; Data Pointer - Low Byte DPH data 083h ; Data Pointer - High Byte DACO data 0C5H ; A/D Result I2CFG data 0C8h ; I2C Configuration Register CT0 bit I2CFG.0 ; Clock Time Select 0 CT1 bit I2CFG.1 ; Clock Time Select 1 TIRUN bit I2CFG.4 ; Timer I Run Enable CLRTI bit I2CFG.5 ; Clear Timer I MASTRQ bit I2CFG.6 ; Master Request SLAVEN bit I2CFG.7 ; Slave Enable I2CON data 0D8h ; I2C Control Register MASTER bit I2CON.1 ; Master Status STP bit I2CON.2 ; Stop Detect Flag STR bit I2CON.3 ; Start Detect Flag ARL bit I2CON.4 ; Arbitration Loss Flag DRDY bit I2CON.5 ; Data Ready Flag ATN bit I2CON.6 ; Attention: I2C Interrupt Flag RDAT bit I2CON.7 ; I2C Read Data I2DAT data 0D9h ; I2C Data Register IEN0 data 0A8h ; Interrupt Enable Register 0 EX0 bit IEN0.0 ; External Interrupt 0 Enable ET0 bit IEN0.1 ; Timer 0 Interrupt Enable EX1 bit IEN0.2 ; External Interrupt 1 Enable ET1 bit IEN0.3 ; Timer 1 Interrupt Enable ES bit IEN0.4 ; Serial Port Interrupt Enable EBO bit IEN0.5 ; Brownout Interrupt Enable EWD bit IEN0.6 ; Watchdog Interrupt Enable EA bit IEN0.7 ; Global Interrupt Enable IEN1 data 0E8h ; Interrupt Enable Register 1 EI2 bit IEN1.0 ; I2C Interrupt Enable EKB bit IEN1.1 ; Keyboard Interrupt Enable EC2 bit IEN1.2 ; Comparator 2 Interrupt Enable EC1 bit IEN1.5 ; Comparator 1 Interrupt Enable ETI bit IEN1.7 ; Timer I Interrupt Enable IP0 data 0B8h ; Interrupt Priority 0 Low Byte PX0 bit IP0.0 ; External Interrupt 0 Priority PT0 bit IP0.1 ; Timer 0 Interrupt Priority PX1 bit IP0.2 ; External Interrupt 1 Priority PT1 bit IP0.3 ; Timer 1 Interrupt Priority PS bit IP0.4 ; Serial Port Interrupt Priority PBO bit IP0.5 ; Brownout Interrupt Priority PWD bit IP0.6 ; Watchdog Interrupt Priority IP0H data 0B7h ; Interrupt Priority 0 High Byte IP1 data 0F8h ; Interrupt Priority 1 Low Byte PI2 bit IP1.0 ; I2C Interrupt Priority PKB bit IP1.1 ; Keyboard Interrupt Priority PC2 bit IP1.2 ; Comparator 2 Interrupt Priority PC1 bit IP1.5 ; Comparator 1 Interrupt Priority PTI bit IP1.7 ; Timer I Interrupt Priority IP1H data 0F7h ; Interrupt Priority 1 High Byte KBI data 086h ; Keyboard Interrupt P0 data 080h ; Port 0 CMP2O bit P0.0 ; P0, bit 0 is also the Comparator 2 Output CIN2B bit P0.1 ; P0, bit 1 is also the Comparator Input B CIN2A bit P0.2 ; P0, bit 2 is also the Comparator Input A CIN1B bit P0.3 ; P0, bit 3 is also the Comparator Input B CIN1A bit P0.4 ; P0, bit 4 is also the Comparator Input A CMPREF bit P0.5 ; P0, bit 5 is also the Comparator Reference Input CMP1O bit P0.6 ; P0, bit 6 is also the Comparator 1 Output T1 bit P0.7 ; P0, bit 7 is also the Timer 1 Count Input/Toggle Output P0M1 data 084h ; P0 Mode Register 1 P0M2 data 085h ; P0 Mode Register 2 P1 data 090h ; Port 1 TxD bit P1.0 ; P1, bit 0 is also the UART Transmitter Output RxD bit P1.1 ; P1, bit 1 is also the UART Receiver Input T0 bit P1.2 ; P1, bit 2 is also the Timer 0 Input/Output SCL bit P1.2 ; P1, bit 2 is also the I2C Bus Clock Line SDA bit P1.3 ; P1, bit 3 is also the I2C Bus Data Line INT0 bit P1.3 ; P1, bit 3 is also External Interrupt 0 INT1 bit P1.4 ; P1, bit 4 is also External Interrupt 1 RST bit P1.5 ; P1, bit 5 is also the Reset Pin ; P1.6 and P1.7 have no alternate function P1M1 data 091h ; P1 Mode Register 1 P1M2 data 092h ; P1 Mode Register 2 P2 data 0A0h ; Port 2 X2 bit P2.0 ; P2, bit 0 is also the X2 Pin CLKOUT bit P2.0 ; P2, bit 0 is also the CLKOUT Pin X1 bit P2.1 ; P2, bit 1 is also the X1 Pin P2M1 data 0A4h ; P2 Mode Register 1 P2M2 data 0A5h ; P2 Mode Register 2 PCON data 087h ; Power Control PSW data 0D0h ; Program Status Word P bit PSW.0 ; Accumulator Parity Flag F1 bit PSW.1 ; Flag 1 OV bit PSW.2 ; Overflow Flag RS0 bit PSW.3 ; Register Bank Select 0 RS1 bit PSW.4 ; Register Bank Select 1 F0 bit PSW.5 ; Flag 0 AC bit PSW.6 ; Auxiliary Carry Flag CY bit PSW.7 ; Carry Flag PT0AD data 0F6h ; Port 0 digital Input Disable SCON data 098h ; Serial Port Control RI bit SCON.0 ; Receive Interrupt Flag TI bit SCON.1 ; Transmit Interrupt Flag RB8 bit SCON.2 ; Receive Bit 8 TB8 bit SCON.3 ; Transmit Bit 8 REN bit SCON.4 ; Receiver Enable SM2 bit SCON.5 ; Serial Mode Control Bit 2 SM1 bit SCON.6 ; Serial Mode Control Bit 1 SM0 bit SCON.7 ; Serial Mode Control Bit 0 SBUF data 099h ; Serial Port Buffer SADDR data 0A9h ; Serial Port Address SADEN data 0B9h ; Serial Port Address Enable SP data 081h ; Stack Pointer TCON data 088h ; Timer Control IT0 bit TCON.0 ; External Interrupt 0 Type IE0 bit TCON.1 ; External Interrupt 0 Edge Flag IT1 bit TCON.2 ; External Interrupt 1 Type IE1 bit TCON.3 ; External Interrupt 1 Edge Flag TR0 bit TCON.4 ; Timer 0 Run Control TF0 bit TCON.5 ; Timer 0 Overflow Flag TR1 bit TCON.6 ; Timer 1 Run Control TF1 bit TCON.7 ; Timer 1 Overflow Flag TH0 data 08Ch ; Timer 0 - High Byte TH1 data 08Dh ; Timer 1 - High Byte TL0 data 08Ah ; Timer 0 - Low Byte TL1 data 08Bh ; Timer 1 - Low Byte TMOD data 089h ; Timer 0 and 1 Mode WDCON data 0A7h ; Watchdog Control Register WDRST data 0A6h ; Watchdog Reset (Feed) Register ;Instruction cycle = 1us ;Pinbelegung: ;P1.7 = Codierswitch ;P1.6 = Codierswitch ;P2.1 = Quarz ;P2.0 = Quarz ;P1.3 = LED(immer Open Drain) ;P1.2 = (immer Open Drain) ;P1.1 = Taster 2 ;P1.0 = Taster 1 ;P0.0 = Codierswitch ;P1.5 = Codierswitch(immer Schmitt Trigger Eingang)--> muss mit Pull up beschaltet werden ;P0.3 = Poti 1 ;P0.1 = Ausgabe der Information für Sendemodul ;P0.2 = Spannungsüberwachung (Komparatoreingang) ;P0.4 = Poti 2 ;P0.5 = Poti 3 ;P0.6 = Poti 4 ;P0.7 = Codierung für Infrarotausgabe ;P1.4 = Ausgabe modulierte Trägerfrequenz für Infrarotdatenübertragung ;Rambelegung STATUS DATA 020H ; TOGGLE BIT STATUS.0 RESET BIT STATUS.1 PARITYBIT BIT STATUS.2 TASTER1 BIT STATUS.3 TASTER2 BIT STATUS.4 BATLEER BIT STATUS.5 WANDLUNG1 BIT STATUS.6 INFRAROT BIT STATUS.7 POTI0 DATA 021H POTI1 DATA 022H POTI2 DATA 023H POTI3 DATA 024H POTI0SAVE DATA 025H POTI1SAVE DATA 026H POTI2SAVE DATA 027H POTI3SAVE DATA 028H KANAL DATA 029H ADWERT DATA 02AH TASTEN DATA 02BH REG1 DATA 02CH REG2 DATA 02DH ASICHER DATA 02EH HILFSREG DATA 02FH SEKUNDE BIT HILFSREG.0 ACCUSAVE DATA 030H KANALCOUNT DATA 031H SERVOL DATA 032H SERVOH DATA 033H ;SFR-Belegung: ; R0 Allgemeine Verwendung in Resetroutine ; R1 Im Wartemodul verwendet ; R2 ; R3 Zähler in Timer0 Interrupt ; R4 Zähler für Infrarotträgerfrequenz ; R5 Batteriespannungsüberwachung ; R6 1s Zähler in Timer0 Interrupt ;************************************************ ;* Initialisierung * ;************************************************ ORG 00H ; JMP START ; ORG 0BH ;Timer 0 Interrupt JMP TIMER0 ; ORG 01BH ;Timer 1 Interrupt ; JMP TIMER1 ; ORG 063H ;Komparator 1 Interrupt ; JMP KOMPINT ; ; ORG 100H ; ; START: MOV WDCON,#016H ;Watchdog konfigurieren MOV R0,#128 ;Alle 128 Bytes Ram loeschen CLR A ; LOOPCLR: MOV @R0,A ; DJNZ R0,LOOPCLR ; MOV PT0AD,#07EH ;Disable digital input on A/D input pins und bei Komparator 2 ANL P0M2,#081H ;Disable digital outputs on A/D input pins, P02 und P01 als Eingang ORL P0M1,#07CH ; MOV CMP2,#028H ;Komparator 2 konfigurieren MOV TMOD,#011H ;Timer 0 16bit counter ;Timer 1 16bit counter MOV R5,#10 ;Für Batteriespannungsüberwachung MOV R6,#15 ;Für 1s Marken CLR P0.1 ;Sendepin ausschalten CLR P1.4 ;Infrarotsignalpin auf low SETB ADCON.7 ;A/D Wandlung ermöglichen SETB TR0 ;Timer0 starten SETB ET0 ;Timer0 Interrupt zulassen ORL P0M2,#02 ;P0.1 als Push-Pull konfigurieren ORL P1M2,#010H ;P1.4 # JB P0.7,START3 ;IF Pin P0.7 = Low SETB INFRAROT ;THEN SBIT Infrarot ;ENDIF ;ENDIF START3: SETB EA ;Generelle Interruptfreigabe CLR P1.3 ;Betriebs-LED einschalten ;************************************************ ;* Hauptprogramm * ;************************************************ LOOP: MOV WDRST,#01EH ;Watchdog füttern MOV WDRST,#0E1H ; ACALL BATTERIE? ;Batteriespannung OK? MOV A,#0 ; ACALL ADWANDLER ;Alle Potis abfragen MOV POTI0,A ; MOV A,#1 ; ACALL ADWANDLER ; MOV POTI1,A ; MOV A,#2 ; ACALL ADWANDLER ; MOV POTI2,A ; MOV A,#3 ; ACALL ADWANDLER ; MOV POTI3,A ; ACALL SENDEN ;und Senden JMP LOOP ; ;************************************************ ;* Timer 0 Interrupt * ;************************************************ ;Wird alle 65ms angesprungen TIMER0: PUSH PSW ; DJNZ R6,TIME2 ; MOV R6,#15 ; SEK: SETB SEKUNDE ;Generierung der Sekundenmarke TIME2: DJNZ R3,TIMEE ; MOV R3,#5 ; JNB BATLEER,TIMEE ;IF Bit Batleer JNB TOGGLE,TIME1 ;THEN IF Bit Toggle(0),Status CLR TOGGLE ;THEN RBIT Toggle(0),Status CLR P1.3 ; Pin P1.3 Low (LED an) SJMP TIMEE ; TIME1: SETB TOGGLE ;ELSE SBIT Toggle(0),Status SETB P1.3 ; Pin P1.3 High (LED aus) ;ENDIF TIMEE: POP PSW ; RETI ; ;************************************************ ;* Spannungsüberwachung * ;************************************************ ;Unterspannung muß 10x hintereinander registriert werden BATTERIE?: MOV A,CMP2 ; JB ACC.1,ACCUOK ;IF NOT Bit CO2 (Komparatorergebnis) DJNZ R5,ACCUE ; SETB BATLEER ;THEN IF 10x registriert, dann Bit Batleer setzen ; ENDIF ACCUOK: MOV R5,#10 ;ENDIF ACCUE: RET ;************************************************ ;* Sendemodul * ;************************************************ ;Wenn die 1s-Marke erreicht ist, werden generell alle Potizustände einmal gesendet SENDEN: MOV A,POTI0 ;Änderung an Poti 0? JB SEKUNDE,SE1 ; CJNE A,POTI0SAVE,SE1 ; JMP SE2 ; SE1: MOV POTI0SAVE,A ; Wenn ja, letzten Potizustand sichern MOV KANAL,#0 ; Kanal = 0 JB P0.0,SE1A ; CPL A ; Servoreverse? SE1A: ACALL AUSGABE ; Bits ausgeben SE2: MOV A,POTI1 ;Änderung an Poti 1? JB SEKUNDE,SE3 ; CJNE A,POTI1SAVE,SE3 ; JMP SE4 ; SE3: MOV POTI1SAVE,A ; Wenn ja, letzten Potizustand sichern MOV KANAL,#1 ; Kanal = 1 JB P1.7,SE3A ; CPL A ; Servoreverse? SE3A: ACALL AUSGABE ; Bits ausgeben SE4: MOV A,POTI2 ;Änderung an Poti 2? JB SEKUNDE,SE5 ; CJNE A,POTI2SAVE,SE5 ; JMP SE6 ; SE5: MOV POTI2SAVE,A ; Wenn ja, letzten Potizustand sichern MOV KANAL,#2 ; Kanal = 2 JB P1.6,SE6A ; CPL A ; Servoreverse? SE6A: ACALL AUSGABE ; Bits ausgeben SE6: MOV A,POTI3 ;Änderung an Poti 3? JB SEKUNDE,SE7 ; CJNE A,POTI3SAVE,SE7 ; JMP SE8 ; SE7: MOV POTI3SAVE,A ; Wenn ja, letzten Potizustand sichern MOV KANAL,#3 ; Kanal = 3 JB P1.5,SE8A ; CPL A ; Servoreverse? SE8A: ACALL AUSGABE ; Bits ausgeben SE8: CLR SEKUNDE ; RET ;************************************************ ;* Bits senden * ;************************************************ AUSGABE: MOV ADWERT,A ;ADwert sichern ACALL TASTEN? ;Tastenabfrage ACALL PARITY ;Parity berechnen CLR EA ;Timer -Interrupt verhindern SETB P0.1 ; MOV R4,#72 ; ACALL XHIGHLOOP ; ; MOV R1,#2 ;Startbit senden ; ACALL WARTE ; # ; CLR P0.1 ; # MOV R1,#1 ; # ACALL WARTE ; # JNB KANAL.1,AU1 ;Kanalbits senden ACALL EINS ; # JMP AU2 ; # AU1: ACALL NULL ; # AU2: JNB KANAL.0,AU3 ; # ACALL EINS ; # JMP AU4 ; # AU3: ACALL NULL ; # AU4: JNB ADWERT.0,AU5 ;ADwertbits senden ACALL EINS ; # JMP AU6 ; # AU5: ACALL NULL ; # AU6: JNB ADWERT.1,AU7 ; # ACALL EINS ; # JMP AU8 ; # AU7: ACALL NULL ; # AU8: JNB ADWERT.2,AU9 ; # ACALL EINS ; # JMP AU10 ; # AU9: ACALL NULL ; # AU10: JNB ADWERT.3,AU11 ; # ACALL EINS ; # JMP AU12 ; # AU11: ACALL NULL ; # AU12: JNB ADWERT.4,AU13 ; # ACALL EINS ; # JMP AU14 ; # AU13: ACALL NULL ; # AU14: JNB ADWERT.5,AU15 ; # ACALL EINS ; # JMP AU16 ; # AU15: ACALL NULL ; # AU16: JNB ADWERT.6,AU17 ; # ACALL EINS ; # JMP AU18 ; # AU17: ACALL NULL ; # AU18: JNB ADWERT.7,AU19 ; # ACALL EINS ; # JMP AU20 ; # AU19: ACALL NULL ; # AU20: JNB TASTEN.1,AU21 ;Tastenbits senden ACALL EINS ; # JMP AU22 ; # AU21: ACALL NULL ; # AU22: JNB TASTEN.0,AU23 ; # ACALL EINS ; # JMP AU24 ; # AU23: ACALL NULL ; # AU24: JNB PARITYBIT,AU25 ;Paritybit senden ACALL EINS ; # JMP AU26 ; # AU25: ACALL NULL ; # AU26: ACALL NULL ;Stopbit senden SETB EA ;Interrupts wieder freigeben JNB INFRAROT,GOON ;IF Bit Infrarot ACALL WARTEN10 ;THEN 10ms warten GOON: RET ;ENDIF ;************************************************ ;* Ausgabe eines "1" Bits * ;************************************************ EINS: SETB P0.1 MOV R4,#18 XHIGHLOOP: HIGHLOOP: JNB INFRAROT,EINS1 SETB P1.4 EINS1: NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP CLR P1.4 NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP DJNZ R4,HIGHLOOP ; MOV A,#125 ; ACALL WAIT CLR P0.1 MOV R1,#1 ACALL WARTE RET ;************************************************ ;* Ausgabe eines "0" Bits * ;************************************************ NULL: SETB P0.1 MOV R4,#18 HIGHLOOP1: JNB INFRAROT,NULL1 SETB P1.4 NULL1: NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP CLR P1.4 NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP DJNZ R4,HIGHLOOP1 ; MOV A,#125 ; ACALL WAIT CLR P0.1 MOV A,#125 ACALL WAIT RET ;************************************************ ;* Parityberechnung * ;************************************************ ;Das Paritybit ergänzt die Anzahl der Bits zu einer geraden Summe PARITY: MOV A,#0 JNB KANAL.1,PA1 ADD A,#1 PA1: JNB KANAL.0,PA2 ADD A,#1 PA2: JNB ADWERT.7,PA3 ADD A,#1 PA3: JNB ADWERT.6,PA4 ADD A,#1 PA4: JNB ADWERT.5,PA5 ADD A,#1 PA5: JNB ADWERT.4,PA6 ADD A,#1 PA6: JNB ADWERT.3,PA7 ADD A,#1 PA7: JNB ADWERT.2,PA8 ADD A,#1 PA8: JNB ADWERT.1,PA9 ADD A,#1 PA9: JNB ADWERT.0,PA10 ADD A,#1 PA10: JNB TASTEN.1,PA11 ADD A,#1 PA11: JNB TASTEN.0,PA12 ADD A,#1 PA12: JB ACC.0,PARI CLR PARITYBIT RET PARI: SETB PARITYBIT RET ;************************************************ ;* Tastenabfrage * ;************************************************ TASTEN?: JB P1.0,TA1 ;Taster 1 gedrückt? JB TASTER1,TA2 ; SETB TASTER1 ; MOV A,TASTEN ; XRL A,#1 ; MOV TASTEN,A ; JMP TA2 ; TA1: CLR TASTER1 ; TA2: JB P1.1,TA3 ;Taster 2 gedrückt? JB TASTER2,TA4 ; SETB TASTER2 ; MOV A,TASTEN ; XRL A,#2 ; MOV TASTEN,A ; JMP TA4 ; TA3: CLR TASTER2 ; TA4: RET ;************************************************ ;* A/D - Wandlerabfrage * ;************************************************ ;Die Nummer des Kanals (0..3) wird in A übergeben ;Die Wandlung wird 4x ausgeführt, aufaddiert und anschließend durch 4 geteilt ADWANDLER: MOV R1,#4 MOV REG1,#0 MOV REG2,#0 AD2: ORL ADCON,A ;Wandler anwählen MOV ASICHER,A SETB ADCS ;Wandler starten ADCHK: JNB ADCI,ADCHK ;Auf Ergebis warten MOV A,DACO ; CLR ADCI ;Completion Flag löschen ANL ADCON,#0FCH ; TEST: ADD A,REG1 MOV REG1,A MOV A,REG2 ADDC A,#0 MOV REG2,A MOV A,ASICHER DJNZ R1,AD2 CLR C MOV A,REG2 RRC A MOV REG2,A MOV A,REG1 RRC A MOV REG1,A CLR C MOV A,REG2 RRC A MOV A,REG1 RRC A ; ANL A,#0FEH ;Letztes Bit streichen RET ;************************************************ ;* 10ms Warteschleife * ;************************************************ WARTEN10: MOV R1,#10 ;10ms warten WARTE: ; LOOP22: MOV A,#250 ; ACALL WAIT ; DJNZ R1,LOOP22 ; RET ;************************************************ ;* Warteschleife * ;************************************************ ;Zeit = Accu * 4us WAIT: NOP NOP DJNZ ACC,WAIT RET ;ENDIF END