Int0 és a timer0 kapcsolata ATMEGA64

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
szovhoz
Bitfaragó
Hozzászólások: 608
Csatlakozott: 2007. április 7. szombat, 6:00

Int0 és a timer0 kapcsolata ATMEGA64

Hozzászólás Szerző: szovhoz »

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ő!
-= STK500 =-
Avatar
winnerbt
Elektronbűvölő
Hozzászólások: 907
Csatlakozott: 2007. március 25. vasárnap, 6:00

Hozzászólás Szerző: winnerbt »

Stack növelés segít?
Avatar
szovhoz
Bitfaragó
Hozzászólások: 608
Csatlakozott: 2007. április 7. szombat, 6:00

Hozzászólás Szerző: szovhoz »

$hwstack = 512
$swstack = 512
$framesize = 2048

most ennyi ennél feljembb nem nagyon mehetek mert kevesli majd az sramot.
-= STK500 =-
Avatar
winnerbt
Elektronbűvölő
Hozzászólások: 907
Csatlakozott: 2007. március 25. vasárnap, 6:00

Hozzászólás Szerző: winnerbt »

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
Avatar
szovhoz
Bitfaragó
Hozzászólások: 608
Csatlakozott: 2007. április 7. szombat, 6:00

Hozzászólás Szerző: szovhoz »

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.
-= STK500 =-
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

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!).
Avatar
winnerbt
Elektronbűvölő
Hozzászólások: 907
Csatlakozott: 2007. március 25. vasárnap, 6:00

Hozzászólás Szerző: winnerbt »

Már nem tudom, melyik 2 nem mentődik, most 12-13-14-15-t mentek a single-művelet miatt INTben.
A string olvasásakor nincs gond, de túlírni azt lehet végtelenségig. Akkor belelóg a következő változóba, ha az nincs, akkor a stack-be...reccs!
JAni
Avatar
szovhoz
Bitfaragó
Hozzászólások: 608
Csatlakozott: 2007. április 7. szombat, 6:00

Hozzászólás Szerző: szovhoz »

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. :D

int0:

Kód: Egész kijelölése

Riasztleint:
Incr Riasztleszamol
If Riasztleszamol = 2 Then
Riasztleszamol = 0
End If
Return
timer:

Kó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
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.
A hozzászólást 1 alkalommal szerkesztették, utoljára szovhoz 2010. november 20. szombat, 9:22-kor.
-= STK500 =-
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

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?
Avatar
szovhoz
Bitfaragó
Hozzászólások: 608
Csatlakozott: 2007. április 7. szombat, 6:00

Hozzászólás Szerző: szovhoz »

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!

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 =-
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

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

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

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 
....
vagy még jobb:

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.
Avatar
szovhoz
Bitfaragó
Hozzászólások: 608
Csatlakozott: 2007. április 7. szombat, 6:00

Hozzászólás Szerző: szovhoz »

épp olvasom azt. csak nem igazán látom át pontosan hogyan is nyomjam bele a progimba. És a másik hogy hogy szedjem ki belőlle soros port nélkül az adatot de arra gondoltam bele az eepromba.
-= STK500 =-
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

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

Kód: Egész kijelölése

 
If valami = b then
  if valami2=c then
    if kukac=3 then 
      mitortenik
    endif
  endif
endif
javasolt...
Avatar
szovhoz
Bitfaragó
Hozzászólások: 608
Csatlakozott: 2007. április 7. szombat, 6:00

Hozzászólás Szerző: szovhoz »

tehát próbáljam meg optimalizálni a progit mert a procim nem bírja a kiképzést! magyarul.

Ok akkor neki kezdek ennek. ha meg lessz szólok. meg látjuk.
-= STK500 =-
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

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...))
Válasz küldése