interruzioni PIC16F877 su RB7

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

Reply to
daniele
Loading thread data ...
*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* il codice che hai scritto non l'ho capito... cmq mi sembra abbastanza semplice quello che chiedi

- ti serve un adattatore (partitore?) per portare il segnale 0-12V in 0-vdd (vdd è l'alimentazione del pic... max +5v)

- il pull-up interno non ti serve a nulla (hai detto che il tuo segnale è

0-12V, no?)

- la isr dell'int_ext deve solo aumentare un contatore

- poi ti serve un timer che scatti ad intervalli regolari (1 secondo? che precisione ti serve?) e legga la variabile che incrementi tramite la isr dell'int_ext

- fine

se stai cercando di fare un frequenzimetro hai scelto la strada sbagliata :)

-ice-

Reply to
ice

è già da un po' che lavoro sulla serie 18 cmq di sicuro il 16f877 ha un ingresso esterno sul timer1 o sul timer0 in pratica il segnale esterno incrementa direttamente il contatore del "timer" (settato in modalità counter, ovvio) quindi tu devi solo conteggiare il tempo, imho è più semplice e ti permette di raggiungere sample-rate maggiori (perchè ti servono meno istruzioni per gestire l'incremento, ecc...)

se ti serve precisione però conta che valori del quarzo standard come 2MHz,

4MHz, ecc... sono sfortunati perchè non riesci a generare un interrupt ogni secondo esatto... serve un quarzo da 32768khz se ben ricordo

cmq se cerchi con google o nei vecchi post è un argomento ben documentato

-ice-

Reply to
ice

ta

n

mette

er

Hz,

gni

o

GRAZIE 1000 ICE!!! ;-)

Reply to
daniele

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.