Atmel AVR, wolne zliczanie impulsow encodera



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
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