Страница 1 из 110
WinAvr в вопросах и ответах
Добавлено: Сб апр 07, 2007 20:58:21
tych
factorial писал(а):есть проблема при обработке прерывания. Откомпилировано в WinAVR.
вот такой пример для WinAVR:
Код: Выделить всё
#include <avr>
ISR(прерывание_vect)
{
код выполняемый при возникновении
разрешенного локально и глобально прерывания
}
Подробнейшая информация о работе в WinAVR собрана на
http://www.roboforum.ru/viewtopic.php?f=2&t=3928
Добавлено: Сб апр 07, 2007 21:31:53
factorial
У тебя это где? И потом, я в кн смотрел, и настроил все как надо, а написано там так:
#include <avr/signal.h>
INTERRUPT(прерывание)
{
//Пользовательский код
}
где перерывание -- идентификатор, передающийся в в качестве параметров макросу INTERRUPT, ну типа SIG_ADC, SIG_COMPARATOR. А в моем случае походу SIG_OUTPUT_COMPARE0
А все регистры по настройке СV настроил аналогично тому что я описал выше. Вот така тут беда
Добавлено: Сб апр 07, 2007 21:39:53
tych
Я думал у вас свежая версия WinAVR.
Код ваш давайте.
Добавлено: Сб апр 07, 2007 21:47:21
factorial
Вот он весь... Версия WinAVR у меня последняя WinAVR-20070122-install, правда примеры может немного постарее смотрел из книги за 2007 год.
Добавлено: Сб апр 07, 2007 21:57:09
tych
factorial писал(а):Вот он весь... Версия WinAVR у меня последняя WinAVR-20070122-install
Тогда правильно так как у меня в курсе и как выше вам написал.
Удивительный у вас исходник - довольно большой и НИ ОДНОГО вашего комментария ! Комментируйте пожалуйста код который пишите.
А где у вас включение нужного прерывания ?
это TIMSK=0x01; ?
а какой МК ?
Сохраните исходник и затем повыкидывайте из него все оставив только скелет и добейтесь рабыты прервания по таймеру.
Потом добавляйте код.
Советую всегда писать прогу от простого к сложному постоянно проверяя работоспособность и отлавивая ошибки по ходу написания.
Добавлено: Сб апр 07, 2007 22:03:01
factorial
Именно TIMSK=0x01; -- это там и самое главное, все остальнрое не влияет на проблему, кроме функции обработки. А контроллер Atmega162
Добавлено: Сб апр 07, 2007 23:00:23
tych
Дак я и советую написать прогу с "голым" прерыванием.
Добавлено: Вс апр 08, 2007 23:58:32
factorial
Работает такой вариант. Но странно, когда я обявил еще так:
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
tych
factorial писал(а):играешся пол дня пока до тебя донесут, что так уже незаписываеться...
Поэтому на странице 3 курса и приведены примеры объявления обработчиков для разных современных компиляторов.
factorial писал(а):вопросик: Что за предупреждение
"5.c:26:2: warning: no newline at end of file"
Внимание - нет новой строки в конце файла.
Он-лайн перевод - translate.ru
Добавлено: Пн апр 09, 2007 10:41:35
factorial
Переводить я умею, а вот там все на месте, а сообщение везде есть, и все строки вроде не масте, то это нормальное сообщение, не нисущее боков?
Добавлено: Пн апр 09, 2007 11:25:42
tych
Обычно "Вонинги" не страшны.
Добавлено: Пн апр 09, 2007 11:55:15
factorial

Неужели...., именно этот я немогу некак понять, все нормально, а он везде есть -- портит гад всю картину! Ну да и черт с ним пусть себе будет....
Добавлено: Пн апр 09, 2007 19:44:22
factorial
Опять попал на гиморой, кокогото..... глобально обьявленая переменная 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
tych
Может он напомнил что "знаковое слово" будет.
Обчно на Си принято маленькими буквами переменные и функции называть.
Добавлено: Пн апр 09, 2007 20:17:19
factorial
tych писал(а):Может он напомнил что "знаковое слово" будет.
Обьявление у меня как видно -- поза всема функциями

. Что значит "знаковое слово"???
Добавлено: Пн апр 09, 2007 20:25:09
tych
"два байта" - это "слово" а "знаковое" значит и отрицательные числа содержит.
А без знака как по линку выше.
Добавлено: Пн апр 09, 2007 20:30:40
factorial
Это я понимаю, но причем тут это??? Неработает та глобальная переменная и ВСЕ. Даже приписывал ей extern для надежности -- молчит гадина.
Добавлено: Вт апр 10, 2007 17:28:43
factorial
При обработке перерывания регист состояния SREG запрещает все перерывания, когда выходит из подпрограммы обработки перерывания, то автоматически разрешаються глобальные перерывания. Регистр SREG по известным данным не где не сохраняеться. Вопрос: Можно ли в подпрограме обработки перерывания запретить общие перерывания, когда произрйдет выход из подпрограмы? Что бы когда вышел, а общие прерывания запрещены???

Добавлено: Вт апр 10, 2007 17:38:31
tych
Это называется функция в Си. Запретить бессмысленно так как компилятор сам ставит инструкцию RETI по завершению функции.
Вот если функцию не выполнять до конца а выскочить из нее безусловным переходом типа GOTO МЕТКА - тогда бы RETI не выполнилось. но по-моему CVAVR не позволяет покинуть функцию по GOTO.
Но ведь можно наверно в функции вставить АСМ вставку для перехода на какое то место программы ? Може получится вот так хитро выскочить из функции не доделав ее.
Надо эксперементировать вобщем.
А может я наговариваю на CVAVR и GOTO сработает.
Добавлено: Вт апр 10, 2007 18:20:56
factorial
В асме есть две команды ret и reti. Превая выход без разрешения общих перерываний другая с. Вообщем. Записал так
asm("ret");
и все. Но опять прикол с этим WinAVR, прыгает оно вообще на середину функции, которая стоит еще перед главной
