@ lm741
Ovih dana sam u velikoj gužvi pa ne stižem da se uključim niit da pratim pažljivo, ali jedna stvar mi je zapela za oko, a to je ovaj deo programa, tj. interapt rutina koju si napisao:
Code:
pik:
INTCON.7=0 'zabrana svih prekida dok se trenutni obradi
'ako je detektovana promena na pinu RB.0
if INTCON.1=1 THEN brojac=brojac+1 'uvecaj brojac za 1
INTCON.1=0 'obrisan fleg
INTCON.7=1 'omoguceni svi prekidi
INTCON.4=1 'omogucen prekid na RB.0
'izlaz iz interapta
RESUME
Kao prvo, nema potrebe za prvom naredbom jer to PIC automatski odradi kada nastupi interapt.
Kao drugo, ne vidim da na početku interapt rutine čuvaš, a na kraju vraćaš sadržaj bitnih registara.
Kao treće, izlaz iz interapt rutine je OBAVEZNO sa ASM naredom retfie (a ne RESUME) jer ona, pored povratka ujedno setuje GIE bit. To sam ti već rekao u ovom postu:
http://www.elitesecurity.org/p2484774
Znači, ovo što sam ti rekao je VEOMA VAŽNO za ispravan rad interapta i to što ti rutina radi kako treba u ovom slučaju je čista sreća, a radi kako treba jer se u njoj ne menja sadržaj ni W ni STATUS registra, a ti sam vodiš računa o GIE bitu. Da se ne menja W registar to je sasvim jasno, a status registar jedino bi mogla da promeni naredba uvećanja promenljive "brojac" kada predje sa 255 na 0, ali to se nikada ne dešava jer se u glavnom programu ne dozvoljava da ona predje 100. Kada bi se iz te rutine izbacile neke nepotrebne naredbe, izgledala bi kao da ju je pisao neko ko je svestan da se važni registri ne menjaju i zato ih ne čuva (lalo, bez uvrede :) ). Znači, u ovom slučaju int. rutina bi mogla da se napiše ovako:
Code:
pik:
brojac=brojac + 1
intcon.1=0
@ retfie
Ispitivanje intcon.1 bita ti ne treba ako su ti ostali izvori interapta isključeni jer je tada samo taj bit setovan, a čini mi se da ne koristiš drugi izvor.
Pozdrav.
Sinisha