Premessa: non mi ci ritrovo tanto con il Mikroc, sono abituato al ccs.
Se non capisco male, vuoi fare qualcosa su portb se tempo>0.
Forse vuoi far lampeggiare dei led, aspettando mezzo secondo tra una configurazione e l'altra.
Codice:
if(tempo > 80)
{
portb=160;
delay_ms(500);
portb=32;
delay_ms(500);
portb=128;
delay_ms(500);
portb=32;
delay_ms(500);
}else{
portb=0;
} Il problema di fondo che io vedo è legato all'uso della variabile
tempo.
Questa viene impostata in maniera asincrona dalla funzione che gestisce l'interrupt e controllata all'interno del ciclo while infinito nel main.
Leggi la variabile
tempo e in base al suo valore decidi cosa fare.
Perfetto.
Solo che la variabile
tempo cambia continuamente di valore perché gli interrupt arrivano uno dietro l'altro.
Per rimediare puoi per esempio fare così:
puoi effettuare la misurazione e, una volta impostata la var
tempo, disabilitare gli interrupt. La routine nel main esamina
tempo e quando lo trova impostato, esegue qualcosa e riabilita gli interrupt.
Evita di eseguire lungi cicli come
Codice:
if(tempo=0)
{
portb.f7=1;
delay_ms(1000);
portb.f7=0;
delay_ms(1000);
} In questi 2 secondi sai quanti interrupt arrivano e tu non esamini il valore di
tempo?
Per assurdo potresti leggerlo sempre a 0.
Ad esempio: lo leggi una volta, è zero, esegui quanto sopra che dura circa 2 secondi (!) durante i quali chissà quante volte viene impostato tempo. Poi ripeti il controllo e, putacaso,
tempo è stato appena azzerato per cui rifai quanto sopra per altri 2 secondi...!
[EDIT]

Badavo alla logica del programma e mi era sfuggito if (tempo=0)!!!
Vado a prendere il caffé, meglio