roboforum.ru

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

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

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); }
      };                                       
}



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

avr123.nm.ru » 23 янв 2011, 04:00

Возможно дребезг. Паузы добавить.

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

cjA » 25 янв 2011, 06:02

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

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

(и зачем-то флагом переноса все время дергаете)

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

avr123.nm.ru » 25 янв 2011, 12:50

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

Я рекомендую в PROTEUS отлаживать - сразу увидите что не так происходит.


cron
Rambler\'s Top100 Mail.ru counter