;V-2 ;Voor aansluitschema zie website www.picbasic.nl ; PIC12F629: +--v--+ ; +5V [ ] GND ; STANDBY toets |---/--- >[ ]> -[4k7]---NPN transistor IR LED ; PROGRAMMA- toets |---/--- >[ ]< ---/---| toets VOLUME- ; pull-up! PROGRAMMA+ toets |---/--- >[ ]< ---/---| toets VOLUME+ ; - +-----+ - ;There is an English version too / Er is ook een Engelse versie ;www.picbasic.nl / Frits Kieftenbelt, Raalte, Netherlands (Frizie) DEVICE 12F629 CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, MCLRE_OFF ALL_DIGITAL TRUE ;Normale aliases (constanten) SYMBOL AntiDender = 5 ;mSec: Druktoets anti-dender tijd SYMBOL ProgramHoger= 32 ;Toets Programma + SYMBOL ProgramLager= 33 ;Toets Programma - SYMBOL StandBy = 12 ;Toets Stand-by SYMBOL VolumeHoger = 16 ;Toets Volume + SYMBOL VolumeLager = 17 ;Toets Volume - ;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 = GPIO.0 ;Infra Rood LED. Versterken via 4k7 weerstand aan NPN transistor (bv. BC547 en 47 Ohm aan IR-LED) ; 76543210 TRISIO = %11111110 PORTB_PULLUPS ON ;BYTE DIM Command AS BYTE ;Bevat de RC5 command code die verzonden moet worden DIM Cycl_1 AS BYTE ;Voor ASM routine DIM Cycl_2 AS BYTE ;Voor ASM routine DIM Systeem AS BYTE ;Bevat de RC5 systeem code die verzond moet worden DIM Toets AS BYTE ;Bevat de waarde van de ingangen (de toetsen) ;BIT DIM ToggleBit AS BIT ;Togglebit van RC5 PORTB = 0 CLEAR Systeem = 0 ;Hier het systeemadres invullen (0 = TV) (Systeem niet als constante definieren, maar als byte variabele) IF GPIO.5 = AAN THEN STOP ;Als tijdens spanning inschakelen de StandBy toets is ingedrukt, dan stopt de PIC, voor PIC her-programmeren ;HOOFD PROGRAMMA Opnieuw: REPEAT Toets = (GPIO & %00111110) ;Lees alleen de ingangen UNTIL Toets <> 62 ;Wacht op een toets indruk DELAYMS AntiDender ;Tegen contactdender van de toetsen IF Toets <> (GPIO & %00111110) THEN Opnieuw ;Niet hetzelfde? Dan was het waarschijnlijk een glitch, scan toetsen Opnieuw IF (Toets & %00000010) = AAN THEN Command = VolumeLager IF (Toets & %00000100) = AAN THEN Command = VolumeHoger IF (Toets & %00001000) = AAN THEN Command = ProgramHoger IF (Toets & %00010000) = AAN THEN Command = ProgramLager IF (Toets & %00100000) = AAN THEN Command = StandBy ToggleBit = ToggleBit ^ 1 ;Toggle het RC5 togglebit WHILE (GPIO & %00111110) <> 62 ;Zolang een toets is ingedrukt, blijven zenden GOSUB RC5_Code ;Roep RC5 assembler routine DELAYMS 82 ;Pauze tussen de IR-zendingen WEND GOTO Opnieuw ;ASSEMBLER ROUTINE 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'100' ;RC5 heeft 100 (255 als 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'4' ;Tijd voor (15 als 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'1' ;Tijd voor (5 als 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 ;V-2 wijziging t.o.v. V-1: ;Systeem als constante (SYMBOL) werkt niet (werkt alleen als Systeem = 0) ;Vanaf V-2 is Systeem een BYTE-variabele