'**************************************************************** '* Name : UNTITLED.BAS * '* Author : Bob Merens. * '* Notice : Copyright (c) 2010 Opabob * '* : All Rights Reserved * '* Date : 24/03/2010 * '* Version : 1.0 * '* Notes : * '* : ;www.picbasic.nl / Frits Kieftenbelt, Raalte, Netherlands (Frizie) * '**************************************************************** ;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) ;Aangepast volgens Elektronica Stynus RGB led DEVICE 16F628 ;REMINDERS OFF CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_On;, CP ; BODEN_OFF, CPD;Geen kristal, PORTA.5(was 3) = input 'CONFIG XT_OSC, WDT_OFF, PWRTE_ON, BODEN_OFF, MCLRE_OFF ;Geen kristal, PORTA.(was 3) 5 = 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.2 ;AFREGELEN: ONTVANGST-LED MOET NA 1 MINUUT OPLICHTEN ;DELAYMS 60000 ;LOW PORTA.2 ; 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 Uitgang0 = PORTA.3 ;Pin 2 ;SYMBOL Uitgang1 = PORTA.2 ;Pin 1 ;SYMBOL Uitgang2 PORTA.1 ;Pin 18 ;SYMBOL Uitgang3 = PORTA.1 ;Pin 17 ;SYMBOL Uitgang4 = PORTA.0 ;Pin 16 ;SYMBOL Uitgang5 = PORTA.7 ;Pin 15 ;SYMBOL Uitgang6 = PORTA.6 ;Pin 13 ;SYMBOL Uitgang7 = PORTB.7 ;Pin 12 ;SYMBOL Uitgang8 = PORTB.6 ;Pin 11 ;SYMBOL Uitgang9 = PORTB.5 ;Pin 10 ;SYMBOL Uitgang10 = PORTB.4 ;Pin 9 ;SYMBOL Uitgang11 = PORTB.3 ;Pin 8 ;SYMBOL Uitgang12 = PORTB.2 ;Pin 7 ;Porta.5 Reserve ;Aangepast aan K8048 SYMBOL Uitgang0 = PORTB.0 ;Pin 6 SYMBOL Uitgang1 = PORTB.1 ;Pin 7 SYMBOL Uitgang2 PORTB.2 ;Pin 8 SYMBOL Uitgang3 = PORTB.3 ;Pin 9 SYMBOL Uitgang4 = PORTB.4 ;Pin 10 SYMBOL Uitgang5 = PORTB.5 ;Pin 11 ;SYMBOL Uitgang6 = PORTb.6 ;Pin 13 SYMBOL LED = PORTA.3 ;Pin 2 Led met 1k weerstand aansluiten tussen port RB0 en GND SYMBOL IR_Ontvanger = PORTA.2 ;Pin 1 TSOP1736 Uitgang ; 76543210 ;PORTA = %001 00100 ;Alle uitgangen 0 maken ;PORTB = %00000000 TRISA = %00100100 ; PortA.2 Ingang IR signaal ,PortA.5 Ingang en niet gebruikt, Overige PortA Uitgangen TRISB = %00000000 ; PortB allemaal uitgangen ;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 EDATA DefaultSys CLEAR 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 ;Uitgang5 = on ; TEST 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 ;Uitgang5 = OFF ;Uitgang6 = OFF ;Alle uitgangen uitzetten als geen toets is ingedrukt ;Uitgang7 = OFF ;Uitgang8 = OFF ;Uitgang10 = OFF ;Uitgang11 = OFF ;Uitgang12 = OFF ;Alle uitgangen uitzetten als geen toets is ingedrukt ;Uitgang13 = 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 Bij PULSE VERSIE ;portb.5 = ON ; TEST 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 10: Uitgang10 = ON ;CASE 11: Uitgang11 = ON ;CASE 12: Uitgang12 = ON ; CASE 13: Uitgang13 = 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 ; NAKIJKEN 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