DEVICE 16F628A ;Gebruik een 16F628A type CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, BODEN_OFF, MCLRE_ON ALL_DIGITAL TRUE ;Alle ingangen digitaal ;Na 2 minuten ongebruikt in sleepmode ZONDER arm in te klappen (anders valt thee om) ;Logische constanten SYMBOL AAN = 0 SYMBOL LAAG = 0 ;Laag signaal SYMBOL HOOG = 1 ;Hoog signaal SYMBOL OFF = 0 ;UIT SYMBOL ON = 1 ;AAN SYMBOL UIT = 1 ;Algemene constanten SYMBOL AantalDip_1 = 10 ;BYTE: Aantal dat gedipt moet worden voor een nieuw zakje SYMBOL AantalDip_2 = 200 ;BYTE: Aantal dat gedipt moet worden voor een gebruikt zakje SYMBOL AantalGongs = 3 ; Bepaalt aantal gongs SYMBOL AantalSirenes= 1 ; Bepaalt aantal (korte) sirenes, vlak voordat deze inklapt SYMBOL AntiDender = 20 ;mSec: Tegen contactdender SYMBOL AutoShutOff = 12000 ;10mS: 6000 = 1 minuut, na deze tijd schakelt de PIC naar standby SYMBOL BovenDeMok = 1000 ;uSec: Waarde bepaald hoogte dat theezakje boven de mok hangt SYMBOL BoveninMok = 1040 ;uSec: Waarde bepaald hoogte dat theezakje bovenin mok zit SYMBOL InBehuizing = 2000 ;uSec: Waarde bepaald hoever de arm in de behuizing gaat (uit stand) SYMBOL OnderinMok = 1300 ;uSec: Waarde bepaald hoogte dat theezakje onderin mok zit SYMBOL PulsPauzeTijd= 20 ;mSec: Om de 20mSec een puls (= 50Hz) SYMBOL Snelheid = 5 ; Snelheid waarmee het zakje in de thee dipt (hoger = sneller) SYMBOL Snelheid2 = 2 ; Snelheid waarmee het zakje in de thee zakt en uit de thee wordt gehaald SYMBOL ToonHoogte = 2500 ;Hz : Toonhoogte van gong SYMBOL WachtSeconden= 10 ;Sec : Het aantal seconden dat servo wacht bij eerste dip, eerste bakje ;Programmaconstanten SYMBOL INTE = INTCON.4 SYMBOL INTF = INTCON.1 ;Poortnamen SYMBOL Motor = PORTA.0 ;Poort waar de pulsjes voor de servo uitkomen SYMBOL ServoPower = PORTA.1 ;Hiermee kan de servo compleet worden uitgeschakeld om batterij te sparen SYMBOL LED_Groen = PORTA.2 ;Groene LED, deze brandt als het apparaat ingeschakeld is SYMBOL LED_Rood = PORTA.3 ;Rode LED, deze brandt als het apparaat in werking is SYMBOL S1 = PORTB.0 ;Toets voor een vers bakkie thee (theezakje is nieuw) en inschakelen apparaat SYMBOL S2 = PORTB.1 ;Toets voor een tweede bakkie thee (hetzelfde theezakje) ;Variabelen declareren ;WORD DIM BatterySave AS WORD ;Teller die autoshutoff tijd telt (automatisch naar standby bij vergeten uit te doen) DIM Hertz AS WORD ;Geluidsfrequentie buzzer DIM ServoStand AS WORD ;Bevat de uSec SERVO waarde van de servomotor (tellers voor FOR...NEXT) DIM WD1 AS WORD ;Word Dummy 1 ;BYTE DIM DipAantal AS BYTE ;Bevat het gekozen aantal keer dat er gedipt moet worden DIM DipTeller AS BYTE ;Teller die telt hoevaak er is gedipt tijdens thee dippen DIM Gongs AS BYTE ;Teller die telt hoevaak gongs gaan DIM Volume AS BYTE ;'Volume' is de variabele die de volume van de buzzer regelt DIM BD1 AS BYTE ;Byte Dummy 1 ;BIT DIM EersteBakje AS BIT DIM TweedeBakje AS BIT PORTB_PULLUPS ON ;On-chip pull-up weerstanden actief (voor de toetsen) CLEAR ;Wis alle RAM geheugen ; 76543210 PORTA = %00000000 ;PORTA poorten laag PORTB = %00000000 ;PORTB poorten laag TRISA = %11110000 ;PORTA.0 is uitgang voor de servomotor, A.1 is voeding servo en PORTA.2/A.3 voor LED's TRISB = %11111111 ;(PORTB.3 wordt verderop output gemaakt om batterij te sparen) ;Hoofdprogramma GOTO SleepMode ;Bij inschakelen voedingsspanning (batterij plaatsen) de PIC meteen in sleepmode brengen Start: HPWM 1, 0, ToonHoogte ;Reset de CCP/PWM module (Op 0% = constant laag) (Moet in lus in geval van cancel inklappen) INPUT PORTB.3 ;Schakel PORTB.3 om als ingang om batterij te sparen (low-power) LED_Groen = ON ServoStand = BovenDeMok ServoPower = AAN ;Spanning op servo zetten FOR WD1 = 1 TO 80 ;80 pulsjes de tijd om naar de bovenste stand te gaan SERVO Motor, ServoStand ;Zet de hefboom in de stand die is opgegeven in 'BovenDeMok' DELAYMS PulsPauzeTijd ;'PulsPauzeTijd' is bovenin het programma opgegeven NEXT ServoPower = UIT ;Spanning van servo halen LED_Rood = OFF ;Rode LED is uit als apparaat in rust is CLEAR EersteBakje ;Reset bit CLEAR TweedeBakje ;Reset bit CLEAR BatterySave ;Reset autoshutoff teller WHILE PORTB & %00000011 = %00000011 ;Wacht tot een toets wordt ingedrukt INC BatterySave IF BatterySave = AutoShutOff THEN SleepMode ;Als apparaat even niet wordt gebruikt, dan in standby DELAYMS 10 WEND DELAYMS AntiDender ;Tijd tegen contactdender van toetsen WHILE PORTB & %00000011 < %00000011 ;Ga pas verder als de toetsen zijn losgelaten IF S1 = LAAG THEN SET EersteBakje IF S2 = LAAG THEN SET TweedeBakje WEND IF EersteBakje = HOOG AND TweedeBakje = HOOG THEN Uitzetten ;Beide toetsen ingedrukt, dan PIC in slaapmode IF EersteBakje = HOOG THEN DipAantal = AantalDip_1 ;Is het S1, dip dan AantalDip_1 keer IF TweedeBakje = HOOG THEN DipAantal = AantalDip_2 ;Is het S2, dip dan AantalDip_2 keer LED_Rood = ON ;Rode LED aan, apparaat is bezig ;Theezakje in de mok plaatsen ServoPower = AAN ;Spanning op servo zetten FOR ServoStand = ServoStand TO (BoveninMok + 100) STEP Snelheid2 ;Van boven de mok tot bovenin mok SERVO Motor, ServoStand ;Verdraai motor volgens waarde DELAYMS PulsPauzeTijd NEXT ;Theezakje dippen FOR DipTeller = 1 TO DipAantal ;Dip theezakje gekozen aantal keer IF DipTeller = 1 THEN ;Wacht bij eerste dip IF DipAantal = AantalDip_1 THEN ;Als S1 was ingedrukt dan... FOR WD1 = 1 TO WachtSeconden ;Wacht aantal seconden waarbij rode LED knippert DELAYMS 500 IF S1 = AAN THEN VoortijdigStoppen LED_Rood = OFF DELAYMS 500 LED_Rood = ON IF S1 = AAN THEN VoortijdigStoppen NEXT ELSE DELAYMS 2000 ;Bij AantalDip_2 gewoon maar 2 seconden wachten ENDIF ENDIF FOR ServoStand = servoStand TO OnderinMok STEP Snelheid ;Van bovenin mok tot bodem van mok SERVO Motor, ServoStand ;Verdraai motor volgens waarde DELAYMS PulsPauzeTijd IF S1 = AAN THEN VoortijdigStoppen NEXT ;Voor de laatste dip een kort piepje laten horen IF DipTeller = AantalDip_2 - 1 THEN OUTPUT PORTB.3 ;Eerst van input naar output (low-power) HPWM 1, 127, 1000 ;Geef korte piep door aan de CCP/PWM module DELAYMS 180 HPWM 1, 0, 0 INPUT PORTB.3 ;Schakel PORTB.3 om als ingang om batterij te sparen (low-power) ENDIF DELAYMS 1200 ;Tijd dat theezakje even onderin blijft na elke dip ServoStand = ServoStand - Snelheid FOR ServoStand = ServoStand TO BoveninMok STEP -Snelheid ;Van bodem van mok tot bovenin mok SERVO Motor, ServoStand ;Verdraai motor volgens waarde DELAYMS PulsPauzeTijd IF S1 = AAN THEN VoortijdigStoppen NEXT NEXT ;Theezakje weer uit de mok halen FOR ServoStand = BovenInMok TO BovenDeMok STEP -Snelheid2 ;Van bovenin mok tot boven de mok SERVO Motor, ServoStand ;Verdraai motor volgens waarde DELAYMS PulsPauzeTijd NEXT FOR WD1 = 1 TO 10 ;10 pulsjes de tijd om goed naar de bovenste stand te gaan SERVO Motor, ServoStand ;Zet de hefboom in de stand die is opgegeven in 'BovenDeMok' DELAYMS PulsPauzeTijd ;'PulsPauzeTijd' is bovenin het programma opgegeven NEXT ServoPower = UIT ;Spanning van servo halen ;Gong, thee is klaar OUTPUT PORTB.3 ;Eerst van input naar output (low-power) FOR BD1 = 1 TO Aantalgongs FOR Volume = 165 TO 0 STEP -1;Van 165 (=65% duty) naar constant laag (= buzzer uit) HPWM 1, Volume, ToonHoogte ;Geef de frequentie 'ToonHoogte' door aan de CCP/PWM module DELAYUS 60 * (~Volume / 2) ;Hoe zachter het volume, hoe langer de tijd duurt (nagalm) NEXT DELAYMS 200 ;Wachttijd tussen de gongs NEXT INPUT PORTB.3 ;Schakel PORTB.3 om als ingang om batterij te sparen (low-power) GOTO Start Uitzetten: LED_Rood = ON ;Rode LED brandt, apparaat in werking OUTPUT PORTB.3 ;Eerst van input naar output (low-power) FOR BD1 = 1 TO AantalSirenes ;'Sirene' lus 'AantalSnel' maal uitvoeren FOR Hertz = 250 TO 2000 STEP 25 ;Snel (stappen van 25Hz) van 250Hz naar 2000Hz HPWM 1, 127, Hertz ;Geef de frequentie 'Hertz' door op maximale volume (127) IF S1 = AAN OR S2 = AAN THEN Start ;Cancel inklappen NEXT FOR Hertz = 2000 TO 250 STEP -7 ;Snel (stappen van 7Hz) van 2000Hz naar 250Hz HPWM 1, 127, Hertz ;Geef de frequentie 'Hertz' door op maximale volume (127) IF S1 = AAN OR S2 = AAN THEN Start ;Cancel inklappen NEXT NEXT INPUT PORTB.3 ;Schakel PORTB.3 om als ingang om batterij te sparen (low-power) ;Cancel mogelijkheid inklappen FOR BD1 = 1 TO 200 DELAYMS 5 ;Nog 1 seconde (5 x 200) wachten en dan inklappen IF S1 = AAN OR S2 = AAN THEN Start ;Na het alarm is het nog 1 seconde mogelijk om het inklappen te voorkomen door op 1 van de toetsen te drukken NEXT ;Arm in behuizing klappen ServoPower = AAN ;Spanning op servo zetten FOR WD1 = 1 TO 80 ;80 pulsjes de tijd om arm in de behuizing te klappen SERVO Motor, InBehuizing ;Zet de hefboom in de stand die is opgegeven in 'BovenDeMok' DELAYMS PulsPauzeTijd ;'PulsPauzeTijd' is bovenin het programma opgegeven NEXT SleepMode: ServoPower = UIT ;Spanning van servo uitschakelen LED_Groen = OFF LED_Rood = OFF INPUT PORTB.3 ;Schakel PORTB.3 om als ingang om batterij te sparen (low-power) DELAYMS 300 ;Stabilisering INTE = 1 ;Interrupt inschakelen (;Datasheet 16F628A: 14.5.1) INTF = 0 ;Dit bit moet steeds door het programma zelf op 0 worden gezet (zie handleiding blz.371) SLEEP ;Breng PIC in slaapmode (met PORTB.0 weer uit slaap te halen) INTE = 0 GOTO Start VoortijdigStoppen: ;Theezakje weer uit de mok halen FOR ServoStand = ServoStand TO BovenDeMok STEP -Snelheid2 ;Van huidige servo stand naar boven de mok SERVO Motor, ServoStand ;Verdraai motor volgens waarde DELAYMS PulsPauzeTijd NEXT GOTO Start