Обсуждаем контроллеры компании Atmel.
Сб апр 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) Скачиваний: 2689
Сб апр 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. Почемуже новая версия неподдерживает измененные функции предиидущей
Гон немного играешся пол дня пока до тебя донесут, что так уже незаписываеться....
И такой малюсенький вопросик: Что за предупреждение такое при компиляции "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, хотя обявлено вроде нормально.
Что бы это могло быть????? Может я уже нетак ее обьявляю???
И еще вопросик: неимел ли кто-то дело с функцией 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 по известным данным не где не сохраняеться. Вопрос: Можно ли в подпрограме обработки перерывания запретить общие перерывания, когда произрйдет выход из подпрограмы? Что бы когда вышел, а общие прерывания запрещены???
Вт апр 10, 2007 17:38:31
Это называется функция в Си. Запретить бессмысленно так как компилятор сам ставит инструкцию RETI по завершению функции.
Вот если функцию не выполнять до конца а выскочить из нее безусловным переходом типа GOTO МЕТКА - тогда бы RETI не выполнилось. но по-моему CVAVR не позволяет покинуть функцию по GOTO.
Но ведь можно наверно в функции вставить АСМ вставку для перехода на какое то место программы ? Може получится вот так хитро выскочить из функции не доделав ее.
Надо эксперементировать вобщем.
А может я наговариваю на CVAVR и GOTO сработает.
Вт апр 10, 2007 18:20:56
В асме есть две команды ret и reti. Превая выход без разрешения общих перерываний другая с. Вообщем. Записал так
asm("ret");
и все. Но опять прикол с этим WinAVR, прыгает оно вообще на середину функции, которая стоит еще перед главной
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.