roboforum.ru

Технический форум по робототехнике.


проблема с прерываниями

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Re: проблема с прерываниями

Сообщение hadok » 23 янв 2011, 00:12

Итак, мои попытки научиться использовать энкодер провалились.

Схему собирал такую: только 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); }
      };                                       
}


Аватара пользователя
hadok
 
Сообщения: 166
Зарегистрирован: 06 июн 2005, 02:27
Откуда: Минск, Лида

Re: проблема с прерываниями

Сообщение avr123.nm.ru » 23 янв 2011, 04:00

Возможно дребезг. Паузы добавить.
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: проблема с прерываниями

Сообщение cjA » 25 янв 2011, 06:02

вообщето при возникновении прерывания прерывания запрещаются (флаг i в sreg падает) то есть команда cli не нужна в обрабодчике.
ну и потом вы их уже нигде никогда не включаете
но учитывая что вы и схему не от этого МК подсунули, может у вас и прошито что нибудь другое

Добавлено спустя 38 минут 35 секунд:
в первой примере 2+12 = 14= 10100 - вы включаете на одном прерывании любое изменение, на втором- только лов левел.
mcucr должно быть таким для включения по спаду обоих 0b1010= 0хА
пишите лучше в двоичном формате константы, так нагляднее

(и зачем-то флагом переноса все время дергаете)
cjA
 
Сообщения: 468
Зарегистрирован: 19 мар 2010, 20:11

Re: проблема с прерываниями

Сообщение avr123.nm.ru » 25 янв 2011, 12:50

cjA писал(а):ну и потом вы их уже нигде никогда не включаете
А надо ? :D

Я рекомендую в PROTEUS отлаживать - сразу увидите что не так происходит.
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Пред.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7