Newsgroup: it.hobby.elettronica.digitale
Titolo: routine ISR : dove metterla?

Ciao a tutti.
Ecco una domanda da babbano
Il PIC è un 16f877 4MHz
Il codice è in C ( Hi-tech piclite)
Nel mio programmino ( una sorta di orologio contatore) ho incluso la parte 
di codice che controlla se c'è l'interrupt ( TMR0IF) e gli faccio 
incrementare il mio contatore alla bisogna.
Tutto questo nella main() del programma controllando se TMR0IF è settato.
Nella main() ho un ciclo continuo che stampa in mpx su 4 display 7 segmenti 
il valore che si iincrementa.
Ho visto pero' esempi di codice con una routine interrupt_isr () etc esterni 
alla main() del codide.
Come devo procedere?
Qualcuno mi puo' spiegare la differenza dei due approcci?
Ora voglio passare  a memorizzare in Eeprom a bordo PIC il tempo in cui 
stacco un relè e vorrei aver scritto finora un codice corretto.
Grazie
Andrea
Ps
Allego il codice scritto finora.
#include"pic.h"
//#include"pic1687x.h"
#include"delay.c"
#include "lcd.c"
#include"stdio.h"
#define XTAL_FREQ 4MHZ
__CONFIG (WDTDIS & XT & UNPROTECT & LVPDIS & DUNPROT & PWRTEN & DEBUGDIS & 
BORDIS /*& WRTDIS*/);
double i;
int long numero,limite;
int long conteggio,valore;
int azzeramento,ciclo;
LED(int numero,int cifra){
//PORTD=0;
//PORTB=0;
switch(cifra){
case 1:
RD7=1;
RD6=0;
RD5=0;
RD4=0;
break;
case 2:
RD7=0;
RD6=1;
RD5=0;
RD4=0;
break;
case 3:
RD7=0;
RD6=0;
RD5=1;
RD4=0;
break;
case 4:
RD7=0;
RD6=0;
RD5=0;
RD4=1;
break;
}
switch(numero){
case 0:
PORTB=126;
break;
case 1:
PORTB=12;
break;
case 2:
PORTB=182;
break;
case 3:
PORTB=158;
break;
case 4:
PORTB=204;
break;
case 5:
PORTB=218;
break;
case 6:
PORTB=250;
break;
case 7:
PORTB=14;
break;
case 8:
PORTB=254;
break;
case 9:
PORTB=222;
break;
case 10: // scrivo la P
PORTB=230;
break;
case 11: // scrivo la R
PORTB=238;
break;
}
}
PUT(){
valore=conteggio/1  /*  0*/;
numero=valore/1000;
LED(numero,1);
numero=valore%1000;
numero=numero/100;
LED(numero,2);
numero=valore%100;
numero=numero/10;
LED(numero,3);
numero=valore%10;
LED(numero,4);
}
main()
{
ciclo=0;
limite=10;
//Timer
GIE=1;
T0CS=0;
PSA=0;//prescaler assegnato al TMR0
PS2=1;
PS1=1;
PS0=1; // prescaler = 256
//quindi la frequenza del timer0 S :
//(4000000/4)/256=3906,25 Hz= 256 microsecondi
// dopo 15 azzeramenti del TMR0IF e' passato un secondo ( CIRCA )
//programma proncipale.
//qui gestisco gli INTERRUPT etc
PORTB=0;
TRISB=0b00000000;
PORTD=0;//  come uscite
TRISD=0b00000011;// setto le uscite
conteggio=0;
azzeramento=0;
for(;;){
// gestisco interrupt su TIMER0
inizio:
if (ciclo){ // solo se S abilitato il conteggio
if (TMR0IF){
++azzeramento;//incremento l'azzeramento
TMR0IF=0; // resetto il bit per intercettare il prossimo overflow
 if (azzeramento==15) {
  azzeramento=0;
  ++conteggio;
 }
}
}
PUT();
if(conteggio==limite)// solo se non ho ancora raggiunto il limite
{
ciclo=0;
RD3=0;
RD2=0;
conteggio=0;
azzeramento=0;
}
if (RD1==1){ // gestisco lo start e lo stop
DelayMs(200);
if (ciclo==0) {
ciclo=1;
RD2=1; // RElE' acceso
RD3=1;// RELE'  acceso
}else {
ciclo=0;
RD2=0;  // relè spento
RD3=0;
conteggio=0;
azzeramento=0;
}
}
// entro in programmazione del limite per il conteggio
if(RD0==1 && RD1==1){
DelayMs(200);
DelayMs(200);
ciclo=0;
for ( i=0;i<3;i++){  // scrivo prog sul display
LED(10,1);
DelayMs(60);
LED(11,2);
DelayMs(60);
LED(0,3);
DelayMs(60);
LED(6,4);
DelayMs(60);
}
for ( i=0;i<100;i++){
LED(10,1);
DelayMs(3);
LED(11,2);
DelayMs(3);
LED(0,3);
DelayMs(3);
LED(6,4);
DelayMs(3);
PORTB=0;
}
//Ora leggo la eprom e stampo a video il valore
//fingo che il valore letto sia limite che ho fissato io
while (!( RD0==1 && RD1==1) ){     //ho due pulsanti su RD0 e RD1 che 
serviranno per incrementare il limite e RD1 per avvio e stop conteggio
conteggio=limite;
PUT();
if (RD1==1){
 ++limite;
 DelayMs(200);
}
if ( RD0==1){
 --limite;
 DelayMs(200);
}
//ora devo salvare il valore in eeprom
}
goto inizio;
}
}
} 

 ha scritto nel messaggio 
news:UII5f.22187$Pe2.4...@twister2.libero.it...



Grazie.
Per il momento ho lasciato il controllo del Timer0IF nella main.
al piu' presto sistemo il codice e approfondisco l'argomento.
ciao e grazie
Andrea