;V-2 ;Compileren met Crownhill Proton+ PIC Basic compiler. ;Dit programma is voor aansturing van de "Lampicon" schemerlamp. ;Meer informatie: zie www.picbasic.nl ; ; PIC16F628A: +--v--+ ; [ ]> Lamp1 ; [ ]> Lamp2 ; [ ]> Lamp3 ; [ ]> Lamp4 ; GND [ ] +5V ; [ ]> Lamp5 ; [ ]> Lamp6 ; [ ] ;Laag voor hogere snelheid knipperen >[ ] ; +-----+ ; ;www.picbasic.nl / Frits Kieftenbelt, Raalte, Netherlands (Frizie) DEVICE 16F628A REMINDERS OFF CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, BODEN_OFF, MCLRE_OFF ;BODEN_OFF is erbij gekomen in oktober 2010 (lamp blijft dan ook werken bij zeer laag dimniveau) REMINDERS ON ALL_DIGITAL TRUE ;Logische constanten SYMBOL HOOG = 1 SYMBOL LAAG = 0 ;Normale constanten SYMBOL StapTijd = 100 ;mSec, snelheid van het opstart-effect ;Poortnamen ;Bij wijzigen ook TRIS veranderen SYMBOL Lamp2 = PORTA.0 SYMBOL Lamp1 = PORTA.1 SYMBOL Lamp4 = PORTA.6 SYMBOL Lamp3 = PORTA.7 SYMBOL Schakelaar = PORTB.3 ;Deze pin verbinden met GND verkort de tijd van 3 minuten in enkele seconden SYMBOL Lamp6 = PORTB.6 SYMBOL Lamp5 = PORTB.7 ;Variabelen declareren ;WORD DIM RND AS WORD ;Random generator dmv. RANDOM en SEED DIM x AS WORD ;Voor de randomizer ;BYTE DIM AlleLampenTijd AS BYTE ;Bij opstarten moet er een tijd zitten tussen de lampen onderling bij alles aan, normaal niet, dan alle 6 tegelijk aan DIM Lampen AS BYTE ;Makkelijker bij het programmeren van effecten DIM Teller AS BYTE ;FOR...NEXT tellervariabele ; 76543210 PORTA = %00000000 ;Maak de 8 bits van register PORTA allen laag PORTB = %00000000 ;Maak de 8 bits van register PORTB allen laag TRISA = %00111100 ;PORTA.7, A.6, A.1 en A.0 zijn uitgangen voor Lamp3, Lamp4, Lamp1 en Lamp2 TRISB = %00111111 ;PORTB.7 en B.6 zijn uitgangen voor Lamp5 en Lamp6 PORTB_PULLUPS ON ;Voor de schakelaar x = x + EREAD 0 ;x' vóór CLEAR, 'x' is dus nog niet gewist (= willekeurig!) EWRITE 0, [x] ;Schrijf het willekeurige getal in 'x' naar EEPROM adres 0 en 1 CLEAR ;Wis nu pas alle RAM geheugen x = EREAD 0 ;Laad 'x' weer met het willekeurige getal vanuit EEPROM GOTO HoofdProgramma ;Spring over de subroutines ;Subroutines AllesAan: Lamp1 = HOOG DELAYMS AlleLampenTijd Lamp2 = HOOG DELAYMS AlleLampenTijd Lamp3 = HOOG DELAYMS AlleLampenTijd Lamp4 = HOOG DELAYMS AlleLampenTijd Lamp5 = HOOG DELAYMS AlleLampenTijd Lamp6 = HOOG DELAYMS AlleLampenTijd AlleLampenTijd = 0 ;Volgende keer alle lampen tegelijk aan (Geen delay onderling) RETURN Effect: Lamp1 = Lampen.5 Lamp2 = Lampen.4 Lamp3 = Lampen.3 Lamp4 = Lampen.2 Lamp5 = Lampen.1 Lamp6 = Lampen.0 DELAYMS StapTijd RETURN Load_RND: FOR Teller = 1 TO 11 ;Toevalsgenerator 11x schudden SEED x + 2221 ;Verhoog 'x' met 2221, wat een nieuwe startwaarde oplevert x = RANDOM ;Geef willekeurige waarde aan variabele 'x' NEXT RND = x / (65535 / 20) ;Trek een getal uit 0...20 (heel af en toe 21) RETURN ;Hoofdprogramma HoofdProgramma: ;Lampnr. xx123456 ;Opstart effect Lampen = %00100000 ;Lamp1 aanzetten GOSUB Effect FOR Teller = 1 TO 5 Lampen = Lampen >> 1 GOSUB Effect NEXT FOR Teller = 1 TO 5 Lampen = Lampen << 1 GOSUB Effect NEXT AlleLampenTijd = StapTijd ;Vertraging tussen de lampen als ze allen aan gaan GOSUB AllesAan Lampen = %00011111 ;Dit effect kan ook met Lampen >> 1, maar voor wijzigingen later kun je hier allerlei effecten invullen GOSUB Effect Lampen = %00001111 GOSUB Effect Lampen = %00000111 GOSUB Effect Lampen = %00000011 GOSUB Effect Lampen = %00000001 GOSUB Effect Lampen = %00000000 GOSUB Effect AlleLampenTijd = StapTijd ;Vertraging tussen de lampen als ze allen aan gaan WHILE 1 = 1 GOSUB AllesAan ;Eventuele lamp die uit is aanzetten (alles aan dus) ; Wachten DELAYMS 200 ;Voor de korte wachttijd (hoge snelheid) IF Schakelaar = HOOG THEN DELAYMS 60000 ;Schakelaar uit (of pin niet aangesloten) dan 1 minuut wachten GOSUB Load_RND ;Ga RND met een willekeurige waarde (0...20) laden SELECT RND ;Afhankelijk van RND een lamp eventueel uitzetten CASE 1: Lamp1 = LAAG CASE 2: Lamp2 = LAAG CASE 3: Lamp3 = LAAG CASE 4: Lamp4 = LAAG CASE 5: Lamp5 = LAAG CASE 6: Lamp6 = LAAG END SELECT ; Wachten DELAYMS 500 ;Voor de korte wachttijd (hoge snelheid) IF Schakelaar = HOOG THEN ;Schakelaar uit (of pin niet aangesloten) dan 3 minuten wachten: DELAYMS 60000 ;1 minuut wachten DELAYMS 60000 ;1 minuut wachten DELAYMS 60000 ;1 minuut wachten ENDIF WEND ;V-2 ;BODEN_OFF toegevoegd