Ablaktörlő időzítő szoftvere
Ablaktörlő időzítő szoftvere
Szerettem volna megépíteni egy egyszerű ablaktörlő időzítőt. Pontosabban meg is építettem, de valami miatt nem működik. Én a szoftverre gondoltam, ami Bascomra íródott.
A működése az lenne, hogy az ablaktörlőt egy pillanatra bekapcsolva elindul egy időzítő. A legközelebbi bekapcsoláskor az előző bekapcsolás óta eltelt időt használja fel és innentől ilyen időközönként töröl egyet az ablaktörlő.
Ez lenne az elmélet, de az a baj, hogy nem működik. Vagy mindig 35-40 másodpercenként húz be a relé, vagy behúz és úgy is marad.
Ez lenne a cucc:
http://www.mcselec.com/index.php?option ... &Itemid=57
Valaki nálam szakértőbb vetne rá egy pillantást?
Köszönöm.
A működése az lenne, hogy az ablaktörlőt egy pillanatra bekapcsolva elindul egy időzítő. A legközelebbi bekapcsoláskor az előző bekapcsolás óta eltelt időt használja fel és innentől ilyen időközönként töröl egyet az ablaktörlő.
Ez lenne az elmélet, de az a baj, hogy nem működik. Vagy mindig 35-40 másodpercenként húz be a relé, vagy behúz és úgy is marad.
Ez lenne a cucc:
http://www.mcselec.com/index.php?option ... &Itemid=57
Valaki nálam szakértőbb vetne rá egy pillantást?
Köszönöm.
Szerintem az autók 95%-ánál +12V jön le a kapcsolóról.Robert írta:A 2 bemeneti lábra +12V-t vagy GND-t kapcsol a kapcsoló?
A prg egyik részén a ablaktörlő időnként elmegy és kapcsol. míg a másik esetben azt hiszem folyamatos... (csak átfutottam az írást)
A két bemenet közül az egyik van arra, ha olyan autóval rendelkezünk, ahol az ablakmosó működtetésekor az ablaktörlő nem indul el. Ilyet utoljára ladákban láttam. Tehát ennél a funkciónál, mikor csak vizet spriccelünk a szélvédőre, akkor a relé behúz és a kapcsoló elengedése után is még töröl néhányat az ablaktörlő.
Nekem csak a másik funkcióra van szükségem, a programozható intervallumra. A mai VW-ek gyárilag ilyenek.
Előnye, hogy valóban a kívánt időre lehet beállítani és nem potival megközelítőleg belőni.
A működés egyszerű. Mikor az 5-ös lábon egy pillanatra megjelenik a +12V (elvileg), akkor elindul a számláló. Mikor megint megjelenik rajta és rajta is marad, akkor a számláló megáll és az eltelt időintervallumban behúzza egy pillanatra a relét.
Mivel a maximumvárakozást 30 secre állította nem is, mehet tovább!
Vegyed igény szerint nagyobbra a :

Vegyed igény szerint nagyobbra a :
Kód: Egész kijelölése
Const Disable_after = 1200 ' 30sec timer with maximum interval (30sec) Ezzel a „Debuence” utasítással kinek van már tapasztalata?
Megfelelően kiszűri a kapcsolók prelezését? És, hogyan oldja meg? (Várakozással?)

Megfelelően kiszűri a kapcsolók prelezését? És, hogyan oldja meg? (Várakozással?)
Kód: Egész kijelölése
Debounce Switch , 1 , Start1 ' if wiper switch is turned on, start default interval
Debounce Switch_water , 1 , Wipe_water ' if windscreen clean switch is turned on, start motorAz ok, hogy 30 sec a max, de a lényeg az lenne, hogy a kapcsolóval állítom be az időt. Tehát ha 15mp a két kapcsolás közti idő, akkor 15 másodpercenként kell behúznia a relét, míg újra végre nem hajtok egy "tanítást", vagy le nem veszem a cuccról a tápot. De ez magyarán mondva nem törődik azzal, hogy milyen időközt akarok beállítani, akkor is fix időnként húzza be a relét, tehát nem tanulja meg.kapu48 írta:Mivel a maximumvárakozást 30 secre állította nem is, mehet tovább!
Vegyed igény szerint nagyobbra a :Kód: Egész kijelölése
Const Disable_after = 1200 ' 30sec timer with maximum interval (30sec)
Ráadásul a leírás szerint is az alapállapot valami 5mp. Tehát, ha nem tanítok, akkor elvileg 5 másodpercenként kellene behúznia a relét, de ez mindig fixen ~34 másodpercenként húz be.
A másik funkciója (amire meg semmi szükségem) működik rendesen.
Éppen ezért tetem fel az előző kérdésemet:
„Ezzel a „Debuence” utasítással kinek van már tapasztalata?
Megfelelően kiszűri a kapcsolók prelezését? És, hogyan oldja meg?”
Mert a kapcsolók pergésében vélem a hiba okát! Első lépésként a kapcsolókon levő 2db 50n-es kondit cserélném 100n-osokra!
Másodsorban az éktelen sok goto utasítást szedném ki a programból. Mert így követhetetlen átláthatatlan az egész program menet. És a hibakeresés is nehéz!

„Ezzel a „Debuence” utasítással kinek van már tapasztalata?
Megfelelően kiszűri a kapcsolók prelezését? És, hogyan oldja meg?”
Mert a kapcsolók pergésében vélem a hiba okát! Első lépésként a kapcsolókon levő 2db 50n-es kondit cserélném 100n-osokra!
Másodsorban az éktelen sok goto utasítást szedném ki a programból. Mert így követhetetlen átláthatatlan az egész program menet. És a hibakeresés is nehéz!
Sajnos az a baj, hogy nem értek a programozáshoz. Nem értem a programnyelveket, ezért csak olyan dolgokat rakok össze, amik mellett meg van a teljes leírás, illetve szoftver.kapu48 írta:Éppen ezért tetem fel az előző kérdésemet:
„Ezzel a „Debuence” utasítással kinek van már tapasztalata?
Megfelelően kiszűri a kapcsolók prelezését? És, hogyan oldja meg?”
Mert a kapcsolók pergésében vélem a hiba okát! Első lépésként a kapcsolókon levő 2db 50n-es kondit cserélném 100n-osokra!
Másodsorban az éktelen sok goto utasítást szedném ki a programból. Mert így követhetetlen átláthatatlan az egész program menet. És a hibakeresés is nehéz!
Csak olyan dologokat rakok össze, amikre szükségem van.
Ezért kértem segítséget a hiba feltárásában. Bár pár dologra rá szoktam jönni, ezek pl. ennél az adott motyónál az alapértelmezett idők beállítása, de a szoftver működését nem tudom végigvezetni.
A kondiknál a két 10n-osra gondolsz?
Mivel írtad, hogy az ablakmosó funkció nem kel ezért kiszedtem. Legalább a hibakeresés idejére.
És a felesleges gosubokat is kiszedtem. Így már átláthatóbb lett. De még így sem tiszta 100%-ra.
Próbáld ki:

És a felesleges gosubokat is kiszedtem. Így már átláthatóbb lett. De még így sem tiszta 100%-ra.
Próbáld ki:
Kód: Egész kijelölése
$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 32
$swstack = 8
$framesize = 16
'$sim
Const Timervalue = 22 ' 0.025 sec (25msec) @9.6MHz/1024/8bit = 22
Const Minimum_interval = 40 ' 1sec
Const Default_interval = 80 ' 2sec
Const Disable_after = 1200 ' 30sec timer with maximum interval (30sec)
'Const Wiper_water_delay = 200 ' 5sec
Const Wiper_threshold = 500 ' 500ms (for waitms statement)
Dim Interval As Word
Dim Int_timer1 As Word
Dim Temptimer As Word
Dim Kt As Bit
Switch Alias Pinb.0 ' switch for time-cycle wipers
'Switch_water Alias Pinb.1 ' switch what activate windscreen water cleaners
Relay Alias Portb.3 ' relay for wiper motor
Config Portb.0 = Input
Config Portb.1 = Input
Config Portb.3 = Output
Config Timer0 = Timer , Prescale = 1024
Enable Interrupts
Enable Timer0
Timer0 = Timervalue ' reload Timer0 with interval (25msec)
On Timer0 Timer_int ' set Timer0 interrupt routine
Do
Main:
Reset Relay ' turn off wiper motor
Debounce Switch , 1 , Start1 ' if wiper switch is turned on, start default interval
Loop
'-------------------------------------------------------------------------------
Start1:
Interval = Default_interval ' set default interval for wiper timer
Start2:
If Interval < Minimum_interval Then Goto Wipe_cont ' if wiper interval < than min interval run motor in continuosly mode
Wipe_start:
Wipe_loop:
Disable Timer0
Int_timer1 = Interval ' set timer to interval
Set Relay ' start motor
Waitms Wiper_threshold ' wait 500ms, needed for activating self-motor automatic
Reset Relay ' turn off motor (motor automaticly return wipers to start position)
Enable Timer0 ' start/stop motor for one wiper cycle
Wipe_loop2:
If Int_timer1 = 0 Then ' if timer goes to 0 , reload timer with interval and make one wiper cycle
Disable Timer0
Set Relay ' start motor
Waitms Wiper_threshold ' wait 500ms, needed for activating self-motor automatic
Reset Relay ' turn off motor (motor automaticly return wipers to start position)
Int_timer1 = Interval
Enable Timer0
End If
Debounce Switch , 0 , Time_loop2 ' ITT ÁT IRTAM AZ UGRÁS CIMET? check for turn off wiper switch
Goto Wipe_loop2 ' make loop
'-------------------------------------------------------------------------------
Wipe_cont: 'BEKAPCSOLA A MOTORT
Set Relay ' activate wiper motor for continuosly mode
Wipe_cont2: ' VÁR AMIG A KAPCSOLÓT LE KAPCSOLJA
Debounce Switch , 0 , Time_loop ' check for wiper switch, if opened go check new interval
Goto Wipe_cont2
'-------------------------------------------------------------------------------
Time_loop: ' time loop for get new wiper interval or reset timer when time exceed 30sec
Reset Relay ' turn off wiper motor
Disable Timer0 'VISSZA ÁLL MAXX KÉSLELTETÉSRE
Int_timer1 = Disable_after ' load timer with maximum interval (30sec)
Enable Timer0
Time_loop2: 'VÁRJA, HOGY LETELJEN A KÉSLELTETÉS
Debounce Switch , 1 , Time_loop3 ' check for wiper switch closed,if is closed set new interval
If Int_timer1 = 0 Then Goto Main ' if time period is over and wiper switch is not closed, run program from begin
Goto Time_loop2
Time_loop3:
Disable Timer0
Interval = Disable_after - Int_timer1 ' get new interval for wiper
Enable Timer0
Goto Start2 ' run wiper program from begin but ignore setting of default interval
'-------------------------------------------------------------------------------
Timer_int: ' Timer0 interrupt routine
Timer0 = Timervalue 'reload Timer0
If Int_timer1 = 0 Then Return ' if timer is not set do nothing
Int_timer1 = Int_timer1 - 1 ' else decrement it over each interrupt
Return
'-------------------------------------------------------------------------------
Ezzel semmit nem csinál. A relé egy pillanatra sem húz be.kapu48 írta:Mivel írtad, hogy az ablakmosó funkció nem kel ezért kiszedtem. Legalább a hibakeresés idejére.
És a felesleges gosubokat is kiszedtem. Így már átláthatóbb lett. De még így sem tiszta 100%-ra.
Próbáld ki:Kód: Egész kijelölése
$regfile = "attiny13.dat" $crystal = 9600000 $hwstack = 32 $swstack = 8 $framesize = 16 '$sim Const Timervalue = 22 ' 0.025 sec (25msec) @9.6MHz/1024/8bit = 22 Const Minimum_interval = 40 ' 1sec Const Default_interval = 80 ' 2sec Const Disable_after = 1200 ' 30sec timer with maximum interval (30sec) 'Const Wiper_water_delay = 200 ' 5sec Const Wiper_threshold = 500 ' 500ms (for waitms statement) Dim Interval As Word Dim Int_timer1 As Word Dim Temptimer As Word Dim Kt As Bit Switch Alias Pinb.0 ' switch for time-cycle wipers 'Switch_water Alias Pinb.1 ' switch what activate windscreen water cleaners Relay Alias Portb.3 ' relay for wiper motor Config Portb.0 = Input Config Portb.1 = Input Config Portb.3 = Output Config Timer0 = Timer , Prescale = 1024 Enable Interrupts Enable Timer0 Timer0 = Timervalue ' reload Timer0 with interval (25msec) On Timer0 Timer_int ' set Timer0 interrupt routine Do Main: Reset Relay ' turn off wiper motor Debounce Switch , 1 , Start1 ' if wiper switch is turned on, start default interval Loop '------------------------------------------------------------------------------- Start1: Interval = Default_interval ' set default interval for wiper timer Start2: If Interval < Minimum_interval Then Goto Wipe_cont ' if wiper interval < than min interval run motor in continuosly mode Wipe_start: Wipe_loop: Disable Timer0 Int_timer1 = Interval ' set timer to interval Set Relay ' start motor Waitms Wiper_threshold ' wait 500ms, needed for activating self-motor automatic Reset Relay ' turn off motor (motor automaticly return wipers to start position) Enable Timer0 ' start/stop motor for one wiper cycle Wipe_loop2: If Int_timer1 = 0 Then ' if timer goes to 0 , reload timer with interval and make one wiper cycle Disable Timer0 Set Relay ' start motor Waitms Wiper_threshold ' wait 500ms, needed for activating self-motor automatic Reset Relay ' turn off motor (motor automaticly return wipers to start position) Int_timer1 = Interval Enable Timer0 End If Debounce Switch , 0 , Time_loop2 ' ITT ÁT IRTAM AZ UGRÁS CIMET? check for turn off wiper switch Goto Wipe_loop2 ' make loop '------------------------------------------------------------------------------- Wipe_cont: 'BEKAPCSOLA A MOTORT Set Relay ' activate wiper motor for continuosly mode Wipe_cont2: ' VÁR AMIG A KAPCSOLÓT LE KAPCSOLJA Debounce Switch , 0 , Time_loop ' check for wiper switch, if opened go check new interval Goto Wipe_cont2 '------------------------------------------------------------------------------- Time_loop: ' time loop for get new wiper interval or reset timer when time exceed 30sec Reset Relay ' turn off wiper motor Disable Timer0 'VISSZA ÁLL MAXX KÉSLELTETÉSRE Int_timer1 = Disable_after ' load timer with maximum interval (30sec) Enable Timer0 Time_loop2: 'VÁRJA, HOGY LETELJEN A KÉSLELTETÉS Debounce Switch , 1 , Time_loop3 ' check for wiper switch closed,if is closed set new interval If Int_timer1 = 0 Then Goto Main ' if time period is over and wiper switch is not closed, run program from begin Goto Time_loop2 Time_loop3: Disable Timer0 Interval = Disable_after - Int_timer1 ' get new interval for wiper Enable Timer0 Goto Start2 ' run wiper program from begin but ignore setting of default interval '------------------------------------------------------------------------------- Timer_int: ' Timer0 interrupt routine Timer0 = Timervalue 'reload Timer0 If Int_timer1 = 0 Then Return ' if timer is not set do nothing Int_timer1 = Int_timer1 - 1 ' else decrement it over each interrupt Return '-------------------------------------------------------------------------------
Próbálkoztam megint az eredetivel és a működés teljesen kiszámíthatatlan.
Megkapja a tápot. Ezután a kapcsolóval adott első impulzusra a relé nem húz meg (pedig egy pillanatra meg kéne). A következő kapcsolásra a relé behúz egy pillanatra (és utána többször nem is húz be automatikusan), vagy behúzva is marad. Elvileg csak akkor maradna folyamatosan behúzva a relé, ha a kívánt intervallum kisebb, mint a szoftverben megadott minimális idő. Viszont én direkt vártam a két kapcsolás között legalább 15 másodpercet.
Egyszerűen nem értem.
Már 2 hónapja próbálom működésre bírni sikertelenül.
