Int0 és a timer0 kapcsolata ATMEGA64
Int0 és a timer0 kapcsolata ATMEGA64
Bele ütköztem egy anomáliába.
Van egy nyomógombom int0-n használom egyszerű a dolog egy nyomás 0 második nyomás 1 aztán így tovább 0/1/0/1/0/.....
közben a háttérben fut egy timer ami adott időben generál egy megszakítást és ennek hatására 8 láb sorban kapcsolgatom be őket.
Na mármost ha az int0-n lévő nyomógombomat prellegtetni kezdem vagyis gyorsan nyomkodom a processzorom befagy vagy újra indul.
Mitől jön elő ez a hiba a proci adatlapjába nem találok erre választ??!!!
ha ki kapcsolom a timert akkor a hiba nem történik meg.
illetve a többi inten is vannak gombjaim azokon ez a hiba nem észlelhető!
Van egy nyomógombom int0-n használom egyszerű a dolog egy nyomás 0 második nyomás 1 aztán így tovább 0/1/0/1/0/.....
közben a háttérben fut egy timer ami adott időben generál egy megszakítást és ennek hatására 8 láb sorban kapcsolgatom be őket.
Na mármost ha az int0-n lévő nyomógombomat prellegtetni kezdem vagyis gyorsan nyomkodom a processzorom befagy vagy újra indul.
Mitől jön elő ez a hiba a proci adatlapjába nem találok erre választ??!!!
ha ki kapcsolom a timert akkor a hiba nem történik meg.
illetve a többi inten is vannak gombjaim azokon ez a hiba nem észlelhető!
-= STK500 =-
Gondolom az INT0 -ban nem engedélyezed újból a megszakításokat...
Mivel AVR-nél nem lehet, hogy egy futó INTbe befusson egy másik, esetleg önmaga többször, így elég rejtélyes a dolog. Talán még az lehet, hogy az INT0 elrak valami adatokat, amit a külső rutin nem vesz ki időben és túlfut (pl. string). Simulatorban kiakad?
JAni
Mivel AVR-nél nem lehet, hogy egy futó INTbe befusson egy másik, esetleg önmaga többször, így elég rejtélyes a dolog. Talán még az lehet, hogy az INT0 elrak valami adatokat, amit a külső rutin nem vesz ki időben és túlfut (pl. string). Simulatorban kiakad?
JAni
de ha nem int0-bn használom csak sima bementeként akkor is meg csinálja ezt. A többi nyomógombom meg nem tesz ilyet pedig mind inten van.
Én a kvarcra gyanakodtam de belsőröl is meg csinálja.
Stringem van mert a timer a kijelző segmenseimet hajtja a teh általad javasolt módon winerbt.
És ott van benne string.
Én a kvarcra gyanakodtam de belsőröl is meg csinálja.
Stringem van mert a timer a kijelző segmenseimet hajtja a teh általad javasolt módon winerbt.
És ott van benne string.
-= STK500 =-
Mi van az INT0-ban és mi a Timer megszakításruninban?
Az új bascomban a stcheck ellenőrzést ha lefuttatod, mit csinál?
A régebbiben az stcheck lefuttatva a rutinban error változó mit mond?
Az AVR-ben INT sorbaállítás van. Így egyik nem szakítja meg a másikat.
Hiba lehet még:
INT-ben (INT vagy Timer vagy bármi interrupt alapú), ha single-t hazsnálsz, mert van 2 regiszter amit nem ment a Bascom! Mintha a CNC-s fórumrészben lett volna erre megoldás.
Egyéb változótípusokkal nincs gond (Double nem volt tesztelve!).
Az új bascomban a stcheck ellenőrzést ha lefuttatod, mit csinál?
A régebbiben az stcheck lefuttatva a rutinban error változó mit mond?
Az AVR-ben INT sorbaállítás van. Így egyik nem szakítja meg a másikat.
Hiba lehet még:
INT-ben (INT vagy Timer vagy bármi interrupt alapú), ha single-t hazsnálsz, mert van 2 regiszter amit nem ment a Bascom! Mintha a CNC-s fórumrészben lett volna erre megoldás.
Egyéb változótípusokkal nincs gond (Double nem volt tesztelve!).
az intben csak egy változót növelek.
és a főprogramban értékelem ki azt.
a timerben is csak amikor bele fut meg hívok egy subot és abban dolgozom.
mert ugyen nem szabad sokat ücsörögni benne. Tőlled tanultam Robert.
int0:
timer:
ezt a stcheck -et néztem a helpben de nem igazán értem. a simulátorban nem tudom ezt már futattni akkora a progi. Mindent nem tud szimulálni szegényke. Soros portem meg nincs a hardveren.
és a főprogramban értékelem ki azt.
a timerben is csak amikor bele fut meg hívok egy subot és abban dolgozom.
mert ugyen nem szabad sokat ücsörögni benne. Tőlled tanultam Robert.
int0:
Kód: Egész kijelölése
Riasztleint:
Incr Riasztleszamol
If Riasztleszamol = 2 Then
Riasztleszamol = 0
End If
ReturnKód: Egész kijelölése
Overflow_isr:
Tcnt0 = &HE6
Incr Timecount
If Timecount = 30 Then
Timecount = 0
Incr Segment
Call Kijelzes
If Segment > 8 Then Segment = 0
End If
Return
A hozzászólást 1 alkalommal szerkesztették, utoljára szovhoz 2010. november 20. szombat, 9:22-kor.
-= STK500 =-
A "kijelzés" menüben mit művelsz?
A Timer0 hogy van konfigurálva? Prescale, Chip órajel, stb.
A Timer 0-ban 25 tick-et (azaz 25 Timer0 lépést) tudsz végrehajtani, mert 256-n újra generál INT-et!
Ha a Timer0 16 MHz/Prescale 1024-n jár, akkor 640 Hz-vel lép be ide (kb)
Ezidő alatt a processzor végrehajthat max. 25000 utasítást (ASM).
A kódod - ha a 7szegmens meghajtása - akkor ~1000-2000 ASM utasítást jelenthet. Így itt a processzorerőforrás 10%-át elpazarlod!
A TCNT0 = &HE6 helyett nem lehet kisebb számot írni?
A Timer0 hogy van konfigurálva? Prescale, Chip órajel, stb.
A Timer 0-ban 25 tick-et (azaz 25 Timer0 lépést) tudsz végrehajtani, mert 256-n újra generál INT-et!
Ha a Timer0 16 MHz/Prescale 1024-n jár, akkor 640 Hz-vel lép be ide (kb)
Ezidő alatt a processzor végrehajthat max. 25000 utasítást (ASM).
A kódod - ha a 7szegmens meghajtása - akkor ~1000-2000 ASM utasítást jelenthet. Így itt a processzorerőforrás 10%-át elpazarlod!
A TCNT0 = &HE6 helyett nem lehet kisebb számot írni?
akód ott van nállad robert.
ha kisseb számot adok meg csökken a kijelzőn a fényerőm. habár ha csökentem de a timercountot növele elérhető ugyan az!
ha kisseb számot adok meg csökken a kijelzőn a fényerőm. habár ha csökentem de a timercountot növele elérhető ugyan az!
Kód: Egész kijelölése
$regfile = "m64def.dat"
$crystal = 14745600
$eeprom
$data
$hwstack = 128
$swstack = 128
$framesize = 2048
Config Timer0 = Timer , Prescale = 8
Dim Timecount As Word : Timecount = 0
A hozzászólást 1 alkalommal szerkesztették, utoljára szovhoz 2010. november 20. szombat, 9:27-kor.
-= STK500 =-
http://avr.tavir.hu/modules.php?name=Co ... age&pid=50
lap közepe: stcheck....
Tipp: prescale=8 helyett 64-t adsz meg, nem javul a helyzet?
Az AVR erőforrásainak végén jársz!
A programkódban a kijelzés sub...
helyett
vagy még jobb:
Ezzel nyersz ~40-50 utasítást!
lap közepe: stcheck....
Tipp: prescale=8 helyett 64-t adsz meg, nem javul a helyzet?
Az AVR erőforrásainak végén jársz!
A programkódban a kijelzés sub...
Kód: Egész kijelölése
Sub Kijelzes
Select Case Segment
Case 1:
Portb.0 = 0
Portb.1 = 0
Portb.2 = 0
Portb.3 = 0
Portb.4 = 0
Portb.5 = 0
Portb.6 = 0
Portb.7 = 1 ' 1 segment be kapcsolása
Porta = Sl(4) ' szám kiíratása
Case 2:
Portb.0 = 0
Portb.1 = 0
Portb.2 = 0
Portb.3 = 0
Portb.4 = 0
Portb.5 = 0
Portb.7 = 0
Portb.6 = 1 ' 2 segment be kapcsolása
Porta = Sl(3) ' szám kiíratása
.....
Kód: Egész kijelölése
Sub Kijelzes
Select Case Segment
Case 1:
Portb = 0
Portb.7 = 1 ' 1 segment be kapcsolása
Porta = Sl(4) ' szám kiíratása
Case 2:
Portb = 0
Portb.6 = 1 ' 2 segment be kapcsolása
Porta = Sl(3) ' szám kiíratása
....Kód: Egész kijelölése
Sub Kijelzes
Select Case Segment
Case 1:
Portb = &b10000000
'Portb.7 = 1 ' 1 segment be kapcsolása
Porta = Sl(4) ' szám kiíratása
Case 2:
Portb = &b01000000
'Portb.6 = 1 ' 2 segment be kapcsolása
Porta = Sl(3) ' szám kiíratása
....Ezzel nyersz ~40-50 utasítást!
A hozzászólást 1 alkalommal szerkesztették, utoljára Robert 2010. november 20. szombat, 9:31-kor.
Elég a kijelző frissítési frekit 10..16*szegmensszámon tartani (de lehet hogy ez alá is lehet menni)!
Nagyon sok időt vesz el....
Az IF esetén a If valami=b and valami2=C and kukac=3 then....
helyett az
javasolt...
Nagyon sok időt vesz el....
Az IF esetén a If valami=b and valami2=C and kukac=3 then....
helyett az
Kód: Egész kijelölése
If valami = b then
if valami2=c then
if kukac=3 then
mitortenik
endif
endif
endif
stcheck->7szegmenses utolsó szegmensét beáldozod a debug idejére....
A PowerDown utasítás után nem kell valamit inicializálni?
Elemes táplálású a holmi? Ha nem, akkor nem vacakolnék vele. Nem a chip figyaszt sokat...
ADC mérés esetén NE Singlevel számolj. Igen erőforrásigényes a kettestört (na jó, tizedestört). Vedd a 1024 szeresét, vagy 2048 szorosát és tedd single helyett LONG típusba. OK, hogy a programot át kell írni, de így egész számokkal lehet számolni (NE humán, hanem PROGRAMOZÓ fejjel goldolkodj és növessz még 6 ujjat (így 16-os számrendszerben lehet számolni kézen...))
A PowerDown utasítás után nem kell valamit inicializálni?
Elemes táplálású a holmi? Ha nem, akkor nem vacakolnék vele. Nem a chip figyaszt sokat...
ADC mérés esetén NE Singlevel számolj. Igen erőforrásigényes a kettestört (na jó, tizedestört). Vedd a 1024 szeresét, vagy 2048 szorosát és tedd single helyett LONG típusba. OK, hogy a programot át kell írni, de így egész számokkal lehet számolni (NE humán, hanem PROGRAMOZÓ fejjel goldolkodj és növessz még 6 ujjat (így 16-os számrendszerben lehet számolni kézen...))