Mivel még kezdő vagyok az avr programozáshoz, konkrétan az Atmega128-hoz , ezért természetesen semmi sem úgy megy ahogy elképzeltem. Konkrétan az a problémám hogy nem megy a külső megszakítás és nem jövök rá hogy miért. Proteus-ban tesztelek.
Nagyjából értem mit akarsz az SREG-es dologgal.
De az SREG csak a kontroller állapotát tükrözi, az aktuális utasítás címét nem.
Egyébként az IRQ mikor végzett, oda tér vissza ahol éppen tartott a vérehajtás...tehát a végtelen ciklusodba.
Valóban , lemaradt 1-2 ellenállás. Úgy megy a megszakítás csak nem oda tér vissza ahova kéne. Nem egy ledet villogtat csak már kínomba annyira le egyszerűsítettem a progit hogy ez maradt. A lényeg az hogy van
Nem értem miért ragaszkodsz te az ugráláshoz, az IRQ-ból ez így nem illik:)
A megszakítás lementi a verembe forráscímet, meg a C fordító még 1-2 regisztert is.
Ha így simán kiugrasz, az IRQ végét jelentő RETI utasítás elmarad(ergo veremben marad a cím, meg miegyéb) , és gyanítom hogy elöbb-utóbb veremtúlcsordulásod lesz.
Az a PORTD|=8 miért nem fér bele az IRQ függvénybe?
A megszakításból RETI-vel kel kilépni!
Ha nem így teszel, akkor elmarad az automatikus INT engedélyezés, és a veremből a visszatérési cím kivétele!
Amit illik a programban pótolni! Különben előbb, utóbb hibát okoz!
Ragaszkodom hozzá , mivel a while(1) -n belül elég komoly és komplex programrészlet van amit nem publikálhatok egyéb okok miatt . De ki kell ugranom mindenképpen meg kell szakítani azt a részt és ki kell ugrani a while ciklus elé.
A megszakittas ha tul hosszu, akkor abbol akadas lesz!
Ha megszakitasbol nem lepsz ki, akkor a követkeuot nem tudod fogadni!
Probalj meg LCDre kiirni vmit megszakitasbol....
Pl gombnyomast. Nezd meg a Bascom Megszakitas fejezetet.... Ott van minta:)
while(1){
while(feltetel){
csinál_valamit_1();
csinál_valamit_2();
// teszemazt itt jár a program, és megtörténik a megszakítás, akkor ide is fog visszatérni és lefut a többi programrész, aminek nem lenne szabad, ( akár elöl , akár hátul tesztelő ciklusom van), és a szubrutinokba nem tehetek minden sor után vizsgálatot, mert az kb 400-500 sor
csinál_valamit_n-1();
csinál_valamit_n();
}
}
hogy nem tudom használni újra a megszakítást, erre szolgál a longjmp() második paramétere, ha jól értelmeztem.
Forgass le egy hasonló programot, visszafordítom gépi kódra, és megmondom mit csinál a longjmp(), ha gondolod persze.
Lehet hogy lekezel mindent, nem mondom hogy nem...
De jut eszembe, mi lenne ha a reset-et használnád triggernek?