;V-4 ;Print 110820 ;Voor aansluitschema en bediening zie website www.picbasic.nl ; ; PIC16F628A: +--v--+ ; +5V---LED_Groen----[1k ]--- <[ ]> RS LCD ; +5V---LED_Rood-----[1k ]--- <[ ]> EN LCD ; +5V---LED_Toggle---[1k ]--- <[ ]< X-tal 10MHz ;PULL-UP!Systeem instel toets |---/--- >[ ]< X-tal 10MHz ; GND [ ] +5V ; S2 INSTEL toets |---/--- >[ ]> DB7 LCD ; S1 ZEND toets _---/--- >[ ]> DB6 LCD ; NPN transistor IR LED----[4k7]--- <[ ]> DB5 LCD ; TSOP1736 IR-ontvanger >[ ]> DB4 LCD ; +-----+ ;There is also an English version / Er is ook een Engelse versie ;www.picbasic.nl / Frits Kieftenbelt, Raalte, Netherlands (Frizie) DEVICE 16F628A CONFIG HS_OSC, WDT_OFF, PWRTE_ON, BODEN_OFF, LVP_OFF, MCLRE_OFF ;PORTA.5 = input voor SYSTEEM INSTEL TOETS XTAL 10 ALL_DIGITAL TRUE ;Normale aliases (constanten) SYMBOL AntiDender = 10 ;mSec: Druktoets anti-dender tijd SYMBOL Glitch = 30 ;Max 65535: Onderdrukken storingstijd (glitches) SYMBOL KnipperFreq = 50 ;Max 255: Knipperfrequentie van LED (=mSec x 10, bv. 50x10=500, 500mSec knipperfreq) SYMBOL LED_Tijd = 1000 ;mSec: Error LED's brand tijd SYMBOL Ok = 275 ;Max 65535: Controletijd of code goed wordt ontvangen SYMBOL ProtocolLCD = 1000 ;mSec: Tijd voor aanduiding RC5, RC5X of RC6 protocol SYMBOL StartRepeat = 180 ;Max.255: Tijd dat INSTEL toets ingedrukt moet worden voordat het gaat repeteren SYMBOL StartTijd = 200 ;Max.255: De startsnelheid van het repeteren bij het ingedrukt houden van de INSTEL toets SYMBOL Versnelling = 12 ;De versnelling van de repeteertijd bij het ingedrukt houden van de INSTEL toets ;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 ;EEPROM adresnamen SYMBOL EE_Mode = 0 ;EEPROM adres waar staat welke mode (RC5X of RC6) het laatst is gebruikt SYMBOL EE_RC5c = 1 ;EEPROM adres voor RC5 command SYMBOL EE_RC5s = 2 ;EEPROM adres voor RC5 systeem-adres SYMBOL EE_RC6c = 3 ;EEPROM adres voor RC6 command SYMBOL EE_RC6s = 4 ;EEPROM adres voor RC6 systeem-adres EDATA 0, 0, 0, 0, 0 ;Allereerste keer (na programmeren PIC) staat Systeem_Z-adressen en Command_Z op 0 en in RC6 mode ;Poort aliases, bij wijzigen ook TRIS checken DECLARE LCD_ENPIN = PORTA.0 ;Omdat alleen PORTB pull-ups heeft voor de toetsen, zijn EN en RS verplaatst naar PORTA DECLARE LCD_RSPIN = PORTA.1 SYMBOL LED_Groen = PORTA.2 ;Infra Rood ontvangst signaal LED SYMBOL LED_Rood = PORTA.3 ;Geen RC5/RC6 code of slechte ontvangst SYMBOL LED_Toggle = PORTA.4 ;RC5/RC6 toggle signaal aanduiding SYMBOL PRG_Systeem = PORTA.5 ;Als deze poort laag is dan is het 'systeem'adres van de IR-zender in te stellen (PULL-UP 33k Weerstand!!!) SYMBOL Instel = PORTB.0 ;Adres verhogen of verlagen (beurtelings) (afhankelijk van bit Plus) SYMBOL Zend = PORTB.1 ;Zend de ingestelde RC5 of RC6 code door deze poort laag te maken SYMBOL IrOut = PORTB.2 ;Infra Rood LED. Versterken via 4k7 weerstand aan NPN transistor (bv. BC547 en 47 Ohm aan IR-LED) SYMBOL IR_Ontvanger= PORTB.3 ;TSOP1736 Infra Rood ontvanger ;WORD DIM WD1 AS WORD ;Word Dummy ;BYTE DIM Command AS BYTE ;De commandowaarde die hierin staat wordt op het display gezet DIM Command_O AS BYTE ;RC5/RC6 command byte die Ontvangen is DIM CommandOud_O AS BYTE ;Backup voor laatst uitgezonden Command, in geval van Ontvangsterror is oude waarde herstelbaar DIM Command_Z AS BYTE ;Bevat de RC5 of RC6 command code die verZonden moet worden DIM Cycl_1 AS BYTE ;Voor ASM routine DIM Cycl_2 AS BYTE ;Voor ASM routine DIM Knipper AS BYTE ;Teller voor knipperfrequentie van LED DIM MaxCommand AS BYTE ;Maximaal mogelijke command instelling, voor RC5/RC5X is dat 127, voor RC6 is dat 255 DIM MaxSysteem AS BYTE ;Maximaal mogelijke systeem adres, voor RC5/RC5X is dat 31, voor RC6 is dat 255 DIM RepeteerTijd AS BYTE ;De repeteertijd (die steeds sneller gaat) bij het vasthouden van de INSTEL toets DIM Systeem AS BYTE ;De systeemwaarde die hierin staat wordt op het display gezet DIM Systeem_O AS BYTE ;RC5/RC6 systeem byte die Ontvangen is DIM SysteemOud_O AS BYTE ;Backup voor laatst uitgezonden Systeem, in geval van Ontvangsterror is oude waarde herstelbaar DIM Systeem_Z AS BYTE ;Bevat de RC5 of RC6 systeem code die verZonden moet worden DIM Tijd AS BYTE ;Tijd voor subroutine Timer 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 Plus AS BIT ;Als TRUE dan loopt de Instel teller omhoog, anders omlaag DIM PRG_EEPROM AS BIT ;Als TRUE dan moet het systeem-adres in EEPROM worden opgeslagen als de eerste keer hierna de ZEND toets wordt ingedrukt DIM RC5_Mode AS BIT ;Als TRUE dan wordt gewerkt met RC5(X) protocol, bij FALSE met RC6 DIM Repeteren AS BIT ;Als TRUE dan verhoogt of verlaagt het Systeem_Z of Command_Z adres automatisch DIM ToggBit_O AS BIT ;Togglebit RC5/RC6 van IR-ontvanger DIM ToggBit_Z AS BIT ;Togglebit RC5/RC6 van IR-zender DIM UpdateLCD AS BIT ;TRUE als LCD ge-update is DIM Waarde AS BIT ;Argument voor subroutine "BitOphalen" 'DIM ID1 AS BIT ;bIt Dummy HerStart: ;Als 'INSTEL' en 'ZEND' tegelijk ingedrukt worden herstart het programma vanaf hier ; 76543210 PORTA = %00000000 PORTB = %00000000 TRISA = %11100011 TRISB = %11111011 PORTB_PULLUPS ON ;Voor de toetsen CLEAR LED_Groen = UIT LED_Rood = UIT LED_Toggle = UIT DELAYMS 500 ;LC-Display stabilisering CLS PRINT "Transcver NL V-4" PRINT AT 2, 1, "www.picbasic.nl" DELAYMS 2000 CLS PRINT "INSTEL=Keuze" PRINT AT 2, 1, "ZEND=Verder gaan" RC5_Mode = 1 ^ EREAD EE_Mode ;EEPROM geinverteerd inlezen omdat meteen hierna weer wordt geinverteerd WHILE Zend = UIT ;Instellen keuze RC5 of RC6 bevestigen met de 'ZEND' toets DELAYMS AntiDender RC5_Mode = RC5_Mode ^ 1 ;Toggle tussen RC5 en RC6 CURSOR 1,14 IF RC5_Mode = TRUE THEN PRINT "RC5" ELSE PRINT "RC6" ENDIF WHILE Instel = AAN ;Wacht tot er geen toets meer is ingedrukt GOSUB KnipperLED ;Ondertussen de groene LED laten knipperen WEND WHILE Instel = UIT AND Zend = UIT ;Wacht op een toets indruk GOSUB KnipperLED ;Ondertussen de groene LED laten knipperen WEND PRINT AT 2, 6, "Bevestigen " WEND WHILE Zend = AAN: WEND ;Wacht tot 'ZEND' toets is losgelaten (anders zou hij meteen gaan zenden) IF RC5_Mode <> EREAD EE_Mode THEN EWRITE EE_Mode, [RC5_Mode];Alleen RC5_mode opslaan als het is gewijzigd IF RC5_Mode = TRUE THEN ;Als het RC5 betreft dan... MaxCommand = 127 MaxSysteem = 31 Command_Z = EREAD EE_RC5c ;Stel command van de IR-zender op laatst gebruikte RC5 command Systeem_Z = EREAD EE_RC5s ;Stel systeem van de IR-zender op laatst gebruikte RC5 adres ELSE ;anders RC6 MaxCommand = 255 MaxSysteem = 255 Command_Z = EREAD EE_RC6c ;Stel command van de IR-zender op laatst gebruikte RC6 command Systeem_Z = EREAD EE_RC6s ;Stel systeem van de IR-zender op laatst gebruikte RC6 adres ENDIF Command = Command_Z Systeem = Systeem_Z Plus = TRUE ;De eerste keer omhoog tellen CLS GOSUB Display GOTO Opnieuw ;Spring over subroutines ;SUBROUTINES BitOphalen: WD1 = 0 Waarde = IR_Ontvanger ;Maak Waarde 0 of 1 afhankelijk van ontvangen IR code WHILE IR_Ontvanger = Waarde AND WD1 < Ok;Niveau moet binnen een bepaalde tijd veranderen INC WD1 WEND IF Ok = WD1 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 Display: PRINT AT 1, 1, "Sys:", DEC Systeem, " " PRINT AT 2, 1, "Com:", DEC Command, " " IF RC5_Mode = TRUE THEN ;RC5 heeft 5 systeembits en 7 commandobits PRINT AT 1, 11, BIN5 Systeem PRINT AT 2, 9, BIN7 Command ELSE ;RC6 heeft 8 systeembits en 8 commandobits PRINT AT 1, 9, BIN8 Systeem PRINT AT 2, 9, BIN8 Command ENDIF RETURN KnipperLED: DELAYMS AntiDender INC Knipper IF Knipper > KnipperFreq THEN CLEAR Knipper LED_Groen = LED_Groen ^ 1 ENDIF RETURN Timer: ;Vertraag, maar ga meteen terug als de INSTEL toets wordt losgelaten WHILE Instel = AAN AND Tijd > 0 ;Wacht tot de toets wordt losgelaten OF dat de Tijd voorbij is DEC Tijd DELAYMS 2 IF Zend = AAN THEN BREAK ;Bij het indrukken van beide toetsen start het programma opnieuw (RC5/RC6 is opnieuw in te stellen) WEND RETURN ;HOOFD PROGRAMMA Opnieuw: CodeRC6Oud = CodeRC6 ;Als er gewisseld wordt tussen RC6 en RC5/RC5X moet LCD ook ge-updated worden LED_Groen = UIT ;IR ontvangst LED uit LED_Rood = UIT ;IR ontvangst error LED uit IF Zend = UIT AND Instel = UIT THEN RepeteerTijd = StartTijd Repeteren = FALSE ENDIF WHILE Zend = UIT AND Instel = UIT AND IR_Ontvanger = UIT ;Wacht op een toets indruk of IR ontvangst WEND IF IR_Ontvanger = AAN THEN ;Zoek uit of er IR-ontvangst was of dat er een toets was ingedrukt GOTO IR_Ontvangst ELSE DELAYMS AntiDender ;Tegen contactdender van de toetsen IF Zend = UIT AND Instel = UIT THEN Opnieuw ENDIF IF Instel = AAN THEN ;Als toets INSTEL is ingedrukt dan... IF Zend = AAN THEN Start ;Bij het indrukken van beide toetsen start het programma opnieuw (RC5/RC6 is opnieuw in te stellen) UpdateLCD = FALSE ;LCD is gewijzigd PRG_EEPROM = TRUE ;De RC code wordt gewijzigd, na instelling de nieuwe instellingen in EEPROM programmeren als op ZEND wordt gedrukt IF RepeteerTijd = StartTijd THEN ;Check of de toets kort of langer wordt ingedrukt BD1 = StartRepeat WHILE Instel = AAN AND BD1 > 0 ;Zolang de 'INSTEL' toets is ingedrukt EN de tijd nog niet voorbij is... DELAYMS 5 DEC BD1 WEND IF BD1 < 1 THEN ;Als de toets de hele StartRepeat tijd is doorlopen dan... Plus = Plus ^ 1 ;...omkeren van richting en... Repeteren = TRUE ;...automatisch repeteren ENDIF ENDIF IF Plus = TRUE THEN ;Als de teller omhoog moet dan... IF PRG_Systeem = AAN THEN ;Als systeem-adres moet worden ingesteld dan... ' PRG_EEPROM = TRUE ;Het systeem-adres wordt gewijzigd, na instelling het nieuwe adres in EEPROM programmeren IF Systeem_Z < MaxSysteem THEN INC Systeem_Z ;Verhoog systeem-adres met 1 ELSE Systeem_Z = 0 ENDIF ELSE ;Als systeem-adres NIET wordt ingesteld dan Command_Z code instellen IF Command_Z < MaxCommand THEN INC Command_Z ;Verhoog command code met 1 ELSE Command_Z = 0 ENDIF ENDIF ELSE ;Als de teller niet omhoog moet dan... (moet ie dus omlaag) IF PRG_Systeem = AAN THEN ;Als systeem-adres moet worden ingesteld dan... ' PRG_EEPROM = TRUE ;Het systeem-adres wordt gewijzigd, na instelling het nieuwe adres in EEPROM programmeren IF Systeem_Z > 0 THEN ;Als het systeem-adres nog niet 0 is dan... DEC Systeem_Z ;...verlaag systeem-adres met 1 ELSE Systeem_Z = MaxSysteem ENDIF ELSE ;Als systeem-adres NIET wordt ingesteld dan command code instellen IF Command_Z > 0 THEN DEC Command_Z ;Verlaag met 1 ELSE Command_Z = MaxCommand ENDIF ENDIF ENDIF Command = Command_Z ;Geef Zend-Commandwaarde aan Command voor weergave op display Systeem = Systeem_Z ;Geef Zend-Systeemwaarde aan Systeem voor weergave op display GOSUB Display ;Zet nieuwe instellingen op HD44780 LCD IF Repeteren = TRUE THEN ;Als de teller automatisch op of aftelt dan... Tijd = RepeteerTijd ;RepeteerTijd bevat een tijd die steeds kleiner wordt GOSUB Timer IF RepeteerTijd = StartTijd THEN ;Alleen de eerste keer een extra tijd (om toets na omkeren van richting los te kunnen laten) Tijd = 250 ;Dit is die extra tijd GOSUB Timer ENDIF IF RepeteerTijd > Versnelling THEN RepeteerTijd = RepeteerTijd - Versnelling ;Versnellen van de automatische teller ENDIF ELSEIF Zend = AAN THEN ;Als op de 'ZEND' toets wordt gedrukt dan IF PRG_EEPROM = TRUE THEN ;Het systeem-adres is blijkbaar gewijzigd, deze bij het indrukken van de ZEND toets eerst opslaan PRG_EEPROM = FALSE IF RC5_Mode = TRUE THEN ;Als het de RC5 systeem-adres is dan... IF EREAD EE_RC5c <> Command_Z THEN EWRITE EE_RC5c, [Command_Z];Schrijf het RC5 commando code in EEPROM IF EREAD EE_RC5s <> Systeem_Z THEN EWRITE EE_RC5s, [Systeem_Z];Schrijf het RC5 systeem-adres in EEPROM ELSE ;...anders (RC6) IF EREAD EE_RC6c <> Command_Z THEN EWRITE EE_RC6c, [Command_Z];Schrijf het RC6 commando code in EEPROM IF EREAD EE_RC6s <> Systeem_Z THEN EWRITE EE_RC6s, [Systeem_Z];Schrijf het RC6 systeem-adres in EEPROM ENDIF ENDIF ToggBit_Z = ToggBit_Z ^ 1;Toggle het RC5/RC6 togglebit van de IR-zender LED_Toggle = ToggBit_Z ;Ook de toggle LED aanpassen WHILE Zend = AAN LED_Groen = AAN IF RC5_Mode = FALSE THEN ;Als de gebruiker niet RC5 heeft ingesteld dan... GOSUB RC6_Code ;...roep RC6 assembler routine... ELSE ;...anders... GOSUB RC5_Code ;...roep RC5 assembler routine ENDIF LED_Groen = UIT IF Instel = AAN THEN Start ;Bij het indrukken van beide toetsen start het programma opnieuw (RC5/RC6 is opnieuw in te stellen) DELAYMS 82 ;Pauze tussen de IR-zendingen WEND ENDIF GOTO Opnieuw IR_Ontvangst: WD1 = 0 WHILE IR_Ontvanger = AAN AND WD1 < 65500 ;65500 zorgt ervoor dat het programma niet blijft hangen als de IR_Ontvanger altijd AAN blijft INC WD1 WEND CodeRC5X = FALSE ;Reset RC5 / RC5X indicator CodeRC6 = FALSE ;Reset RC5 / RC6 indicator ;Zoek uit welk protocol ----- !!!!!!! WD1, gebaseerd op 10MHz kristal !!!!!!!!!!!!!!! SELECT CASE WD1 CASE < Glitch ;Glitch... GOTO Opnieuw ;... dus opnieuw meten CASE 45 TO 60 ;RC5 DELAYUS 2125 ;1750 - 2500; RC5 CASE 90 TO 110 ;RC5X CodeRC5X = TRUE DELAYUS 1280 ;900 - 1700; RC5X CASE 130 TO 180 ;RC6 CodeRC6 = TRUE CASE ELSE ;Geen van de juiste codes? Dan Opnieuw GOTO Opnieuw END SELECT ;---------------------------- CommandOud_O = Command_O ;Bewaar oude waarden voor herstel in geval van een ontvangst error SysteemOud_O = Systeem_O Command_O = 0 ;Eerst 0 maken omdat RC5/RC5X bits 6 & 7 niet overschrijft, als RC6 deze eerder hoog heeft gemaakt, blijven deze hoog (=fout) Systeem_O = 0 ;Eerst 0 maken omdat RC5/RC5X bits 5,6,7 niet overschrijft, als RC6 deze eerder hoog heeft gemaakt, blijven deze hoog (=fout) LED_Groen = AAN ;Een IR signaal ontvangen 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 WHILE LED_Toggle = 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_O.7 = Waarde GOSUB BitOphalen : Systeem_O.6 = Waarde GOSUB BitOphalen : Systeem_O.5 = Waarde ELSE GOSUB BitOphalen : LED_Toggle = Waarde ENDIF GOSUB BitOphalen : Systeem_O.4 = Waarde GOSUB BitOphalen : Systeem_O.3 = Waarde GOSUB BitOphalen : Systeem_O.2 = Waarde GOSUB BitOphalen : Systeem_O.1 = Waarde GOSUB BitOphalen : Systeem_O.0 = Waarde IF CodeRC6 = TRUE THEN ;RC5 heeft geen 6e en 7e bits GOSUB BitOphalen Command_O.7 = Waarde GOSUB BitOphalen Command_O.6 = Waarde ENDIF GOSUB BitOphalen Command_O.5 = Waarde GOSUB BitOphalen Command_O.4 = Waarde GOSUB BitOphalen Command_O.3 = Waarde GOSUB BitOphalen Command_O.2 = Waarde GOSUB BitOphalen Command_O.1 = Waarde GOSUB BitOphalen Command_O.0 = Waarde IF CodeRC5X = TRUE THEN Command_O.6 = 1 ;De 6e bit moet in geval van RC5X nog ingesteld worden IF Systeem_O <> SysteemOud_O OR Command_O <> CommandOud_O OR CodeRC6 <> CodeRC6Oud OR UpdateLCD = FALSE 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 ProtocolLCD ;Tijd voor aanduiding RC5, RC5X of RC6 protocol IF CodeRC6 = TRUE THEN RC5_Mode = FALSE ELSE RC5_Mode = TRUE ENDIF Command = Command_O ;Geef Ontvang-Commandwaarde aan Command voor weergave op display Systeem = Systeem_O ;Geef Ontvang-Systeemwaarde aan Systeem voor weergave op display CLS GOSUB Display UpdateLCD = TRUE ;LCD is weer bijgewerkt ; Systeem_Z = Systeem_O ;De ontvangen code kan nu meteen ook met dit apparaat (110820) verzonden worden... Command_Z = Command_O ;...dit blok code verwijderen als de ontvangen code niet door het zendgedeelte moeten worden overgenomen ToggBit_Z = ToggBit_O Plus = TRUE ;Na ontvangst van een IR code gaat de zender-adres-instellings-teller eerst omhoog tellen IF CodeRC6 = TRUE THEN ;Om de ontvangen code ook uit te kunnen zenden ook het protocol van het zendgedeelte aanpassen (=variabele RC5_Mode) RC5_Mode = FALSE ELSE RC5_Mode = TRUE ENDIF ; ENDIF GOTO Opnieuw ErrorOntvangst: LED_Groen = UIT LED_Rood = AAN ;Geen RC5/RC6 code of ontvangst niet optimaal DELAYMS LED_Tijd Command_O = CommandOud_O ;Geef Command en Systeem oude waarde terug Systeem_O = SysteemOud_O GOTO Opnieuw Start: ;Als 'INSTEL' en 'ZEND' tegelijk ingedrukt worden CLS PRINT "Herstart" WHILE Instel = AAN OR Zend = AAN: WEND ;Wacht tot beide toetsen zijn losgelaten GOTO HerStart ;ASSEMBLER ROUTINES RC5_Code: ASM ;Zend een compleet RC5 code call TxEenRC5 ;Header btfss Command_Z,6 ;Geinverteerde command bit call TxEenRC5 btfsc Command_Z,6 call TxNulRC5 ;Togglebit btfsc ToggBit_Z call TxEenRC5 btfss ToggBit_Z call TxNulRC5 ;Systeembit (A4,3,2,1,0)Adres btfsc Systeem_Z,4 call TxEenRC5 btfss Systeem_Z,4 call TxNulRC5 btfsc Systeem_Z,3 call TxEenRC5 btfss Systeem_Z,3 call TxNulRC5 btfsc Systeem_Z,2 call TxEenRC5 btfss Systeem_Z,2 call TxNulRC5 btfsc Systeem_Z,1 call TxEenRC5 btfss Systeem_Z,1 call TxNulRC5 btfsc Systeem_Z,0 call TxEenRC5 btfss Systeem_Z,0 call TxNulRC5 ;Commandbit (D5,4,3,2,1,0) Data btfsc Command_Z,5 call TxEenRC5 btfss Command_Z,5 call TxNulRC5 btfsc Command_Z,4 call TxEenRC5 btfss Command_Z,4 call TxNulRC5 btfsc Command_Z,3 call TxEenRC5 btfss Command_Z,3 call TxNulRC5 btfsc Command_Z,2 call TxEenRC5 btfss Command_Z,2 call TxNulRC5 btfsc Command_Z,1 call TxEenRC5 btfss Command_Z,1 call TxNulRC5 btfsc Command_Z,0 call TxEenRC5 btfss Command_Z,0 call TxNulRC5 return ;Zend een 0 (on-off) TxNulRC5 call LichtAanRC5 call LichtUitRC5 return ;Zend een 1 (off-on) TxEenRC5 call LichtUitRC5 call LichtAanRC5 return ;IR-LED uit LichtUitRC5 movlw 255 ;RC5 heeft 255 (xtal:10MHz) tijdseenheden IR-LED uit movwf Cycl_2 LichtUit2RC5 nop ;Korte vertragingen nop nop nop nop nop decfsz Cycl_2,f goto LichtUit2RC5 return ;IR-LED aan (pulserend) LichtAanRC5 movlw 32 ;RC5 geeft 32 snelle IR-LED pulsjes voor een '1' movwf Cycl_1 ;32 Cyclussen van een pauze en een puls LichtAan1RC5 ;Pauze nop movlw 15 ;Tijd voor (Xtal:10MHz) pauze tussen IR-LED blink movwf Cycl_2 LichtAan2RC5 decfsz Cycl_2,f goto LichtAan2RC5 ;Puls bsf IrOut ;IR-LED aan movlw 5 ;Tijd voor (Xtal:10MHz) IR-LED blink movwf Cycl_2 LichtAan3RC5 decfsz Cycl_2,f goto LichtAan3RC5 bcf IrOut ;IR-LED uit decfsz Cycl_1,f goto LichtAan1RC5 return ENDASM RC6_Code: ASM ;Zend een compleet RC6 code ;Startbits (Header) call LichtAan call LichtAan call LichtAan call LichtAan call LichtAan call LichtAan call LichtUit call LichtUit call TxEen call TxNul call TxNul call TxNul ;Togglebits btfss ToggBit_Z ;Togglebit beurtelings 1100 en 0011 call LichtAan btfss ToggBit_Z call LichtAan call LichtUit call LichtUit btfsc ToggBit_Z call LichtAan btfsc ToggBit_Z call LichtAan ;Systeembyte (A7,6,5,4,3,2,1,0) Adres btfsc Systeem_Z,7 call TxEen btfss Systeem_Z,7 call TxNul btfsc Systeem_Z,6 call TxEen btfss Systeem_Z,6 call TxNul btfsc Systeem_Z,5 call TxEen btfss Systeem_Z,5 call TxNul btfsc Systeem_Z,4 call TxEen btfss Systeem_Z,4 call TxNul btfsc Systeem_Z,3 call TxEen btfss Systeem_Z,3 call TxNul btfsc Systeem_Z,2 call TxEen btfss Systeem_Z,2 call TxNul btfsc Systeem_Z,1 call TxEen btfss Systeem_Z,1 call TxNul btfsc Systeem_Z,0 call TxEen btfss Systeem_Z,0 call TxNul ;Commandbyte (D7,6,5,4,3,2,1,0) Data btfsc Command_Z,7 call TxEen btfss Command_Z,7 call TxNul btfsc Command_Z,6 call TxEen btfss Command_Z,6 call TxNul btfsc Command_Z,5 call TxEen btfss Command_Z,5 call TxNul btfsc Command_Z,4 call TxEen btfss Command_Z,4 call TxNul btfsc Command_Z,3 call TxEen btfss Command_Z,3 call TxNul btfsc Command_Z,2 call TxEen btfss Command_Z,2 call TxNul btfsc Command_Z,1 call TxEen btfss Command_Z,1 call TxNul btfsc Command_Z,0 call TxEen btfss Command_Z,0 call TxNul return ;Zend een 0 (off-on) (RC6 = omgekeerd aan RC5) TxNul call LichtUit call LichtAan return ;Zend een 1 (on-off) (RC6 = omgekeerd aan RC5) TxEen call LichtAan call LichtUit return ;IR-LED uit LichtUit movlw 225 ;RC6 heeft 225 (xtal:10MHz) tijdseenheden IR-LED uit movwf Cycl_2 LichtUit2 nop nop decfsz Cycl_2,f goto LichtUit2 return ;IR-LED aan (pulserend) LichtAan movlw 16 ;RC6 geeft 16 snelle IR-LED pulsjes voor een '1' movwf Cycl_1 ;16 Cyclussen van een pauze en een puls LichtAan1 ;Pauze nop movlw 15 ;Tijd voor (Xtal:10MHz) pauze tussen IR-LED blink movwf Cycl_2 LichtAan2 decfsz Cycl_2,f goto LichtAan2 ;Puls bsf IrOut ;IR-LED aan movlw 5 ;Tijd voor (Xtal:10MHz) IR-LED blink movwf Cycl_2 LichtAan3 decfsz Cycl_2,f goto LichtAan3 bcf IrOut ;IR-LED uit decfsz Cycl_1,f goto LichtAan1 return ENDASM ;V4: RC5 command binary display fixed (7 bits ipv. 6 bits)