Intervalltorkare
Postat: 21 september 2011, 19:56:13
Här är ett projekt som legat och samlat damm länge.
Kan visa det här ändå. Det var i slutet på 80-talet, fick jag en idé om att bygga en
intervalltorkare till bilen. På den tiden hade inte alla bilar
intervall-läge. Det fanns byggsatser att köpa, de hade då
en pot för att ställa in tiden. Idén jag fick var att mäta
tiden mellan två torkningar som man gör manuellt med en
knapp som påverkar torkaren, den uppmätta tiden hålls
sedan när intervalltorkningen är igång. På så vis ställer
man enkelt in rätt tid för den regnmängd som kommer just då.
Här på bilden syns 80-talsvarianten byggd med TTL-kretsar.
Den centrala delen är en 8-bits upp/ner räknare som mäter
och håller intervalltid, med en "klock-frekvens" på 2 Hz.
2006 gjorde jag en ny PIC-variant. (det lilla kretskortet på bilden)
Den funkar på ungefär samma sätt, som följer här.
En tryckning:
Torkarna går en gång och tidmätning startar (startar om).
Två tryckningar i snabb följd:
Torkarna går en gång, intervalltorkning startar med uppmätt tid och
tidmätning startar om.
Långt tryck:
Intervalltorkning avslutas men tidmätning fortsätter.
Här är kretschema och ASM-kod för PIC, om någon är sugen på att bygga.
Kan visa det här ändå. Det var i slutet på 80-talet, fick jag en idé om att bygga en
intervalltorkare till bilen. På den tiden hade inte alla bilar
intervall-läge. Det fanns byggsatser att köpa, de hade då
en pot för att ställa in tiden. Idén jag fick var att mäta
tiden mellan två torkningar som man gör manuellt med en
knapp som påverkar torkaren, den uppmätta tiden hålls
sedan när intervalltorkningen är igång. På så vis ställer
man enkelt in rätt tid för den regnmängd som kommer just då.
Här på bilden syns 80-talsvarianten byggd med TTL-kretsar.
Den centrala delen är en 8-bits upp/ner räknare som mäter
och håller intervalltid, med en "klock-frekvens" på 2 Hz.
2006 gjorde jag en ny PIC-variant. (det lilla kretskortet på bilden)
Den funkar på ungefär samma sätt, som följer här.
En tryckning:
Torkarna går en gång och tidmätning startar (startar om).
Två tryckningar i snabb följd:
Torkarna går en gång, intervalltorkning startar med uppmätt tid och
tidmätning startar om.
Långt tryck:
Intervalltorkning avslutas men tidmätning fortsätter.
Här är kretschema och ASM-kod för PIC, om någon är sugen på att bygga.
Kod: Markera allt
;**********************************************************************
errorlevel -203, -204, -205, -206, -207, -302
list p=12f629
#include <p12f629.inc>
__CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
; 4 MHz
; Funktionsbskrivning
;
; Tre olika lägen:
; * Frånläge, Spänning är tillkopplad, ingen lysdiod är tänd, torkaren går ej.
; * Tidmätning, Tidmätlysdiod är tänd och tiden mellan två torkningar mäts upp.
; * Driftläge, Intervalltorkning kör med inställd tid.
;
; Enkeltryck, En torkning direkt, och tidmätning startas eller startas om,
; tidmätlysdiod tänds, den släck först när tidmätning nått tiden "255*tidsteg"
;
; Dubbeltryck, Intervalltorkning (driftläge) startar med tiden som gått sen senaste enkeltryck,
; Tiden lagras i eepromet.
; Om dubbeltryck ges direkt, utan föregående enkeltryck så körs intervalltorkning
; med tid lagrad från förra gången driftläge var till
;
; Långtryck, Avslutar intervalltorkning (driftläge), dock fortsätter tidmätning.
; Långtryck kan användas för att förlänga intervalltiden, intervalltorkningen
; återupptages i så fall med Dubbeltryck.
;
cblock 020h
rg6 ; rg_, allmänna register
rg7
rg8
rg9
rg10
rg11
TidMätReg ; Innehåller tid från senaste torkning
IntervallTidReg ; Innehåller intervalltid, tid mellan torkningar
IntervallRäknReg ; Samma som IntervallTidReg, fast detta är arbetsregistret, räknas ner till 0 och
; laddas sedan om med IntervallTidReg.
endc
#define TorkarePin GPIO, 0h
#define TidMätLysdiod GPIO, 01h
#define DriftLysdiod GPIO, 02h
#define KnappPin GPIO, 03h ; knapp intryckt ger nolla
TorkImpulsTid equ d'10' ; antal 1/10 dels sek
; Håller torkarmotorn igång så länge så att den kommer över det
; läge där den kör ett helt svep och stannar sen i utgångsläget
TidsSteg equ d'3' ; antal 1/10 dels sek
; Tidsteg i drift och uppmätning av intervalltid
IntervallTidRegEE equ 01h ; minnesadress i EEPROM, för att lagra intervalltid
;---------------------------------------------------------------------------
org 0x00
goto init
;-------------------------------------------------------------
LagraEEPROM
;
; indata:
; EEADR (OBS! bank 1), w=EEdata
; utdata:
; -
;
; register som ändras:
; w, EECON1, EECON2
;
; PC-stackanvändning: 0
banksel EEDATA
movwf EEDATA
bsf EECON1, WREN
movlw 055h
movwf EECON2
movlw 0AAh
movwf EECON2
bsf EECON1, WR
bcf EECON1, WREN
banksel 0
return
;-------------------------------------------------------------
LäsEEPROM
;
; indata:
; w=EEadress
; utdata:
; w=EEdata
;
; register som ändras:
; EECON1
;
; PC-stackanvändning: 0
banksel EEADR
movwf EEADR
bsf EECON1, RD
movf EEDATA, w
banksel 0
return
;-------------------------------------------------------------
Tid1
; Tidsfördröjning 1 sekund
;
; indata:
; w, antal sekunders fördröjning
;
; utdata:
; -
;
; register som ändras:
; w, rg8, rg9, rg10, rg11
;
; PC-stackanvändning: 0
movwf rg11
ts1s_1 movlw 045h
movwf rg10
ts1s_2 movlw 045h
movwf rg9
ts1s_3 movlw 045h
movwf rg8
ts1s_4
decfsz rg8, f
goto ts1s_4
decfsz rg9, f
goto ts1s_3
decfsz rg10, f
goto ts1s_2
decfsz rg11, f
goto ts1s_1
return
;-------------------------------------------------------------
Tid01
; Tidsfördröjning 0.1 sekund
;
; indata:
; w, antal tiondelsekunders fördröjning
;
; utdata:
; -
;
; register som ändras:
; w, rg9, rg10, rg11
;
; PC-stackanvändning: 0
movwf rg11
ts1_1 movlw 0B4h
movwf rg10
ts1_2 movlw 0B8h
movwf rg9
ts1_3
decfsz rg9, f
goto ts1_3
decfsz rg10, f
goto ts1_2
decfsz rg11, f
goto ts1_1
return
;-------------------------------------------------------------
Tid001
; Tidsfördröjning 0.01 sekund
;
; indata:
; w, antal hundradelsekunders fördröjning
;
; utdata:
; -
;
; register som ändras:
; w, rg9, rg10, rg11
;
; PC-stackanvändning: 0
movwf rg11
ts2_1 movlw 039h
movwf rg10
ts2_2 movlw 039h
movwf rg9
ts2_3
decfsz rg9, f
goto ts2_3
decfsz rg10, f
goto ts2_2
decfsz rg11, f
goto ts2_1
return
;-------------------------------------------------------------
Tid1ms
; Tidsfördröjning 1 ms
;
; indata:
; w, antal ms fördröjning
;
; utdata:
; -
;
; register som ändras:
; w, rg9, rg10, rg11
;
; PC-stackanvändning: 0
movwf rg11
ts_1 movlw 012h
movwf rg10
ts_2 movlw 012h
movwf rg9
ts_3
decfsz rg9, f
goto ts_3
decfsz rg10, f
goto ts_2
decfsz rg11, f
goto ts_1
return
;-------------------------------------------------------------
Tid01kn
; Tidsfördröjning 0.1 sekund, avbryter då knapp tryckts in
;
; indata:
; w, antal tiondelsekunders fördröjning
;
; utdata:
; -
;
; register som ändras:
; w, rg9, rg10, rg11
;
; PC-stackanvändning: 0
movwf rg11
ts1k_1 movlw 08Dh
movwf rg10
ts1k_2 movlw 08Dh
movwf rg9
ts1k_3
btfss KnappPin ; om KnappPin=0 då avbryt
return
decfsz rg9, f
goto ts1k_3
decfsz rg10, f
goto ts1k_2
decfsz rg11, f
goto ts1k_1
return
;-------------------------------------------------------------
LäsAvKnapp
; Läser av en knapp om Enkel-, Dubbel- eller Lång-tryck.
; OBS, efter denna rutin kan knapp fortfarande vara intryckt.
;
; indata:
; -
;
; utdata:
; knapp ej tryckt: w=00
; EnkelTryck: w=01
; DubbelTryck: w=02
; LångTryck: w=FF
;
; register som ändras:
; rg7, rg9, rg10, rg11
;
; PC-stackanvändning: 1
; Testa knapp
; om knapp ej tryckt, returnera 00
; vänta studstid
; tidräknare := 0
; så länge knapp är tryckt gör
; öka tidräknare
; vänta 0.1 s
; om tidräknare >= 1s då returnera LångTryck
; tidräknare := 0
; så länge knapp inte är tryckt gör
; öka tidräknare
; vänta 0.1 s
; om tidräknare >= 0.5s då returnera EnkelTryck
; returnera DubbelTryck
EnkelTryck equ 01h
DubbelTryck equ 02h
LångTryck equ 0FFh
; Testa knapp
; Om knapp ej tryckt, returnera 00
btfsc KnappPin ; om KnappPin=1 då returnera 00
retlw 0h
; Vänta studstid
movlw d'5'
call Tid001
; Tidräknare := 0
clrf rg7
; Så länge knapp är tryckt gör
Lak_slt
btfsc KnappPin ; om KnappPin=0 då räkna upp
goto Lak_sls
; Öka tidräknare
incf rg7, f
; Vänta 0.1 s
movlw 01h
call Tid01
; Om tidräknare >= 1s då returnera LångTryck
movlw 0ah
subwf rg7, w
btfsc status, c
retlw LångTryck
goto Lak_slt
; Tidräknare := 0
clrf rg7
Lak_sls
; Så länge knapp inte är tryckt gör
btfss KnappPin ; om KnappPin=1 då räkna upp
retlw DubbelTryck
; Öka tidräknare
incf rg7, f
; Vänta 0.1 s
movlw 01h
call Tid01
; Om tidräknare >= 0.5s då returnera EnkelTryck
movlw 05h
subwf rg7, w
btfsc status, c
retlw EnkelTryck
goto Lak_sls
; Returnera DubbelTryck
;-------------------------------------------------------------
VäntaKnappSläppt
;
; indata:
; -
;
; utdata:
; -
;
; register som ändras:
; w, rg9, rg10, rg11
;
; PC-stackanvändning: 1
vks_sl
btfss KnappPin ; Om KnappPin=0 då fortsätt i slinga
goto vks_sl
; Vänta studstid
movlw d'5'
call Tid001
btfss KnappPin ; Om KnappPin=0 då fortsätt i slinga
goto vks_sl
return
;-------------------------------------------------------------
TorkImpuls
; Håller torkarmotorn igång så länge så att den kommer över det
; läge där den kör ett helt svep och stannar sen i utgångsläget
;
; indata:
; TorkImpulsTid, IntervallTidReg, DriftLysdiod
;
; utdata:
; TorkarePin
;
; register som ändras:
; w, rg9, rg10, rg11
;
; PC-stackanvändning: 1
; Starta torkare och vänta TorkImpulsTid
bsf TorkarePin
movlw TorkImpulsTid
call Tid01
; Om driftläge och intervalltid kortare än 3 sek låt då torkaren gå hela tiden.
; om intervalltid mindre än 3 sek då: slå ej från torkare
movlw d'10' ; 10 * 0.3s (tidssteg) = 3s
subwf IntervallTidReg, w
btfsc status, c
bcf TorkarePin
; Om Driftlysdiod är släckt då: slå från torkare
btfss DriftLysdiod
bcf TorkarePin
return
;-------------------------------------------------------------
;*********************Initiering av portar******************************
init
clrf GPIO
banksel TRISIO
movlw b'00001000'
movwf TRISIO ; Ställer in vilka ben som ska vara in o utgångar
banksel 0
clrf GPIO ; Init GPIO
movlw 07h ; 00000111 Comparator Off (Lowest power)
movwf CMCON ;
call 0x3FF ; retrieve factory calibration value
banksel OSCCAL ; set file register bank to 1
movwf OSCCAL ; update register with factory cal value
banksel 0 ; set file register bank to 0
;*******************************************************************
clrf TidMätReg
slinga
; -------------- läs av knapp -----------------
call LäsAvKnapp
movwf rg7 ; rg7 := knapp data
; rg7 = 0 ?, Knapp tryckt ?
movlw 0h
subwf rg7, w
btfsc status, z
goto alltid_i_slinga ; Ej tryckt -> ja, rg7=0
; rg7 = EnkelTryck ?
movlw EnkelTryck
subwf rg7, w
btfsc status, z
goto ET_tryckt ; -> Ja, rg7 = EnkelTryck
; rg7 = DubbelTryck ?
movlw DubbelTryck
subwf rg7, w
btfsc status, z
goto DT_tryckt ; -> Ja, rg7 = DubbelTryck
; rg7 = LångTryck ?
movlw LångTryck
subwf rg7, w
btfsc status, z
goto LT_tryckt ; -> Ja, rg7 = LångTryck
; -------------- läs av knapp -----------------
; ---------- agera enligt knapptryckning ----------
ET_tryckt
; kör torkare ett svep
call TorkImpuls
; tidmätning startar
bsf TidMätLysdiod
clrf TidMätReg
; Om Enkeltryck ges i Driftläge då ska IntervallRäknReg laddas om,
; (det gör inget att detta sker utanför driftläge också)
movf IntervallTidReg, w
movwf IntervallRäknReg
goto alltid_i_slinga
DT_tryckt
; Driftläge sätts igång.
; Antingen med lagrad intervalltid sedan förra
; gången driftläge var igång eller med nyligens uppmätt tid
; sedan senaste Enkeltryck
bsf DriftLysdiod
; Dubbeltryck med eller utan föregående Enkeltryck ?
; d.v.s om Tidmätning pågår eller ej ?
btfsc TidMätLysdiod
goto DT_medET
; DubbelTryck utan föregående EnkelTryck
; Intervalltorkning startas direkt, med tid som lagrats förra gången
; läs Intervall tid lagrad i EEPROM
movlw IntervallTidRegEE
call LäsEEPROM
movwf IntervallTidReg
movwf IntervallRäknReg
; kör torkare
call TorkImpuls
; starta ny tidmätning
bsf TidMätLysdiod
clrf TidMätReg
goto alltid_i_slinga
DT_medET
; DubbelTryck med föregående EnkelTryck
; Lagra uppmätt tid TidMätReg i EEPROM
movlw IntervallTidRegEE
banksel EEADR
movwf EEADR
banksel 0
movf TidMätReg, w
movwf IntervallTidReg
movwf IntervallRäknReg
call LagraEEPROM
; kör torkare
call TorkImpuls
; starta om tidmätning, TidMätLysdiod är redan tänd
clrf TidMätReg
goto alltid_i_slinga
LT_tryckt
; Driftläge och torkare slås ifrån, torkaren slås ifrån också eftersom
; den kan vara konstant till, om intervalltid är kortare än 3sek.
; Tidmätning slås ej ifrån eftersom Långtryck kan användas för att förlänga intervalltiden.
bcf DriftLysdiod
bcf TorkarePin
; ---------- agera enligt knapptryckning ----------
alltid_i_slinga
; ------------- alltid_i_slinga ------------------
call VäntaKnappSläppt
movlw TidsSteg ; vänta "TidsSteg" i drift och uppmätning av intervalltid.
call Tid01kn
; om TidMätLysdiod är tänd, räkna då upp TidMätReg, till 0FFh som max
btfss TidMätLysdiod
goto ais_2
; räkna upp TimMätReg
incfsz TidMätReg, f
goto ais_2
; om TimMätReg slår om från 0FFh till 00h då: slå från tidmätning
bcf TidMätLysdiod
ais_2
; om i driftläge då: räkna ner IntervallRäknReg och kör torkare om noll
btfss DriftLysdiod
goto ais_3
; räkna ner IntervallRäknReg
decfsz IntervallRäknReg, f
goto ais_3 ; hoppa om räknare inte är noll
; IntervallRäknReg har räknats ner till 0, ladda om det med värdet i IntervallTidReg, och kör torkare
movf IntervallTidReg, w
movwf IntervallRäknReg
; kör torkare
call TorkImpuls
clrf TidMätReg
ais_3
; ------------- alltid_i_slinga ------------------
goto slinga
END