AT90S и WinAVR

May 24, 2005 7 Replies

добрый вечер



Почемуто не вызывается прерывание. Проверял на живом МК и на VMLAB подскажите плиз.



=== CUT === #include <avr/io.h>



#include <avr/io2313.h>



#include <avr/interrupt.h>



#include <avr/signal.h>


void ioinit() { DDRB = 0xff; // Установим порт 'B' на выход (11111111b если 1 то соотв. нога на выход 0 вход) PORTB == 0xff; }



void interrupt_init() { TCCR0 = 0x05; // устанавливаем делитель частоты кварца на 1024



timer_enable_int(_BV (TOIE0)); // разрешить прерывание от таймера 0 (функция _BV() переводит бит в число). sei(); // разрешить прерывания }


// Функция прерывания таймера 0 вызывается при достижении TCCR0 == 256 и сбрасывается на 0 // т.е. начинается отсчет сначала SIGNAL(SIG_OVERFLOW0) { //TCCR0 = 100; // переопределим с какого числа считать таймеру. //~~~~~???????????????????



switch (PORTB) { case 0x00: {PORTB == 0xff;break;} case 0xff: {PORTB == 0x00;break;} }



}


int main (void) { ioinit (); interrupt_init();


while (1) { }



return (0); } === CUT ===



...

formatting link


Привет Sasha!

25 May 05 00:00, Sasha Leshinsky писал ALL:

SL> Почемуто не вызывается прерывание. Проверял на живом МК и на VMLAB SL> подскажите плиз.

SL> === CUT === SL> === CUT ===

Убедись, что взведен нужный бит в регистре TIMSK (просто установить флаг i недостаточно).

Всего наилучшего, [Team PCAD 2000] Алексей М. ... О сколько нам открытий чудных готовит открывашки крюк!

Hello, Sasha!

Среда Май 25 2005 00:00, Sasha Leshinsky wrote to ALL: SL> Почемуто не вызывается прерывание. Проверял на живом МК и на VMLAB SL> подскажите плиз. SL> === CUT === SL> #include <avr/io.h>

SL> #include <avr/io2313.h>

^^^^^^^^^^^^^^ компиялтор ругается SL> #include <avr/interrupt.h>

SL> #include <avr/signal.h>

SL> case 0x00: {PORTB == 0xff;break;} ^^ не ошибся ли здесь?

Только что проверил. WinAvr от сентября 2003, vmlab 3.10. Все работает.

Best regards и все такое... Sergey. [Death/Black/Power Metal]

добрый вечер

■ Message posted by Alex Mogilnikov to Sasha Leshinsky ■ Subject: AT90S и WinAVR

AM> Убедись, что взведен нужный бит в регистре TIMSK (просто AM> установить флаг i недостаточно). Я написал в исходнике:

timer_enable_int(_BV (TOIE0));

Читаю доку:

=== CUT === Function Documentation

__inline__ void timer_enable_int ( unsigned char ints ) [static]

#include <avr/interrupt.h>

This function modifies the timsk register. The value you pass via ints is device specific. === CUT ===

И не работает почему-то :(

...

formatting link

Hello Sasha.

24 May 05 23:00, you wrote to all:

SL> void interrupt_init() SL> { SL> TCCR0 = 0x05; // устанавливаем делитель частоты кварца на 1024

SL> timer_enable_int(_BV (TOIE0)); // разрешить прерывание от таймера 0

Запиши в TIMSK вручную.

TIMSK = BV(TOIE0);

SL> SIGNAL(SIG_OVERFLOW0) SL> { SL> //TCCR0 = 100; // переопределим с какого числа считать таймеру. SL> //~~~~~???????????????????

Ты не попутал TCCR0 и TCNT0 ?

SL> switch (PORTB) SL> { SL> case 0x00: {PORTB == 0xff;break;} SL> case 0xff: {PORTB == 0x00;break;} SL> }

Это заменяется на PORTB ^= 0xFF;

Alexey

Привет Sasha!

26 May 05 23:37, Sasha Leshinsky писал Alex Mogilnikov:

AM>> Убедись, что взведен нужный бит в регистре TIMSK (просто AM>> установить флаг i недостаточно).

SL> Читаю доку:

SL> === CUT === SL> This function modifies the timsk register. The value you pass via ints SL> is device specific. SL> === CUT ===

SL> И не работает почему-то :(

Я написал не "убедись, что в доке написано, что бит взводится", а "убедись, что бит взведен". :) Ты никогда не сталкивался с ситуацией, когда в доке - одно, и на самом деле - другое? :)

Прерывание должно происходить при трех одновременно выполняющихся условиях:

- таймер включен;

- разрешено прерывание по его переполнению в TIMSK;

- установлен флаг I.

Кажется так. Если у тебя прерывания не происходит, значит одно из этих условий не выполняется. Из приведенного тобой кода наиболее вероятным мне показалось второе.

Всего наилучшего, [Team PCAD 2000] Алексей М. ... Западно-уральское региональное общество добровольных учредителей.

∙-─÷ Answer on message from BADMAIL ÷─--∙

добрый вечер

■ Message posted by Sergey Shopin to Sasha Leshinsky ■ Subject: AT90S и WinAVR

SL>> Почемуто не вызывается прерывание. Проверял на живом МК и на SL>> VMLAB подскажите плиз. SL>> === CUT === SL>> #include <avr/io.h>

SL>> #include <avr/io2313.h>

SS> ^^^^^^^^^^^^^^ компиялтор ругается

У меня не ругнулся WinAvr за февраль сего года.

SL>> #include <avr/interrupt.h>

SL>> #include <avr/signal.h>

SL>> case 0x00: {PORTB == 0xff;break;} SS> ^^ не ошибся ли здесь?

Спасибо. И как так по-пионерски я ошибся-то блин :(

SS> Только что проверил. WinAvr от сентября 2003, vmlab 3.10. Все SS> работает.

...

formatting link

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required