Vai al contenuto
PLC Forum


Rabbit 2000 Interrupt Timer - come generare un interrupt timer


zampx

Messaggi consigliati

Salve,

Sto cercando di misurare la velocità di una macchina tramite un sensore collegato ad una ruota dentata (60 denti).

Sto inoltre usando un rabbit 2000 per il controllo della macchina.

L'idea è di generare un interrupt ad ogni lettura del dente il qule va ad incrementarmi un contatore e in parallelo generare un interrupt a tempo e di contare quanti delti vendono letti ad ogni interrupt a tempo.

Il mio problema è gestire questo interrupt a tempo:

So che esistono due timer, A e B che possono generare degli interrupt ma non capisco come poter ottenere una

frequenza di interrupt abbastanza bassa (circa 4Hz) considerando che il clock del micro è 22,1MHz circa..

Chi mi può aiutare con un esempio? e chiarirmi come lavorano questi timer?

Ah ovviamente sto usando il Dinamic C 8.61...

Grazie Ciao

Link al commento
Condividi su altri siti


ciao,io non uso il Rabbit ma comunque lancio un'idea che però non è detto sia adatta al tuo problema. Per osservare il tuo conteggio ogni 250mS potresti costruirti un timer software fatto che viene aggiornato ogni millisecondo dal secondo timer a tua disposizione. La risoluzione è circa 1mS che magari è trascurabile rispetto ai tuoi 250.altrimenti conta più fitto.

/********************************************************************/

/* TimerAint interrupt function */

/* aggiorna ogni millisecondo il vettore dei timer dei millisecondi */

/* aggiorna ogni millisecondo il vettore dei timer dei secondi */

/* ogni timer è attivo se diverso da zero e aggiornato se attivo */

/********************************************************************/

static unsigned int timer_vect[MAX_TIMER];

static unsigned int timer_vect_sec[MAX_TIMER];

static unsigned int sec=0;

void TimerAint(void) // interrupt function

{

int i;

ENABLE_INTERRUPT; // enable interrupts

for(i=0;i<MAX_TIMER;i++) //aggiorno vettore millisecondi

{

if(timer_vect==0)

; //lascialo a 0 in quanto il timer sw nella posizione i è scaduto

else

timer_vect--;

}

sec++; //aggiorno vettore secondi(variabile esterna)

if (sec==60)

{

for(i=0;i<MAX_TIMER;i++)

{

if(timer_vect_sec==0);

else

timer_vect_sec--;

}

sec=0;

}

}

poi con questa varifichi se il tuo timer è scaduto (gli passi la posizione del vettore dei millisecondi che ti serve)

int check_timer_milli(int timer)

{

while (timer_vect_sec[timer]>0); //rimanendo in questa rutine permette all'altro interrupt di contare

return 1;

}

ciao,spero di non aver scritto un sacco di roba inutile :)

Link al commento
Condividi su altri siti

Per quello che hovisto , non mi sembra che ci siano entrate per encoder nella fam 2000.

Pero' e' strano che non ci sia la possibilita di comandare un contatore interno con un impulso esterno.

Link al commento
Condividi su altri siti

  • 2 weeks later...

per usare il timer b devi utilizzare una libreria che si scarica gratuitamente , puoi fare una ricerca su google

Ho cercato tanto anche io ma non ho trovato altro .

Poi ho preferito mollare il colpo con rabbit anche per questa ragione .

ciao

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...