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; }