roboforum.ru

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

Внешние прерывания Atmega8

Внешние прерывания Atmega8

bond » 23 июн 2008, 15:31

Вообщем то сабж.Уже намучался с прерыванием =( по INT0 .
Вот код.Посмотрите пожалуйста в чем ошибка.Регистры настроенны таким образом,что прерывание срабатывает по нсподаещему фронту на INTO.Как я понимаю нисподающий фронт это изменение сигнала с "лог 1" до "лог 0".Правильно?И собственно код: компилятор WinAvr.Проверял в Proteus'e;
Код: Выделить всёРазвернуть


#include <avr/io.h>
#define F_CPU 8000000UL
#include <avr/interrupt.h>
#include <avr/signal.h>

// External Interrupt 0 service routine
INTERRUPT(SIG_INTERRUPT0)
{
PORTB ^=0xff;
}

void main(void)
{
PORTB=0x00;
DDRB=0xFF;
GICR|=0x40;
MCUCR=0x02;
GIFR=0x40;

sei();

while (1)
      {

      };
}




Re: Внешние прерывания Atmega8

Master » 23 июн 2008, 16:56

А ты уверен что нужно писать не так
Код: Выделить всёРазвернуть
#asm("sei")


Добавлено спустя 2 минуты 1 секунду:
И это может эту ножку порта нужно настроить как вход, а не как выход?

Re: Внешние прерывания Atmega8

bond » 23 июн 2008, 17:00

Код: Выделить всёРазвернуть
 error: invalid preprocessing directive #asm


:cry: и не компилиться

Re: Внешние прерывания Atmega8

avr123.nm.ru » 23 июн 2008, 17:46

bond писал(а):Уже намучался с прерыванием

http://avr123.nm.ru/03.htm

Re: Внешние прерывания Atmega8

Kartush » 23 июн 2008, 22:47

2avr123.nm.ru У Вас отличный курс,но на мой взгляд про прерывания стоит подкинуть пару примеров - уже готовых простейших программ, чтобы быстрее понималось))Например: мигает светодиод,при нажатии кнопки мигает 5 раз другой светодиод, и снова начинает мигать первый.

Re: Внешние прерывания Atmega8

bond » 23 июн 2008, 22:58

Да,совершенно согласен,я прочитал курс от корочки до корочки,все отлично понятно,вообщемто все азы я узнал из курса,но с прерываниями вышла небольшая проблема.У меня будет небольшая просьба ко всем участникам данного форума:пожалуйста напишите простой пример внешнего прерывания,в WinAvr и простую схемку в Proteus,мне очень поможет,да и думаю другим новичка.Заранее большое спасибо.

Re: Внешние прерывания Atmega8

avr123.nm.ru » 23 июн 2008, 23:54

Kartush писал(а):2avr123.nm.ru У Вас отличный курс,но на мой взгляд про прерывания стоит подкинуть пару примеров - уже готовых простейших программ, чтобы быстрее понималось))


Дак вы внимательно посмотрите ! Там и есть готовый для симуляции пример с двумя кнопками на прерывания.

bond писал(а): просьба ко всем участникам данного форума:пожалуйста напишите простой пример внешнего прерывания,в WinAvr и простую схемку в Proteus,мне очень поможет,да и думаю другим новичка.


У меня там (на стр. 3 курса) пример для CVAVR и VMLAB.

А вам нужно там посмотреть как объявлять обработчик прерывания в WinAVR.

И еще по WinAVR - viewtopic.php?f=2&t=3928

Re: Внешние прерывания Atmega8

Kartush » 24 июн 2008, 11:09

avr123.nm.ru писал(а):
Kartush писал(а):2avr123.nm.ru У Вас отличный курс,но на мой взгляд про прерывания стоит подкинуть пару примеров - уже готовых простейших программ, чтобы быстрее понималось))


Дак вы внимательно посмотрите ! Там и есть готовый для симуляции пример с двумя кнопками на прерывания.

Согласен,пример есть. Но если кто-то уже ссимулировал работу прерываний и теперь хочет вернуться в реальность. Какую программу ему прошивать? В примере дана программа под симулятор. Что именно нужно тогда изменить?

Re: Внешние прерывания Atmega8

avr123.nm.ru » 24 июн 2008, 11:31

Ни чего менять не нужно. Просто прошить .hex в МК и подключить кнопки через резисторы 240-750 Ом и для индикации светодиоды через резисторы 470-750 Ом.

Re: Внешние прерывания Atmega8

Kartush » 24 июн 2008, 11:34

Спасибо, будем разбираться.

Re: Внешние прерывания Atmega8

bond » 24 июн 2008, 12:21

Опять же.Сделал все как написанно в курсе,тольок не работает...
Код: Выделить всёРазвернуть



#include <avr/io.h>
#define F_CPU 8000000UL
#include <avr/interrupt.h>
#include <avr/signal.h>


// External Interrupt 0 service routine
ISR(SIG_INTERRUPT0)
{
PORTB ^=0xff;
}

void main(void)
{
PORTB=0x00;
DDRB=0xFF;
GICR|=0x40;
MCUCR=0x02;
GIFR=0x40;
sei();


while (1)
      {

      };
}





Re: Внешние прерывания Atmega8

Kip » 10 июл 2008, 16:41

Проверьте по ходу программы, устанавливается ли у вас бит I в регистре SREG? Например в VMlab это можно легко сделать.

sei(); - это фигня какая-то, сделайте лучше вот так: SREG |= (1 << 7);

[

Re: Внешние прерывания Atmega8

blindman » 10 июл 2008, 16:48

Kip писал(а):sei(); - это фигня какая-то, сделайте лучше вот так: SREG |= (1 << 7);

Это че еще за новости?

Re: Внешние прерывания Atmega8

Kip » 10 июл 2008, 16:58

blindman писал(а):Это че еще за новости?


Разве это новости?
Бит 7 в регистре SREG отвечает за прерывания. Если установлен-разрешены глобально, если не-то нет.

Re: Внешние прерывания Atmega8

blindman » 10 июл 2008, 17:07

Для меня новость, что sei это "фигня". Может порадовать этой новостью разработчиков контроллера? Наверно, по твоему фигня также и то, что твой код будет исполняться в 3 раза дольше? И то, что тот, кто будет потом читать твой код, должен помнить, что I это именно седьмой бит?


Rambler\'s Top100 Mail.ru counter