ciao a tutti,
sto programmando un PIC16F877 e mi serve poter gestire le interruzioni su RB7 in cui ho messo una sorgente che genera impulsi da 0 a 12V. In pratica ho bisogno di contare le interruzioni al sec. Ho realizzato pertanto questa funzione:
void interrupt impulso(void){
//interrupt su RB7 if (RBIF){ count_interrupt++; // impuls/sec RBIF =3D 0; //riarmo il flag interrupt su RB7 }
/*DATI: Fclock =3D 20MHz Tclock =3D 50ns Tinstruzione =3D Tclock * 4 =3D 200ns TMR1 (16bit) -> conta fino a 65536 (prescaler =3D1) =3D> TMR1 arriva a contare fino a 65536 * 200ns =3D 13107,2us =3D> in 1 sec TMR1 conta fino a 1sec/13107,2us =3D 76*/
// TMR1IF=3D1 interrupt TMR1 overflow if (TMR1IF){ if (count_t1=3D=3D76){
variabile_globale=3Dcount_interrupt; TMR1IF =3D 0; TMR1L =3D 0x00; TMR1H =3D 0x00; count_interrupt =3D 0; count_t1 =3D 0; } else{ count_t1++; TMR1IF =3D 0; } } }
Visto che ho attivato il weak pull-up su PORTB mi servirebbe quindi poter contare gli impulsi sul fronte di discesa Il problema =E8 che count_interrupt assume valori molto strani: o =E8 0 o =E8 un valora molto maggiore di quello aspettato, (dovrei avere circa 50 interruzioni al sec su RB7), per cui la variabile_globale assume valori non prevedibili. Presumo quindi che non conto il fronte di discesa dell'impulso.
Dunque mi chiedevo se =E8 un problema di codice o se devo abilitare qualche altro bit oltre GIE, RBIE, PEIE, e TMR1IE? In tal caso potete suggerirmi un altro modo di gestire questi eventi su RB7?
grazie in anticipo.
daniele