;V-3 verbeterde versie ;Compileren met Crownhill Proton+ PIC Basic compiler. ;Dit programma kan 10 verschillende dingen draadloos aansturen met een normale ;TV-afstandsbediening met het RC5 protocol, van merken als Philips en Marantz. ;Gebruik als volgt: ;Zorg ervoor dat de TSOP1736 is aangesloten op pin 4 en een LED met serieweerstand tussen pin 2 en GND. ;Bij inschakelen van de spanning moet de LED een halve seconde opblinken, ten teken dat het PIC programma opstart. ;Test nu eerst of de PIC werkt met de afstandsbediening ingesteld op systeem 'TV'. ;De afstandsbediening op systeem 'TV' mode zetten en dan kan met de toetsen 0 t/m 9, ; 10 uitgangen worden aan- en uit-gezet. ;Is er nog een systeem vrij op de afstandsbediening (VCR2, SAT, AMP, DCC) dan is de ;systeemcode in de PIC via de afstandsbediening te wijzigen op een ander systeem. ;Dat gaat als volgt: ;Schakel de spanning van de PIC uit ;Wees er zeker van dat de spanning echt 0V is (meten!), ; door elco's kan de spanning er nl. even opblijven waardoor de PIC niet wordt gereset. ;Elco's eventueel ontladen via een weerstand, niet door kortsluiten, de PIC kan hierdoor onherstelbaar worden beschadigd. ;Selecteer een ongebruikte systeem op de afstandsbediening (bijv. VCR2, SAT, AMP of DCC). ;(Denk er aan dat de toetsen (0-9) in systeem TAPE bij de meeste afstandsbedieningen niets uitzenden.) ;Blijf een toets (0-9) op de afstandsbediening ingedrukt houden en schakel de spanning van de PIC weer in. ;De LED zal nu een paar keer langzaam knipperen en daarna blijven branden. ;Door nu opnieuw op een toets (0-9) van de afstandsbediening te drukken ; wordt het systeem dat op dat moment is ingesteld op de afstandsbediening, door de PIC overgenomen. ;Als de LED een paar keer snel knippert dan is het nieuwe systeem in de EEPROM geprogrammeerd. ;Nu werken de toetsen 0-9 alleen als de afstandsbediening in de zojuist gekozen systeemmode staat. ;De LED brand continue als er een geldige toets van een geldig systeem wordt ontvangen ; en knippert als er een ongeldige IR-code wordt ontvangen. ;In dit programma wordt onder Systeem apparaten als TV, VCR, TAPE, SAT, enz. verstaan. ;Onder Command wordt verstaan de toetsen op de afstandsbediening als 0-9, P Uitgang 1 ; Uitgang 0 <[ ]> Uitgang 2 ; Signaal van de TSOP1736 >[ ]> Uitgang 3 ; Uitgang 9 <[ ]> Uitgang 4 ; Uitgang 8 <[ ]> Uitgang 5 ; Uitgang 7 <[ ]> Uitgang 6 ; +-----+ ;There is an English version too / Er is ook een Engelse versie. ;www.picbasic.nl / Frits Kieftenbelt, Raalte, Netherlands (Frizie) DEVICE 16F630 REMINDERS OFF CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, BODEN_OFF, MCLRE_OFF, CPD, CP ;Geen kristal, PORTA.3 = input 'CONFIG XT_OSC, WDT_OFF, PWRTE_ON, BODEN_OFF, MCLRE_OFF ;Geen kristal, PORTA.3 = input REMINDERS ON ALL_DIGITAL TRUE OSCCAL = $34 ;Kijk met Bumblebee naar adres 03FF ;HOE GROTER OSCCAL-WAARDE, HOE SNELLER DE TIJD VOORBIJ IS ' delayms 1000 ;PAS NA 1 SECONDE DE LED AAN ZODAT ZEKER IS DAT DE PIC VOORAAN START (GERESET IS) ' high PORTA.5 ;AFREGELEN: ONTVANGST-LED MOET NA 1 MINUUT OPLICHTEN ' delayms 60000 ' low PORTA.5 ' end '58 34 ;Normale aliases (constanten) SYMBOL BlinkAantal = 10 ;Max 127: Aantal LED blinken ten teken: systeem code ingeprogrammeerd SYMBOL BlinkTijd = 500 ;mSec: Snelheid van het blinken van de LED bij PIC in programmeermode (systeem wijziging in programmeren) SYMBOL BlinkTijdSnel= 150 ;mSec: Snelheid van het blinken van de LED bij systeem code programmeren (systeem is gewijzigd) SYMBOL DefaultSys = 0 ;0 = TV: Bij allereerste keer na programmeren van PIC, is systeem TV SYMBOL Glitch = 52 ;Max 255: Onderdrukken storingstijd (glitches) SYMBOL Ok = 50 ;Max 255: Controletijd of RC5 code goed wordt ontvangen SYMBOL Sample = 300 ;Als alle samples UIT zijn dan is de toets van de afstandsbediening losgelaten ;Logische aliases (constanten) SYMBOL AAN = 0 ;Omgekeerd ON SYMBOL FALSE = 0 SYMBOL HOOG = 1 SYMBOL LAAG = 0 SYMBOL OFF = 0 SYMBOL ON = 1 SYMBOL TRUE = 1 SYMBOL UIT = 1 ;Omgekeerd OFF ;Poort aliases SYMBOL Uitgang1 = PORTA.0 ;Pin 13 SYMBOL Uitgang2 = PORTA.1 ;Pin 12 SYMBOL Uitgang3 = PORTA.2 ;Pin 11 SYMBOL IR_Ontvanger = PORTA.3 ;Pin 4: TSOP1736 SYMBOL Uitgang0 = PORTA.4 ;Pin 3 SYMBOL LED = PORTA.5 ;Pin 2: LED met 1k serie-weerstand aansluiten tussen PORT en GND SYMBOL Uitgang4 = PORTC.0 ;Pin 10 SYMBOL Uitgang5 = PORTC.1 ;Pin 9 SYMBOL Uitgang6 = PORTC.2 ;Pin 8 SYMBOL Uitgang7 = PORTC.3 ;Pin 7 SYMBOL Uitgang8 = PORTC.4 ;Pin 6 SYMBOL Uitgang9 = PORTC.5 ;Pin 5 ;WORD DIM WD1 AS WORD ;Word Dummy ;BYTE DIM Command AS BYTE DIM Systeem AS BYTE DIM BD1 AS BYTE ;Byte Dummy ;BIT DIM FoutOntvangst AS BIT DIM ProgramMode AS BIT ;Wordt TRUE als bij opstarten meteen al een RC5 binnenkomt DIM ToggBit AS BIT ;ToggBit wordt hier verder niet gebruikt, is een deel van de RC5 code DIM Waarde AS BIT DIM ID1 AS BIT ;bIt Dummy ; 76543210 PORTA = %00000000 PORTC = %00000000 TRISA = %00001000 TRISC = %00000000 EDATA DefaultSys CLEAR DELAYMS 100 ;Stabilisering signalen GOSUB AllesUit ;Alle uitgangen laag LED = ON ;Kenmerk dat de processor loopt, LED even aan/uit DELAYMS 400 ;IR-ontvanger stabilisering, tevens LED aan/uit tijd FOR BD1 = 1 TO 255 ;Meteen checken of er wat wordt ontvangen (= programmeermode) kan net in een dood punt vallen, daarom vaker meten IF IR_Ontvanger = AAN THEN ProgramMode = TRUE DELAYUS 500 NEXT LED = OFF IF ProgramMode = TRUE THEN ;Als in programmeermode, dan... FOR BD1 = 1 TO 9 ;LED even laten knipperen en daarna laten branden ten teken dat de programmeermode actief is LED = ~LED DELAYMS BlinkTijd NEXT GOSUB WachtOpToetsLosLaten ENDIF GOTO Start ;Subroutines AllesUit: Uitgang0 = OFF ;Alle uitgangen uitzetten als geen toets is ingedrukt Uitgang1 = OFF Uitgang2 = OFF Uitgang3 = OFF Uitgang4 = OFF Uitgang5 = OFF Uitgang6 = OFF Uitgang7 = OFF Uitgang8 = OFF Uitgang9 = OFF IF ProgramMode = FALSE THEN LED = OFF RETURN BitOphalen: Waarde = IR_Ontvanger ;Maak Waarde 0 of 1 afhankelijk van ontvangen IR code BD1 = 0 WHILE IR_Ontvanger = Waarde AND BD1 < Ok;Niveau moet binnen een bepaalde tijd veranderen INC BD1 WEND IF Ok = BD1 THEN FoutOntvangst = TRUE ;Error in ontvangst, niet binnen de tijd een niveau-verandering (Geen RC5 of slechte ontvangst) DELAYUS 1000 RETURN WachtOpToetsLosLaten: WD1 = Sample WHILE WD1 > 0 ;Wacht zolang de toets van de afstandsbediening is ingedrukt, als 300 samples niets is ontvangen, dan is toets losgelaten DEC WD1 IF IR_Ontvanger = AAN THEN WD1 = Sample ;Opnieuw beginnen met samples tellen DELAYUS 500 ;300 x 500us = 150ms WEND RETURN ;Hoofdprogramma Start: GOSUB AllesUit ;Alle uitgangen laag WHILE IR_Ontvanger = UIT : WEND ;Wacht op ontvangst BD1 = 0 WHILE IR_Ontvanger = AAN AND BD1 < Glitch INC BD1 WEND IF BD1 < Glitch THEN Start ;Error in ontvangst (Geen RC5 code of glitch) LED = ON ;IR-signaal ontvangen DELAYUS 600 ;900 - 300: Header van RC5 vermijden GOSUB BitOphalen : Command.6 = ~Waarde ;Extended bit (geinverteerd) GOSUB BitOphalen : ToggBit = Waarde 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 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 FoutOntvangst = TRUE THEN ;Error in ontvangst, niet binnen de tijd een niveau-verandering (Geen RC5 of slechte ontvangst) FoutOntvangst = FALSE ;Reset GOTO Start ;Lus niet verder uitvoeren ENDIF IF ProgramMode = TRUE THEN Programmeren ;Ander systeem in programmeren IF Systeem = EREAD 0 THEN ;Alleen uitvoeren als het ontvangen systeem gelijk is aan het voorgeprogrammeerde systeem SELECT CASE Command ;De bijbehorende uitgang aanzetten CASE 0: Uitgang0 = ON CASE 1: Uitgang1 = ON CASE 2: Uitgang2 = ON CASE 3: Uitgang3 = ON CASE 4: Uitgang4 = ON CASE 5: Uitgang5 = ON CASE 6: Uitgang6 = ON CASE 7: Uitgang7 = ON CASE 8: Uitgang8 = ON CASE 9: Uitgang9 = ON CASE ELSE GOTO Start ;Anders blijft LED continue branden als Systeem = EREAD 0, maar niet toets 0 - 9, hoort niet END SELECT GOSUB WachtOpToetsLosLaten ENDIF GOTO Start Programmeren: ;Nieuw systeem inprogrammeren EWRITE 0, [Systeem] ;Sla het systeem op ProgramMode = FALSE FOR BD1 = 1 TO BlinkAantal * 2 LED = ~LED ;Laat LED een paar maal knipperen DELAYMS BlinkTijdSnel NEXT GOSUB WachtOpToetsLosLaten GOTO Start