;V-1 ;Compileren met Crownhill Proton+ PIC Basic compiler. ;Dit programma geeft op een (2*16) LC-Display (HD44780 4-line mode) de RC5, RC5X en RC6. ;Sys: de decimale- en de binaire- systeem waarde ;Com: de decimale- en de binaire- commando waarde ;Groene LED: Infrarood ontvangst. ;Gele LED: Geen RC5/RC6 of glitch. ;Rode LED: Geen RC5/RC6 code of slechte ontvangst. ;Toggle LED: RC5/RC6 toggle waarde (0 of 1). ;Let op: De TSOP1736 (= 36kHz ontvanger) moet via een weerstand van 470 Ohm aan ; +5V aangesloten worden en over de + en - pin een tantaal van minimaal 0,1uF ! ; Aansluiting TSOP1736: || | ; -+ s ; PIC16F628A: +--v--+ ; LED Groen <[ ]> LED Rood ; LED Toggle <[ ]> LED Geel ; Signaal van de TSOP1736 >[ ] ; Via weerstand aan +5V ---[33k]--- >[ ] ; GND [ ] +5V ; [ ]> DB7 LCD ; [ ]> DB6 LCD ; LCD EN <[ ]> DB5 LCD ; LCD RS <[ ]> DB4 LCD ; +-----+ ;There is an English version too / Er is ook een Engelse versie ;www.picbasic.nl / Frits Kieftenbelt, Raalte, Netherlands (Frizie) DEVICE 16F628A CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, BODEN_OFF, LVP_OFF ;Geen kristal ;XTAL 4 ;Bij gebruik van een kristal een 4MHz type gebuiken (zijn tijden op gebaseerd) ALL_DIGITAL TRUE ;Normale aliases (constanten) SYMBOL Glitch = 52 ;Max 255: Onderdrukken storingstijd (glitches) SYMBOL LED_Tijd = 500 ;mSec: Error LED's brand tijd SYMBOL Ok = 50 ;Max 255: Controletijd of code goed wordt ontvangen ;Logische aliases (constanten) SYMBOL AAN = 0 ;Omgekeerd ON SYMBOL FALSE = 0 SYMBOL OFF = 0 SYMBOL ON = 1 SYMBOL TRUE = 1 SYMBOL UIT = 1 ;Omgekeerd OFF ;Poort aliases, bij wijziging ook TRIS controleren SYMBOL LED_Geel = PORTA.0 ;LED's via 1k weerstand aansluiten tussen PORT en GND SYMBOL LED_Rood = PORTA.1 SYMBOL LED_Groen = PORTA.2 SYMBOL LED_Toggle = PORTA.3 SYMBOL IR_Ontvanger= PORTA.4 ;TSOP1736 ; 76543210 TRISA = %11110000 TRISB = %11111111 PORTB_PULLUPS ON ;BYTE DIM Command AS BYTE ;RC5/RC6 command byte DIM CommandOud AS BYTE DIM Systeem AS BYTE ;RC5/RC6 systeem byte DIM SysteemOud AS BYTE DIM BD1 AS BYTE ;Byte Dummy ;BIT DIM CodeRC5X AS BIT ;TRUE als het een RC5X code betreft anders... DIM CodeRC6 AS BIT ;...TRUE als het een RC6 code betreft (anders RC5) DIM CodeRC6Oud AS BIT ;Als er gewisseld wordt tussen RC6 en RC5/RC5X moet LCD ook ge-updated worden DIM ToggBit AS BIT ;RC5/RC6 toggle bit DIM Waarde AS BIT ;Argument voor subroutine "BitOphalen" DIM ID1 AS BIT ;bIt Dummy CLEAR DELAYMS 500 ;LC-Display stabilisering CLS: PRINT "Decoder NL V-1" ;Programma naam en versie PRINT AT 2,1,"www.picbasic.nl" GOTO Start ;Spring over de subroutines ;SUBROUTINES BitOphalen: BD1 = 0 Waarde = IR_Ontvanger ;Maak Waarde 0 of 1 afhankelijk van ontvangen IR code WHILE IR_Ontvanger = Waarde AND BD1 < Ok;Niveau moet binnen een bepaalde tijd veranderen INC BD1 WEND IF Ok = BD1 THEN ErrorOntvangst ;Niet binnen de tijd een niveau-verandering IF CodeRC6 = TRUE THEN Waarde = 1 - Waarde ;RC6 is geinverteerd t.o.v. RC5/RC5X DELAYUS 625 ;525 - 725 ;(889us / 2 = 444) + de helft hiervan om middenin een volgende bit terecht te komen; 444+222 = 666, - een paar usec's verlies door het programma = plm. 625 ELSE DELAYUS 1100 ;950 - 1600 ENDIF RETURN ;HOOFDPROGRAMMA Start: LED_Groen = OFF LED_Geel = OFF LED_Rood = OFF BD1 = 0 WHILE IR_Ontvanger = UIT :WEND ;Wacht op ontvangst WHILE IR_Ontvanger = AAN AND BD1 < Glitch INC BD1 WEND IF BD1 < Glitch THEN ErrorGlitch CommandOud = Command ;Bewaar oude waarden voor herstel in geval van een error SysteemOud = Systeem LED_Groen = ON ;Een IR signaal ontvangen ;Zoek uit welk protocol----------------- BD1 = 0 Command = 0 ;Eerst 0 maken omdat RC5/RC5X bits 6 & 7 niet overschrijft, als RC6 deze eerder hoog heeft gemaakt, blijven deze hoog (=fout) Systeem = 0 ;Eerst 0 maken omdat RC5/RC5X bits 5,6,7 niet overschrijft, als RC6 deze eerder hoog heeft gemaakt, blijven deze hoog (=fout) WHILE BD1 < 255 AND IR_Ontvanger = AAN INC BD1 WEND CodeRC5X = FALSE CodeRC6 = FALSE SELECT CASE BD1 CASE 25 TO 90 ;RC5X CodeRC5X = TRUE Command.6 = 1 'DELAYUS 1280 ; 900 - 1700 (RC5X) CASE > 90 ;RC6 CodeRC6 = TRUE CASE ELSE ;RC5 'DELAYUS 2180 ;1800 - 2600 (RC5) END SELECT ; -------------------------------------- IF CodeRC6 = TRUE THEN ' WHILE IR_Ontvanger = UIT :WEND ;00 Vervalt hier door protocol onderzoek ' WHILE IR_Ontvanger = AAN :WEND ;1 Vervalt hier door protocol onderzoek WHILE IR_Ontvanger = UIT :WEND ;00 WHILE IR_Ontvanger = AAN :WEND ;1 WHILE IR_Ontvanger = UIT :WEND ;0 WHILE IR_Ontvanger = AAN :WEND ;1 WHILE IR_Ontvanger = UIT :WEND ;0 DELAYUS 2000 ;Wacht tot de laatste '1' van de header voorbijkomt (1778us), hierdoor val je middenin de eerste togglebit LED_Toggle = IR_Ontvanger ToggBit = IR_Ontvanger WHILE ToggBit = IR_Ontvanger :WEND ;Wacht tot geinverteerde deel van togglebit komt DELAYUS 1100 ;1000 - 1200; Zodoende val je in het eerste systeem bit GOSUB BitOphalen Systeem.7 = Waarde GOSUB BitOphalen Systeem.6 = Waarde GOSUB BitOphalen Systeem.5 = Waarde ELSE GOSUB BitOphalen LED_Toggle = Waarde ENDIF GOSUB BitOphalen Systeem.4 = Waarde GOSUB BitOphalen Systeem.3 = Waarde GOSUB BitOphalen Systeem.2 = Waarde GOSUB BitOphalen Systeem.1 = Waarde GOSUB BitOphalen Systeem.0 = Waarde IF CodeRC6 = TRUE THEN ;RC5/RC5X hebben geen 6e en 7e bits GOSUB BitOphalen Command.7 = Waarde GOSUB BitOphalen Command.6 = Waarde ENDIF GOSUB BitOphalen Command.5 = Waarde GOSUB BitOphalen Command.4 = Waarde GOSUB BitOphalen Command.3 = Waarde GOSUB BitOphalen Command.2 = Waarde GOSUB BitOphalen Command.1 = Waarde GOSUB BitOphalen Command.0 = Waarde IF Systeem <> SysteemOud OR Command <> CommandOud OR CodeRC6 <> CodeRC6Oud THEN ;Zonder deze regel knippert het LCD tijdens ontvangst (door CLS) CLS IF CodeRC5X = TRUE THEN PRINT "RC5X" ELSEIF CodeRC6 = TRUE THEN PRINT "RC6" ELSE PRINT "RC5" ENDIF PRINT " Protocol" DELAYMS 1000 ;Tijd voor aanduiding RC5, RC5X of RC6 protocol CLS PRINT "Sys:", DEC Systeem PRINT AT 1, 9, BIN Systeem PRINT AT 2, 1, "Com:", DEC Command PRINT AT 2, 9, BIN Command ENDIF ;Deze regel NIET bovenaan Start zetten, anders wordt hij ook gereset als er een Glitch komt CodeRC6Oud= CodeRC6 ;Als er gewisseld wordt tussen RC6 en RC5/RC5X moet LCD ook ge-updated worden GOTO Start ErrorGlitch: LED_Geel = ON ;Error in ontvangst (Geen RC5/RC6 code of glitch) DELAYMS LED_Tijd GOTO Start ErrorOntvangst: LED_Groen = OFF LED_Rood = ON ;Geen RC5/RC6 code of ontvangst niet optimaal DELAYMS LED_Tijd Command = CommandOud ;Geef Command en Systeem oude waarde terug Systeem = SysteemOud GOTO Start