Atmel AVR, wolne zliczanie impulsow encodera

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

Reply to
invalid unparseable
Loading thread data ...

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.