реклама на сайте
подробности

 
 
> Проблема с опросом энкодера на внешних прерываниях
viscoza123
сообщение Jun 1 2016, 15:16
Сообщение #1





Группа: Новичок
Сообщений: 1
Регистрация: 1-06-16
Пользователь №: 91 999



Такая тема уже была кажется, но с такой проблемой вроде никто не сталкивался. Задание следующее:Отобразить номер своего варианта на ЖКИ индикатор с возможностью
изменения значения энкодером в большую (до 999) или меньшую сторону.
Опрос энкодера реализовать на внешних прерываниях. Микроконтроллер Atmega 16-a.
Вот код:
Прикрепленный файл  KOD_2.txt ( 796 байт ) Кол-во скачиваний: 101

Алгоритм стандартный, но при повороте ручки энкодера влево-вправо он либо в обе стороны прибавляет, либо в обе стороны отнимает. В чем может быть дело?
Для тех кому лень скачивать:
CODE
#include "hd44780.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define ENC_PORT PORTD
#define ENC_PIN PIND
#define A_PIN 2
#define B_PIN 1
int count=13;
void timer0_on()
{
TCNT0=0x00;
TCCR0=(1<<CS02)|(0<<CS01)|(1<<CS00);
TIMSK=(0<<OCIE0)|(1<<TOIE0);
}
void timer0_off()
{
TCCR0=(0<<CS02)|(0<<CS01)|(0<<CS00);
}
int main(void)
{
lcd_init();
lcd_out4(count,2);
MCUCR = (1<<ISC00)|(1<<ISC01);
GICR = (1<<INT0);
sei();
while(1)
{
lcd_out4(count,2);
};
}
ISR (INT0_vect)
{
GICR=(0<<INT0);
timer0_on();
if (!(ENC_PIN&1))
{
count++;
if (count>999)
count=0;
}
else
{
count--;
if (count<0)
count=999;
}
}
ISR (TIMER0_OVF_vect)
{
timer0_off();
GIFR=(1<<INTF0);
GICR=(1<<INT0);
}


Сообщение отредактировал IgorKossak - Jun 1 2016, 17:53
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 14:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01359 секунд с 7
ELECTRONIX ©2004-2016