Ablaktörlő időzítő szoftvere

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
Mumtaz
Újonc
Újonc
Hozzászólások: 13
Csatlakozott: 2007. február 18. vasárnap, 7:00

Ablaktörlő időzítő szoftvere

HozzászólásSzerző: Mumtaz » 2009. augusztus 16. vasárnap, 19:24

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=com_content&task=view&id=172&Itemid=57

Valaki nálam szakértőbb vetne rá egy pillantást?
Köszönöm.

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9973
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2009. augusztus 16. vasárnap, 21:18

A bemenetre GND fele kapja a kontaktot?

Avatar
Mumtaz
Újonc
Újonc
Hozzászólások: 13
Csatlakozott: 2007. február 18. vasárnap, 7:00

HozzászólásSzerző: Mumtaz » 2009. augusztus 16. vasárnap, 21:28

Robert írta:A bemenetre GND fele kapja a kontaktot?


Bocsi, de nem értem a kérdést. Úgy érted, hogy a GND jönne a kapcsoló felöl a tiny 5-ös vagy 6-os lábára?

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9973
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2009. augusztus 16. vasárnap, 21:35

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)

Avatar
Mumtaz
Újonc
Újonc
Hozzászólások: 13
Csatlakozott: 2007. február 18. vasárnap, 7:00

HozzászólásSzerző: Mumtaz » 2009. augusztus 16. vasárnap, 22:13

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)


Szerintem az autók 95%-ánál +12V jön le a kapcsolóról.
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.

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3310
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2009. augusztus 17. hétfő, 12:20

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)   

:idea:

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3310
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2009. augusztus 17. hétfő, 15:30

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?)

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 motor

:?:

Avatar
Mumtaz
Újonc
Újonc
Hozzászólások: 13
Csatlakozott: 2007. február 18. vasárnap, 7:00

HozzászólásSzerző: Mumtaz » 2009. augusztus 17. hétfő, 16:27

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)   

:idea:


Az 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.
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.

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3310
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2009. augusztus 17. hétfő, 17:07

É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!
:twisted:

Avatar
bgergo
DrótVégénSzéndarab
Hozzászólások: 49
Csatlakozott: 2009. március 11. szerda, 6:00

HozzászólásSzerző: bgergo » 2009. augusztus 17. hétfő, 18:23

Én is most nézegetem ezt a "Debounce" utasítást, a súgó azt írja , hogy az alap késleltetés 25ms de felül lehet írni. Ami nagyon jó mert így egyszerűbb nyomógombot, kapcsolót használni. Ha jól értelmezem akkor csak egyszer ugrik a cimkére és megvárja míg a PIN állapotot vált.

Avatar
Mumtaz
Újonc
Újonc
Hozzászólások: 13
Csatlakozott: 2007. február 18. vasárnap, 7:00

HozzászólásSzerző: Mumtaz » 2009. augusztus 17. hétfő, 18:25

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!
:twisted:


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.
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?

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3310
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2009. augusztus 17. hétfő, 19:00

Tényleg 10n-es! (még inkább cseréld) :oops:

Más: ennél 10* nagyobb és bonyolultabb programokat láttam 1-etlen goto utasítás nélkül.
Ebben meg 13-at számoltam! Az isten sem érti éppen hol van, mit csinál?
Ez lehetne a példa, hogy ilyen programot nem szabad írni! :roll:

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3310
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2009. augusztus 17. hétfő, 22:56

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
'-------------------------------------------------------------------------------

:wink:

Avatar
Mumtaz
Újonc
Újonc
Hozzászólások: 13
Csatlakozott: 2007. február 18. vasárnap, 7:00

HozzászólásSzerző: Mumtaz » 2009. augusztus 18. kedd, 2:32

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
'-------------------------------------------------------------------------------

:wink:


Ezzel semmit nem csinál. A relé egy pillanatra sem húz be.

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.


Vissza: “Bascom-AVR nyelvű programozás (AVR programozásának lehetőségei)”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég