Обсуждаем контроллеры компании Atmel.
Ответить

WinAvr в вопросах и ответах

Сб апр 07, 2007 20:58:21

factorial писал(а):есть проблема при обработке прерывания. Откомпилировано в WinAVR.


вот такой пример для WinAVR:

Код:

#include <avr>

ISR(прерывание_vect)
{
 код выполняемый при возникновении
 разрешенного локально и глобально прерывания
}



Подробнейшая информация о работе в WinAVR собрана на
http://www.roboforum.ru/viewtopic.php?f=2&t=3928
Последний раз редактировалось tych Пн апр 21, 2008 21:43:18, всего редактировалось 1 раз.

Сб апр 07, 2007 21:31:53

У тебя это где? И потом, я в кн смотрел, и настроил все как надо, а написано там так:
#include <avr/signal.h>
INTERRUPT(прерывание)
{
//Пользовательский код
}

где перерывание -- идентификатор, передающийся в в качестве параметров макросу INTERRUPT, ну типа SIG_ADC, SIG_COMPARATOR. А в моем случае походу SIG_OUTPUT_COMPARE0

А все регистры по настройке СV настроил аналогично тому что я описал выше. Вот така тут беда

Сб апр 07, 2007 21:39:53

Я думал у вас свежая версия WinAVR.

Код ваш давайте.

Сб апр 07, 2007 21:47:21

Вот он весь... Версия WinAVR у меня последняя WinAVR-20070122-install, правда примеры может немного постарее смотрел из книги за 2007 год.
Вложения
vot.c
(2.18 KiB) Скачиваний: 2686

Сб апр 07, 2007 21:57:09

factorial писал(а):Вот он весь... Версия WinAVR у меня последняя WinAVR-20070122-install


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

Удивительный у вас исходник - довольно большой и НИ ОДНОГО вашего комментария ! Комментируйте пожалуйста код который пишите.

А где у вас включение нужного прерывания ?

это TIMSK=0x01; ?

а какой МК ?

Сохраните исходник и затем повыкидывайте из него все оставив только скелет и добейтесь рабыты прервания по таймеру.

Потом добавляйте код.

Советую всегда писать прогу от простого к сложному постоянно проверяя работоспособность и отлавивая ошибки по ходу написания.

Сб апр 07, 2007 22:03:01

Именно TIMSK=0x01; -- это там и самое главное, все остальнрое не влияет на проблему, кроме функции обработки. А контроллер Atmega162

Сб апр 07, 2007 23:00:23

Дак я и советую написать прогу с "голым" прерыванием.

Вс апр 08, 2007 23:58:32

Работает такой вариант. Но странно, когда я обявил еще так:
ISR(SIG_OUTPUT_COMPARE0)
{
PORTA = 80;
}

то ничего не происходило, а ведь в iom162.h обявлено так:
/* Timer/Counter0 Compare Match */
#define TIMER0_COMP_vect _VECTOR(16)
#define SIG_OUTPUT_COMPARE0 _VECTOR(16)

Это ж одно и тоже, только функция ISR. Почемуже новая версия неподдерживает измененные функции предиидущей :lol:

Гон немного играешся пол дня пока до тебя донесут, что так уже незаписываеться....

И такой малюсенький вопросик: Что за предупреждение такое при компиляции "5.c:26:2: warning: no newline at end of file"?, кручу мучу убрать его немогу

Пн апр 09, 2007 06:36:33

factorial писал(а):играешся пол дня пока до тебя донесут, что так уже незаписываеться...


Поэтому на странице 3 курса и приведены примеры объявления обработчиков для разных современных компиляторов.

factorial писал(а):вопросик: Что за предупреждение

"5.c:26:2: warning: no newline at end of file"


Внимание - нет новой строки в конце файла.

Он-лайн перевод - translate.ru

Пн апр 09, 2007 10:41:35

Переводить я умею, а вот там все на месте, а сообщение везде есть, и все строки вроде не масте, то это нормальное сообщение, не нисущее боков?

Пн апр 09, 2007 11:25:42

Обычно "Вонинги" не страшны.

Пн апр 09, 2007 11:55:15

:))) Неужели...., именно этот я немогу некак понять, все нормально, а он везде есть -- портит гад всю картину! Ну да и черт с ним пусть себе будет....

Пн апр 09, 2007 19:44:22

Опять попал на гиморой, кокогото..... глобально обьявленая переменная N нехочеть работать. Експерементальный код такой:
#include <avr/io.h>
#include <avr/interrupt.h>

int N=0;

ISR(TIMER0_COMP_vect)
{
N=TCNT1;
TCNT0=0;
N=0;
}


int main(void)
{
DDRA=0xFF;
PORTA=0xFF;
TCCR0=0x01;//Set timer0
OCR0=0x5F;
TIMSK=0x01;
sei();
while(1)
{
asm volatile ("nop");
volatile N=N+1;
asm volatile ("nop");
asm volatile ("nop");
}
}
Она гадина в цикле ни с нуля считает (просматривал в AVR4). Да и в прерывании, ей почемуто ничего неприсваиваеться. И при компиляции выскакивают такие сообщения:
5.c:25: warning: type defaults to 'int' in declaration of 'N'
Тоесть компилятор незнает что N имеет тип integer, хотя обявлено вроде нормально.
Что бы это могло быть????? Может я уже нетак ее обьявляю??? :cry:
И еще вопросик: неимел ли кто-то дело с функцией dtostrf, которая определена в файле stdlib.h, а тоникак заставить ее работать немогу

Пн апр 09, 2007 19:52:43

Может он напомнил что "знаковое слово" будет.

Обчно на Си принято маленькими буквами переменные и функции называть.

Пн апр 09, 2007 20:17:19

tych писал(а):Может он напомнил что "знаковое слово" будет.


Обьявление у меня как видно -- поза всема функциями :( . Что значит "знаковое слово"???

Пн апр 09, 2007 20:25:09

"два байта" - это "слово" а "знаковое" значит и отрицательные числа содержит.

А без знака как по линку выше.

Пн апр 09, 2007 20:30:40

Это я понимаю, но причем тут это??? Неработает та глобальная переменная и ВСЕ. Даже приписывал ей extern для надежности -- молчит гадина.

Вт апр 10, 2007 17:28:43

При обработке перерывания регист состояния SREG запрещает все перерывания, когда выходит из подпрограммы обработки перерывания, то автоматически разрешаються глобальные перерывания. Регистр SREG по известным данным не где не сохраняеться. Вопрос: Можно ли в подпрограме обработки перерывания запретить общие перерывания, когда произрйдет выход из подпрограмы? Что бы когда вышел, а общие прерывания запрещены??? :idea:

Вт апр 10, 2007 17:38:31

Это называется функция в Си. Запретить бессмысленно так как компилятор сам ставит инструкцию RETI по завершению функции.

Вот если функцию не выполнять до конца а выскочить из нее безусловным переходом типа GOTO МЕТКА - тогда бы RETI не выполнилось. но по-моему CVAVR не позволяет покинуть функцию по GOTO.

Но ведь можно наверно в функции вставить АСМ вставку для перехода на какое то место программы ? Може получится вот так хитро выскочить из функции не доделав ее.

Надо эксперементировать вобщем.

А может я наговариваю на CVAVR и GOTO сработает.

Вт апр 10, 2007 18:20:56

В асме есть две команды ret и reti. Превая выход без разрешения общих перерываний другая с. Вообщем. Записал так
asm("ret");
и все. Но опять прикол с этим WinAVR, прыгает оно вообще на середину функции, которая стоит еще перед главной :?
Ответить