megszakítások !! egy pici elakadás!
- szepnorbee
- Bitmanipulátor
- Hozzászólások: 122
- Csatlakozott: 2009. augusztus 31. hétfő, 6:00
- szepnorbee
- Bitmanipulátor
- Hozzászólások: 122
- Csatlakozott: 2009. augusztus 31. hétfő, 6:00
Jójó bocsi. Akkor javítom. Próbálok leszokni.
Kód: Egész kijelölése
$regfile = "attiny45.dat"
$crystal = 8000000
Dim Feny As Integer
Feny = 1
Led Alias Portb.1
Config Led = Output
Config Timer1 = Timer , Prescale = 1024
On Timer1 Novel
Enable Timer1
Enable Interrupts
Start Timer1
Main:
Do
'nop
Loop
Novel:
Feny = Feny + 1
If Feny = 750 Then
Toggle Led
Feny = 1
end IF
Return
- szepnorbee
- Bitmanipulátor
- Hozzászólások: 122
- Csatlakozott: 2009. augusztus 31. hétfő, 6:00
(atmega8) Az ICP portot hogy szokás használni ha egy hall jeladót kötök rá és a felfutó élekre van beállítva? Kell GND-re felhúzó ellenálás? Illetve 5V1-es zeener GND és ICP láb közé? Nameg 4K7 a bemenet (ICP)elé? http://pu.i.wp.pl/k,MTA0MDQ3MTIsMTE5NjE ... ematv3.JPG
Egy gyors kezdő kérdésem lenne.
Adott egy ATTiny45 AVR.
Annyi feladata lenne hogy ha a portb.2 lábra 5V érkezik egy ventillátort hajt x ideig a portb.1-en.
Alaphelyzetben egy ledet villogtat a program a portb.0-n.
A portb.2 egy megszakítást generál és inditja a portb.1-et.
Alaphelyzetben 0V a portb.1-en.Ha megérkezik az 5v addig nem inditja a megszakítást míg újra 0v nem lesz a portb.1.
Nekem pedig azonnal indulnia kellene!
De ha letelik az x idő és a portb.1 még midig 1 akkor ne induljon újra.
Csak ha előbb 0 és ismét 1.
Itt a code:
Adott egy ATTiny45 AVR.
Annyi feladata lenne hogy ha a portb.2 lábra 5V érkezik egy ventillátort hajt x ideig a portb.1-en.
Alaphelyzetben egy ledet villogtat a program a portb.0-n.
A portb.2 egy megszakítást generál és inditja a portb.1-et.
Alaphelyzetben 0V a portb.1-en.Ha megérkezik az 5v addig nem inditja a megszakítást míg újra 0v nem lesz a portb.1.
Nekem pedig azonnal indulnia kellene!
De ha letelik az x idő és a portb.1 még midig 1 akkor ne induljon újra.
Csak ha előbb 0 és ismét 1.
Itt a code:
Kód: Egész kijelölése
$regfile = "attiny45.dat" 'Chip
$crystal = 1000000
Config Portb.1 = Output
Config Portb.2 = Input
Config Int0 = Falling
Config Portb.0 = Output
On Int0 Vent
Reset Portb.0
Reset Portb.1
Reset Portb.2
Enable Interrupts
Enable Int0
Do
Set Portb.0
Waitms 500
Reset Portb.0
Waitms 500
Loop
Vent:
Set Portb.1
Set Portb.0
Wait 10
Reset Portb.1
Reset Portb.0
Return
End
- szepnorbee
- Bitmanipulátor
- Hozzászólások: 122
- Csatlakozott: 2009. augusztus 31. hétfő, 6:00
-
Üdv! Van nekem egy ilyen programrészem:
A "Sendnap" szubrutinban egy kijelzőre kiírás van. Ez a programrész egy alkalmazáson belüli OPCIÓK menü menüelemeit tartalmazza. Az elemek között a Pind.6 gombal lehet lépkedni. Az exit menüre lépve és a Pind.7 gombot nyomva visszakerülünk a főprogramba. A problémám a "light" menüre lépve tapasztalható amikoris a kijelzőn ez áll: LIGHT 0. Ha ilyenkor megnyomom a Pind.7 gombot akkor sajnos nem változik meg a bit típusú "light" változó értéke. (mármint a kijelzés szerint biztosan nem, mert ott ugyan úgy 0 marad) Miért lehet ez szerintetek? Megszánnátok egy kis segítséggel? Köszönöm!
Kód: Egész kijelölése
Options:
Do
If Pind.6 = 0 Then Incr J
Bitwait Pind.6 , Set
If J > 2 Then J = 0
If Pind.7 = 0 And J = 2 Then Goto Main
Bitwait Pind.7 , Set
If Pind.7 = 0 And J = 0 Then Toggle Light
Bitwait Pind.7 , Set
Select Case J
Case 0 : Text = "light " + Str(light)
Case 1 : Text = " menu 2"
Case 2 : Text = " exit"
End Select
Gosub Sendnap
Waitms 300
Loop
Jól működne ez, ha eléggé gyors lennél
(és jókor)
If Pind.7 = 0 And J = 2 Then Goto Main
Bitwait Pind.7 , Set
Itt ugye benne a bitwait 1-re.
Ha ez egyben áll, akkor tovább hipp-hopp a:
If Pind.7 = 0 And J = 0 Then Toggle Light
Bitwait Pind.7 , Set
Tehát a gombot az előző 1-re várás és az IF....light
között kell megnyomnod.
Tehát a gombnyomásod miatt az előző bitwait-nél várakozik a felengedésre, és igen gyorsan tovaszalad.
Remélem, jól gondoltam....
(és jókor)
If Pind.7 = 0 And J = 2 Then Goto Main
Bitwait Pind.7 , Set
Itt ugye benne a bitwait 1-re.
Ha ez egyben áll, akkor tovább hipp-hopp a:
If Pind.7 = 0 And J = 0 Then Toggle Light
Bitwait Pind.7 , Set
Tehát a gombot az előző 1-re várás és az IF....light
között kell megnyomnod.
Tehát a gombnyomásod miatt az előző bitwait-nél várakozik a felengedésre, és igen gyorsan tovaszalad.
Remélem, jól gondoltam....
- szepnorbee
- Bitmanipulátor
- Hozzászólások: 122
- Csatlakozott: 2009. augusztus 31. hétfő, 6:00
-
Igazad volt! Köszi szépen! Probléma megoldva. Az első sort kitöröltem. Elég belőle az utolsó. Így tökéletes. Üdv!
Kód: Egész kijelölése
Bitwait Pind.7 , Set
Hasonló problémával küzdők mint szepnorbee ebben a topikban( 8. lap).
Egy relé meghuzási idejét kell mérni ( 1 - 20ms ), ugyanakkor egy output lábat bekapcsolni (relé meghuzási ideje *1,2) tehát 20 százalékkal tovább.
A proci attiny13 lenne. Ha jól tudom ebben csak egy 8bites timer van. A kérdésem hogyan tudom megoldani az egy timerrel a relé idejét mérni és a + 20% után az output lábat kikapcsolni. Az alábbi itt talált kodot szeretném átalakítani.
Előre is köszönöm a segítséget.
Egy relé meghuzási idejét kell mérni ( 1 - 20ms ), ugyanakkor egy output lábat bekapcsolni (relé meghuzási ideje *1,2) tehát 20 százalékkal tovább.
A proci attiny13 lenne. Ha jól tudom ebben csak egy 8bites timer van. A kérdésem hogyan tudom megoldani az egy timerrel a relé idejét mérni és a + 20% után az output lábat kikapcsolni. Az alábbi itt talált kodot szeretném átalakítani.
Kód: Egész kijelölése
$regfile = "attiny13.dat"
$crystal = 9600000
Config Portb.4 = Output
Config Pinb.1 = Input
Config Timer0 = Timer , Prescale = 1024
Portb.1 = 1
Dim Rel_int As Bit , Reletime As Long , pluszido As Long,
Reletime = 0
Rel_int = 0
On Int0 Rele_time
Enable Int0
Config Int0 = Falling 'INT L->H átmenetre
Enable Interrupts
Do
'Print Reletime, pluszido
Loop
End 'end program
Rele_time:
SELECT Case Rel_int
Case 0 :
set Portb.4
Timer0 = 0
Start Timer0
Config Int0 = Rising 'Következő INT H->L átmenetre
Rel_int = 1
Case 1 :
Stop Timer0
Reletime = Timer0
pluszido=Reletime/5
Config Int0 = Falling 'Következő INT L->H átmenetre
Rel_int = 0
END SELECT
Return
Előre is köszönöm a segítséget.
A kimenet szinkronban indul a relével vagy ha annak ideje meg van, akkor indul a Reletime+20% a kimeneten?
Én úgy csinálnám, így hirtelen, hogy lefutó-start o.k., ahogy Te írtad, felfutónál Timerbe beírnám:
Timer=255-reletime*1.2 és hajrá timer.
(persze szétszedve külön sorokba, ahogy a Bascom szereti)
Persze Timer overflow INT-et kell létrehozni, ami csak annyit csinál,
hogy kikapcsolja a kimenetet és STOP Timer.
Tehát szavakban, amikor megvan a Reléidő, akkor a Timerbe betöltöm a megnövelt időt (negatívban) és elindítom a timert, ami Overflow-nál lelövi a kimenetet (amit bekapcsoltál valamikor ugye...)
JAni
Én úgy csinálnám, így hirtelen, hogy lefutó-start o.k., ahogy Te írtad, felfutónál Timerbe beírnám:
Timer=255-reletime*1.2 és hajrá timer.
(persze szétszedve külön sorokba, ahogy a Bascom szereti)
Persze Timer overflow INT-et kell létrehozni, ami csak annyit csinál,
hogy kikapcsolja a kimenetet és STOP Timer.
Tehát szavakban, amikor megvan a Reléidő, akkor a Timerbe betöltöm a megnövelt időt (negatívban) és elindítom a timert, ami Overflow-nál lelövi a kimenetet (amit bekapcsoltál valamikor ugye...)
JAni
Sziasztok!
Egy hőmérő programnál elakadtam. Azt kellene tudnia, hogy ha nem érzékel szenzort, akkor Portb.5 láb (relé) lekapcsol és Portb.7 láb (led, zümmer) pedig be.
Addig jó is, hogy ha lehúzom a szenzort, az lcd kiírja, hogy "Err", Portb.5 és Portb.7 láb is kapcsol, de ezzel egyben lefagy, csak újra indítva működik.
Hogy lehet megcsinálni azt, hogy ha visszadugom a szenzort, folytassa a program futását, mérést? Esetleg a Do - Loop parancsokkal?
Eddig jutottam:
Egy hőmérő programnál elakadtam. Azt kellene tudnia, hogy ha nem érzékel szenzort, akkor Portb.5 láb (relé) lekapcsol és Portb.7 láb (led, zümmer) pedig be.
Addig jó is, hogy ha lehúzom a szenzort, az lcd kiírja, hogy "Err", Portb.5 és Portb.7 láb is kapcsol, de ezzel egyben lefagy, csak újra indítva működik.
Hogy lehet megcsinálni azt, hogy ha visszadugom a szenzort, folytassa a program futását, mérést? Esetleg a Do - Loop parancsokkal?
Eddig jutottam:
Kód: Egész kijelölése
If Temp = 300 Then
Set Portb.7
Set Portb.5
Locate 1 , 3
Lcd " Err "
Portb.5 = 0
Waitms 200
Portb.7 = 0
Do
Loop
End If