Első AVR projectem egy un. komfort index relé, ami pl. az újabb VW-kben van. Ha kicsit nyomom le az indexkart (úgy hogy ne kattanjon be) akkor hármat villant. Egyszerű utángyártani, az indexkapcsolót kell rövidrezárni egy (ill. két) relével. Ezt csinálná az alábbi program, de néha 3 néha 5 néha akárhány impulzus után kapcsol ki. Gondoltam valami zajt szed össze, de a próbapanelon csak két kapcsoló, két led, és a resetet felhúzó 10k-s ellenállás van. Nem jövök rá mi a baja.
Előre is köszönöm a segítséget!
Kód: Egész kijelölése
$regfile = "ATtiny13.dat"
$crystal = 1200000
$hwstack = 32
$swstack = 8
$framesize = 16
'Ddrb = &B11011000
Config Portb.0 = Input 'Jobb index bemenet
Config Portb.1 = Input 'Bal index bemenet
Config Portb.2 = Input 'programozó bemenetnek fenntartva
Config Portb.3 = Output 'Bal kimenet
Config Portb.4 = Output 'Jobb kimenet
Ri Alias Pinb.0 'Ri (RightInput) - Jobb bemenet
Li Alias Pinb.1 'Li (LeftInput) - bal bemenet
Ro Alias Portb.4 'Ro (RightOutput)- Jobb kimenet
Lo Alias Portb.3 'Lo (LeftOutput) - Bal kimenet
Dim Rc As Byte 'Számolják a villogásokat oldalanként
Dim Lc As Byte
Dim Rt As Byte 'Ciklusszámláló (magas átmenet után alacsony szinten töltött ciklust számol)
Dim Lt As Byte
Const Inlo = 1 'A bemeneten fázist fordító tranzisztor van
Const Inhi = 0
Const Debouncetime = 50 'Prell mentesítés miatti várakozási idő
Const Maximp = 3 'Ennyi villantást tart a relé
Const Idletime = 10 'Várakozási idő alacsony szintre
Const Maxidle = 100 'Ennyi ciklust vár alacsony bemenetnél mielőtt nullázza a számlálókat (kb 1sec)
'Rc = 0
'Lc = 0
'Rt = 0
'Lt = 0
Ri = Inlo
Li = Inlo
Portb = &B11100111 'Bemenetek felhúzása, kimenetek lehúzása
Do
If Ri = Inhi Then
Waitms Debouncetime 'kivárja a prell időt
If Ri = Inhi Then 'és újra megnézi
Rc = Rc + 1 'növeli a jobb számlálót
Rt = 0 'és nullázza a ciklus számlálót
If Lc > 0 Then 'ha a bal index is villog, azt lekapcsolja
Lc = 0
End If
End If
End If
If Li = Inhi Then
Waitms Debouncetime
If Li = Inhi Then
Lc = Lc + 1
Lt = 0
If Rc > 0 Then
Rc = 0
End If
End If
End If
If Rc > 0 Or Lc > 0 Then
If Rc > 0 And Rc < Maximp Then
Set Ro
Else
Reset Ro
End If
If Lc > 0 And Lc < Maximp Then
Set Lo
Else
Reset Lo
End If
While Ri = Inhi 'Vár alacsony bemenetig
Wend
While Li = Inhi
Wend
If Rc >= Maximp Or Lc >= Maximp Then
If Rc >= Maximp Then
Reset Ro
End If
If Lc >= Maximp Then
Reset Lo
End If
Waitms Idletime 'Vár egy kicsit
If Ri = Inlo Then 'Majd ha még alacsony a bemenet
Rt = Rt + 1 'akkor növel egy ciklusszámlálót
End If
If Li = Inlo Then
Lt = Lt + 1
End If
If Rt > Maxidle Then
Rc = 0
End If
If Lt > Maxidle Then
Lc = 0
End If
End If
End If
Loop
End