Схему собирал такую: только mega8
Собирался реализовать простенький алгоритм описанный тут: http://roboforum.ru/post168731.html#p168731
Но увы....
Выкладываю видео того, что получилось:
Итак если по вызову прерывания подпрограмма определяет, что порт д3 равен 1 то мигаем одной лампочкой, если равен 0 то мигаем другой лампочкой. Но, как видно на видео, при вращении в одну сторону всё верно, а при обратном направлении сначала мигает "нужная" лампочка а потом первая, которая не должна загораться. У кого какие идеи, где я ошибаюсь?
казалось бы, что может быть проще считывать импульсы.....
вот код, прошитый в контроллер:
- Код: Выделить всё • Развернуть
#include <mega8.h>
#include <delay.h>
#define F_CPU 8000000UL
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if (PIND.3==0){ PORTC.3=1; delay_ms(100); PORTC.3=0; delay_ms(200); #asm("cli") } /* если по вызову прерывания опредяем, что PINd.3 то выключаем прерывания.
else if (PIND.3==1)
{ PORTC.4=1; delay_ms(100); PORTC.4=0; }
}
void main(void)
{
delay_ms(500);
SREG=1;
PORTC=0x00; // выход на светодиоды
DDRC=0xFF;
DDRD=0xC0; // вход, это ж прерывание
GICR=0x40; // включаю прерывания 0
MCUCR=0x02; // по спадающему фронту
GIFR=0xC0;
ACSR=0x80;
// Global enable interrupts
#asm("sei")
// PORTC=0x08 ;
PORTD.2=1; // включаю подтяжки
PORTD.3=1;
PORTD.6=1;
while (1)
{
// Place your code here
if (PORTD.6==1) {PORTD.6=0; PORTD.7=1; delay_ms(500); } else
if (PORTD.7==1) {PORTD.7=0; PORTD.6=1; delay_ms(500); }
};
}