;V-2 ;Met dit programma kan elke mogelijke code van het RC5 en RC6 protocol worden verzonden ; of kan het remote gedeelte van TV en stereo-apparatuur getest worden. ;Ook kan een "programmeerbare" afstandsbediening (zoals de Pronto Neo van Philips) met ; nieuwe codes geprogrammeerd worden. ;Op een HD44780 display is af te lezen welke RC5X of RC6 systeem en command code er ; verzonden kan worden. ;Eerst moet met de 'INSTEL' toets RC5 of RC6 worden ingesteld, na de juiste keuze op de ; 'ZEND' toets drukken. ;Om de command waarde in te stellen moet op de 'INSTEL' toets, aangesloten op PORTB.0, ; worden gedrukt. Als deze toets langer word ingedrukt veranderd de teller van richting. ;Wordt deze 'INSTEL' toets NOG langer vastgehouden dan loopt de teller automatisch en ; steeds sneller. ;Door PORTB.1 laag te maken wordt op bovenstaande manier niet de command code, maar het ; RC5 of RC6 systeem-adres ingesteld, het systeem-adres wordt opgeslagen in EEPROM. ;De ingestelde RC5 of RC6 code wordt verzonden als PORTB.2 'ZEND' laag wordt gemaakt. ;Als de 'INSTEL' en 'ZEND' toets tegelijk ingedrukt worden, start het programma opnieuw ; en is opnieuw de keus tussen RC5 en RC6 te maken. ;Let op: De EN en RS pinnen van het LCD zitten hier op PORTA.0 en A.1, niet op PORTB. ;Voor aansluitschema zie website www.picbasic.nl ; PIC16F628A: +--v--+ ; NPN transistor IR LED ---[4k7]--- <[ ]> RS LCD ; [ ]> EN LCD ; [ ]< X-tal 10MHz ; Via weerstand aan +5V ---[33k]--- >[ ]< X-tal 10MHz ; GND [ ] +5V ; INSTEL toets |---/--- >[ ]> DB7 LCD ; Systeem instel schakelaar |---/--- >[ ]> DB6 LCD ; ZEND toets |---/--- >[ ]> DB5 LCD ; | [ ]> 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 HS_OSC, WDT_OFF, PWRTE_ON, BODEN_OFF, LVP_OFF XTAL 10 ALL_DIGITAL TRUE ;Zet poort A naar all-digital ;Normale aliases (constanten) SYMBOL AntiDender = 5 ;mSec: Druktoets anti-dender tijd SYMBOL EE_Mode = 0 ;EEPROM adres waar staat welke mode (RC5X of RC6) het laatst is gebruikt SYMBOL EE_RC5 = 1 ;EEPROM adres voor RC5 systeem-adres SYMBOL EE_RC6 = 2 ;EEPROM adres voor RC6 systeem-adres SYMBOL StartRepeat = 200 ;Max.255: Tijd dat INSTEL toets ingedrukt moet worden voordat het gaat repeteren SYMBOL StartTijd = 250 ;Max.255: De startsnelheid van het repeteren bij het ingedrukt houden van de INSTEL toets SYMBOL Versnelling = 10 ;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 ;Poort aliases, bij wijzigen ook TRIS checken SYMBOL IrOut = PORTA.2 ;Infra Rood LED. Versterken via 10k weerstand aan NPN transistor (bv. BC547 en 47 Ohm aan IR-LED) SYMBOL Instel = PORTB.0 ;Adres verhogen of verlagen (beurtelings) (afhankelijk van bit Plus) SYMBOL PRG_Systeem = PORTB.1 ;Als deze poort laag is dan is het 'systeem'adres in te stellen SYMBOL Zend = PORTB.2 ;Zend de ingestelde RC5 of RC6 code door deze poort laag te maken ; 76543210 TRISA = %11110001 TRISB = %11111111 PORTB_PULLUPS ON 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 ;BYTE DIM Command 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 MaxCommand AS BYTE DIM MaxSysteem AS BYTE DIM RepeteerTijd AS BYTE ;De repeteertijd (die steeds sneller gaat) bij het vasthouden van de INSTEL toets DIM Systeem 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 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 of command adres automatisch DIM ToggleBit AS BIT ;Togglebit van RC5 en RC6 HerStart: ;Als 'INSTEL' en 'ZEND' tegelijk ingedrukt worden herstart het programma vanaf hier PORTA = 0 PORTB = 0 CLEAR DELAYMS 500 ;LC-Display stabilisering CLS: PRINT "IR Zender NL V-1" ;Programma naam en versie PRINT AT 2, 1, "www.picbasic.nl" DELAYMS 2000 ;Tijd voor bericht op LCD IF PRG_Systeem = AAN THEN ;Als het systeem-instel (nog) staat ingesteld dan moet dat eerst ongedaan worden gemaakt (beveiliging voor de gebruiker zelf) CLS :PRINT "PORTB.1 mag nu" PRINT AT 2, 1, "niet laag zijn" WHILE PRG_Systeem = AAN: WEND ;Wacht tot PORTB.1 vrij is gemaakt DELAYMS 50 ENDIF EDATA 0, 0, 0 ;Allereerste keer (na programmeren PIC) staat systeem-adressen op 0 en in RC6 mode 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: WEND ;Wacht hier tot er geen toets is ingedrukt WHILE Instel = UIT AND Zend = UIT :WEND ;Wacht op een toets indruk 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 Systeem = EREAD EE_RC5 ;Stel systeem op laatst gebruikte RC5 adres ELSE ;anders RC6 MaxCommand = 255 MaxSysteem = 255 Systeem = EREAD EE_RC6 ;Stel systeem op laatst gebruikte RC6 adres ENDIF Command = 1 ;Opstartwaarde Command Plus = TRUE ;De eerste keer omhoog tellen GOSUB Display GOTO Opnieuw ;Spring over subroutines ;SUBROUTINES Display: PRINT AT 1, 1, "Sys:", DEC Systeem, " " PRINT AT 1, 9, BIN Systeem, " " PRINT AT 2, 1, "Com:", DEC Command, " " PRINT AT 2, 9, BIN Command, " " 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: WHILE Zend = UIT AND Instel = UIT;Wacht op een toets indruk RepeteerTijd = StartTijd Repeteren = FALSE WEND DELAYMS AntiDender ;Tegen contactdender van de toetsen IF Zend = UIT AND Instel = UIT THEN Opnieuw 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) 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 < MaxSysteem THEN INC Systeem ;Verhoog systeem-adres met 1 ELSE Systeem = 0 ENDIF ELSE ;Als systeem-adres NIET wordt ingesteld dan command code instellen IF Command < MaxCommand THEN INC Command ;Verhoog command code met 1 ELSE Command = 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 > 0 THEN ;Als het systeem-adres nog niet 0 is dan... DEC Systeem ;...verlaag systeem-adres met 1 ELSE Systeem = MaxSysteem ENDIF ELSE ;Als systeem-adres NIET wordt ingesteld dan command code instellen IF Command > 0 THEN DEC Command ;Verlaag met 1 ELSE Command = MaxCommand ENDIF ENDIF ENDIF 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;De eerste keer een extra tijd (om toets na omkeren van richting los te kunnen laten) Tijd = 250 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 EWRITE EE_RC5, [Systeem];Schrijf het RC5 systeem-adres in EEPROM ELSE EWRITE EE_RC6, [Systeem];Schrijf het RC6 systeem-adres in EEPROM ENDIF ENDIF ToggleBit = ToggleBit ^ 1 ;Toggle het RC5/RC6 togglebit WHILE Zend = AAN IF RC5_Mode = TRUE THEN ;Als RC5_Mode = TRUE dan... GOSUB RC5_Code ;...roep RC5 assembler routine... ELSE ;...anders... GOSUB RC6_Code ;...roep RC6 assembler routine ENDIF 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 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,6 ;Geinverteerde command bit call TxEenRC5 btfsc Command,6 call TxNulRC5 ;Togglebit btfsc ToggleBit call TxEenRC5 btfss ToggleBit call TxNulRC5 ;Systeembit (A4,3,2,1,0) Adres btfsc Systeem,4 call TxEenRC5 btfss Systeem,4 call TxNulRC5 btfsc Systeem,3 call TxEenRC5 btfss Systeem,3 call TxNulRC5 btfsc Systeem,2 call TxEenRC5 btfss Systeem,2 call TxNulRC5 btfsc Systeem,1 call TxEenRC5 btfss Systeem,1 call TxNulRC5 btfsc Systeem,0 call TxEenRC5 btfss Systeem,0 call TxNulRC5 ;Commandbit (D5,4,3,2,1,0) Data btfsc Command,5 call TxEenRC5 btfss Command,5 call TxNulRC5 btfsc Command,4 call TxEenRC5 btfss Command,4 call TxNulRC5 btfsc Command,3 call TxEenRC5 btfss Command,3 call TxNulRC5 btfsc Command,2 call TxEenRC5 btfss Command,2 call TxNulRC5 btfsc Command,1 call TxEenRC5 btfss Command,1 call TxNulRC5 btfsc Command,0 call TxEenRC5 btfss Command,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 D'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 D'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 D'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 D'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 ToggleBit ;Togglebit beurtelings 1100 en 0011 call LichtAan btfss ToggleBit call LichtAan call LichtUit call LichtUit btfsc ToggleBit call LichtAan btfsc ToggleBit call LichtAan ;Systeembyte (A7,6,5,4,3,2,1,0) Adres btfsc Systeem,7 call TxEen btfss Systeem,7 call TxNul btfsc Systeem,6 call TxEen btfss Systeem,6 call TxNul btfsc Systeem,5 call TxEen btfss Systeem,5 call TxNul btfsc Systeem,4 call TxEen btfss Systeem,4 call TxNul btfsc Systeem,3 call TxEen btfss Systeem,3 call TxNul btfsc Systeem,2 call TxEen btfss Systeem,2 call TxNul btfsc Systeem,1 call TxEen btfss Systeem,1 call TxNul btfsc Systeem,0 call TxEen btfss Systeem,0 call TxNul ;Commandbyte (D7,6,5,4,3,2,1,0) Data btfsc Command,7 call TxEen btfss Command,7 call TxNul btfsc Command,6 call TxEen btfss Command,6 call TxNul btfsc Command,5 call TxEen btfss Command,5 call TxNul btfsc Command,4 call TxEen btfss Command,4 call TxNul btfsc Command,3 call TxEen btfss Command,3 call TxNul btfsc Command,2 call TxEen btfss Command,2 call TxNul btfsc Command,1 call TxEen btfss Command,1 call TxNul btfsc Command,0 call TxEen btfss Command,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 D'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 D'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 D'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 D'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 ;V-2 = CONFIG toegevoegd omdat HS_OSC niet was vermeldt