Atmel AVR, wolne zliczanie impulsow encodera
Masz problem? Zapytaj na forum elektroda.pl
From: "Umpa" <šżćó_at_nospam_umpaumpalala.com>
Subject: Atmel AVR, wolne zliczanie impulsow encodera
Date: Fri, 7 May 2004 00:19:26 +0200
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;
}
========
Path: news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.ipartners.pl!not-for-mai