INT-ek kezelése (mi van ha INT alatt beesik a következő?)

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
Bence
Tranzisztorgyógyász
Hozzászólások: 166
Csatlakozott: 2007. október 30. kedd, 6:00

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

Sziasztok!

Mi történik akkor, ha van egy megszakításom amit a Timer generál pl. 10 ms-onként és a megszaktításban véletlenül 11 ms-t töltök el? Újra az elejére ugrik, vagy előbb befejezi és csak aztán?

Köszi: Bence
Bence
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

lefut a megszakitas, kiugrik a foprogramba, majd azonnal a következő megszakításba...

Ja es a főprogramod nem fut.
Amúgy 11 msec a megszakításban???? Azért az durva tervezési hiba...
Avatar
Bence
Tranzisztorgyógyász
Hozzászólások: 166
Csatlakozott: 2007. október 30. kedd, 6:00

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

Köszi Robert!

Nem 11 msec, ez csak egy példa volt. 65 us csak ha van gomb lenyomás akkor 1 msec (a Print miatt). Ha két gomb lett egyszerre lenyomva, akkor 2 msec, ha 11, akkor 11 msec. Nem valószínű hogy egy időben le lesz nyomva 2 gombnál több, de érdekelt, hogy mi történik ha mégis.
Bence
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

Ajaj... Az a nehany Msec is igen sok!
A print utasitast tedd at ugy, hogy config serialout=buffered, size= 20.
Igy pufferbol lesz az adasod,!
Avatar
Bence
Tranzisztorgyógyász
Hozzászólások: 166
Csatlakozott: 2007. október 30. kedd, 6:00

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

Ha pufferelem, akkor lassabban fogja elküldeni, nem? Csak mert itt nagyon fontos a sebesség, azért is akarom a nyomógombokat így kezelni.
Bence
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

Nem. Csak nem varja meg, hogy a 1-1 karakter el ment e, hanem pufferbe rakjam, es onnan kuldozgeti szepen az AVR.

9600 eseten a bufferelten adsz 10 byte-t, akkor a főprogreamod 10 ms-ig all.
Ha bufferelten, akkor a bufferbe bekerul, es kuldodik, mig a foprogramod mar tuvabb szalad. gyakorlatilag paralell megy a kuldes es a programfutasod... Nyertel ~7 msec-t!
Avatar
Bence
Tranzisztorgyógyász
Hozzászólások: 166
Csatlakozott: 2007. október 30. kedd, 6:00

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

Aha, értem, köszi!
Egyébként 31250-en megy a MIDI miatt.
Bence
Avatar
zb83
Biztosítékgyilkos
Hozzászólások: 69
Csatlakozott: 2008. október 24. péntek, 6:00

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

Robert írta:lefut a megszakitas, kiugrik a foprogramba, majd azonnal a következő megszakításba...

Ja es a főprogramod nem fut.
Amúgy 11 msec a megszakításban???? Azért az durva tervezési hiba...
Sziasztok,

Pont ilyesmire keresem a választ. Több megszakítást még nem kezeltem egyszerre, ezért nem tudom, hogy is fog működni a dolog.

Szóval adott a következő szituáció

Aktiválva vannak a következő megszakítások:
urxc
urxc1
timer1
Int0

Minden egyes megszakítás rutinja úgy kezdődik, hogy "Disable Interrupts". Ezt azért csinálom így, hogy a megszakítást ne szakítsa meg egy másik megszakítás. Ezután elvégzi a dolgát a rutin, majd miután visszatérne, Enable Interrupts.

Szóval a kérdés az, hogy mi történik akkor ha egy megszakítás alatt befut mondjuk még pluszba a maradék három. Miután visszatérek az elsőből, fogja érzékelni a progi, hogy ott van még másik 3 lekezelendő megszakítás? Ha igen, hogy dönti el, hogy melyikkel kezdjen?

Van jó megoldás több megszakítás helyes kezelésére?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

DISABLE INTERRUPTs TILOS!

Ez a főprogramra vonatkozik. Az INT nem megszakítható AVR esetén, hanem a besett INTeket a lefutó INT _után_ szolgálja ki!

A sorrendet a AVR INT prioritás szerint hajtja végre -> adatlap.

Olvsd át az INT fejezetet, a bascom könyvből. Sokminden tanulhtó belőle....
Avatar
zb83
Biztosítékgyilkos
Hozzászólások: 69
Csatlakozott: 2008. október 24. péntek, 6:00

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

Minden világos, köszi! Ma is tanultam valamit.
Avatar
Zolp
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2007. március 7. szerda, 7:00

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

Sziasztok,

A kérdés a következő:
Hogyan lehet azt elérni, hogy ha egy subrutinon belül érkezik a megszakitás (pl. gombnyomás), akkor ne innen (mármint a subrutinon belülről), hanem a főprogram bizonyos részéről folytatódjon a futás?
Goto utasitással lehet konkrét programsorra ugrani?
Köszönöm,
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Aki ezt megkérdezi, annak nem lehet! Sőt tilos!
Asemblerben (Gépi kódban) programozva megoldható lenne, de ahhoz tudni kellene programozni!
A lényeg, ha nem szabályosan akarsz kilépni neked kel kezelni a Vermet!
Különben összeomlik a rendszer!
:roll:

Ui.: Ez a Megszakítás kezelése topik! A Szubrutin már másik téma lenne!
:twisted: :?
Avatar
Zolp
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2007. március 7. szerda, 7:00

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

A kérdésben van megszakitás és subrutin is. Olyan topikot, ahol a kettővel együtt foglalkoznak nem találtam, ezért merészeltem ide irni. :?
A választ egyébként köszönöm.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

Szubrutin a főprogramban került meghívásra?

Egyszerű: az elején add ki a disable interrupts utasítást, majd a legvégén (end sub előtt) az enable interrupts-ot. Így ami a tiltás alatt esett be INT kérés, az az engedélyezés _után_ kerül végrehajtásra. De ha többször esik be INT, akkor is csak 1x hajtódik végre.

Főszabály:
Megszakítási alprogramot másik INT-l nem szakíthatsz meg (na jó van kiskapu, de az már necces!)
ha mégis ez szükséges akkor:
-> xMega processzor
-> ASM programozás
-> bascom virtuóznak kell lenni...

Ált. nem kell ilyen szoros időzítés...
Avatar
Zolp
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2007. március 7. szerda, 7:00

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

Igen, a subrutin a főprograból kerül meghívásra.
A disable-enable int-es megoldás már nekem is eszembe jutott, de az adott programban ez a megoldás csak amolyan áthidaló vagy szükségmegoldás lenne, ezért szerettem volna vmi jobbat.
Mindegy, akkor marad ez, amit javasoltál vagy átírom a programot, úgy, hogy ne legyen benne subrutin, és máris megoldódik a probléma. :)

Üdv,
Válasz küldése