Atmel AVR, wolne zliczanie impulsow encodera

May 06, 2004 0 Replies

Witam,



Mam problem ze zliczaniem impulsow encodera. Przy moim programie osiagam niecale 5 kHz czestotliwosci, przy ktorej wszystko dziala poprawnie. Potem gubione sa impulsy.



Generatorem jest drugi procesor AVR -- na razie robie proby bez encodera. Na oscyloskopie widac, ze przebieg jest prawidlowy.



Co robie zle?



Ponizej przedstawiam program. Procesor AVR ATmega16 Encoder podlaczamy: Kanal A : PD2 i PD3 Kanal B: PD4



#include <stdio.h>



#include <avr/io.h>



#include <avr/interrupt.h>



#include <avr/signal.h>



#include "lcd.h"



long int licz = 0; int flagaA = 0, flagaB = 0;


SIGNAL (SIG_INTERRUPT0) { if (!(inb(PIND) & 16)) /* jesli 0 na kanale B */ flagaA = 1; else /* w przeciwnym przypadku (1 na kanale B) */ flagaB = 1; }


SIGNAL (SIG_INTERRUPT1) { if (inb(PIND) & 16) { /* jesli 1 na kanale B */ if (flagaA) /* jesli flagaA ustawiona */ licz++, flagaA = 0; } else if (flagaB) /* jesli flagaB ustawiona */ licz--, flagaB = 0; }


int main(void) { char s[16];



outp(0, DDRD);



/* Ustawianie przerwan INT 0 i INT1 wyzwalanych zboczem narastajacym * i opadajacym. */ outp((1<<INT0)|(1<<INT1), GIMSK); outp((1<<ISC01)|(1<<ISC00) | (1<<ISC11), MCUCR);


initLCD();



sei(); /* zezwala na przerwania */



for (;;) { cursorHome(); sprintf(s, "%ld ", licz); wypiszLancuch(s); }



return 0; }


Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required