Форум РадиоКот https://radiokot.ru/forum/ |
|
WinAvr в вопросах и ответах https://radiokot.ru/forum/viewtopic.php?f=57&t=6909 |
Страница 1 из 110 |
Автор: | tych [ Сб апр 07, 2007 20:58:21 ] |
Заголовок сообщения: | WinAvr в вопросах и ответах |
factorial писал(а): есть проблема при обработке прерывания. Откомпилировано в WinAVR.
вот такой пример для WinAVR: Код: #include <avr> ISR(прерывание_vect) { код выполняемый при возникновении разрешенного локально и глобально прерывания } Подробнейшая информация о работе в WinAVR собрана на http://www.roboforum.ru/viewtopic.php?f=2&t=3928 |
Автор: | factorial [ Сб апр 07, 2007 21:31:53 ] |
Заголовок сообщения: | |
У тебя это где? И потом, я в кн смотрел, и настроил все как надо, а написано там так: #include <avr/signal.h> INTERRUPT(прерывание) { //Пользовательский код } где перерывание -- идентификатор, передающийся в в качестве параметров макросу INTERRUPT, ну типа SIG_ADC, SIG_COMPARATOR. А в моем случае походу SIG_OUTPUT_COMPARE0 А все регистры по настройке СV настроил аналогично тому что я описал выше. Вот така тут беда |
Автор: | tych [ Сб апр 07, 2007 21:39:53 ] |
Заголовок сообщения: | |
Я думал у вас свежая версия WinAVR. Код ваш давайте. |
Автор: | factorial [ Сб апр 07, 2007 21:47:21 ] | ||
Заголовок сообщения: | |||
Вот он весь... Версия WinAVR у меня последняя WinAVR-20070122-install, правда примеры может немного постарее смотрел из книги за 2007 год.
|
Автор: | tych [ Сб апр 07, 2007 21:57:09 ] |
Заголовок сообщения: | |
factorial писал(а): Вот он весь... Версия WinAVR у меня последняя WinAVR-20070122-install
Тогда правильно так как у меня в курсе и как выше вам написал. Удивительный у вас исходник - довольно большой и НИ ОДНОГО вашего комментария ! Комментируйте пожалуйста код который пишите. А где у вас включение нужного прерывания ? это TIMSK=0x01; ? а какой МК ? Сохраните исходник и затем повыкидывайте из него все оставив только скелет и добейтесь рабыты прервания по таймеру. Потом добавляйте код. Советую всегда писать прогу от простого к сложному постоянно проверяя работоспособность и отлавивая ошибки по ходу написания. |
Автор: | factorial [ Сб апр 07, 2007 22:03:01 ] |
Заголовок сообщения: | |
Именно TIMSK=0x01; -- это там и самое главное, все остальнрое не влияет на проблему, кроме функции обработки. А контроллер Atmega162 |
Автор: | tych [ Сб апр 07, 2007 23:00:23 ] |
Заголовок сообщения: | |
Дак я и советую написать прогу с "голым" прерыванием. |
Автор: | factorial [ Вс апр 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"?, кручу мучу убрать его немогу |
Автор: | tych [ Пн апр 09, 2007 06:36:33 ] |
Заголовок сообщения: | |
factorial писал(а): играешся пол дня пока до тебя донесут, что так уже незаписываеться... Поэтому на странице 3 курса и приведены примеры объявления обработчиков для разных современных компиляторов. factorial писал(а): вопросик: Что за предупреждение
"5.c:26:2: warning: no newline at end of file" Внимание - нет новой строки в конце файла. Он-лайн перевод - translate.ru |
Автор: | factorial [ Пн апр 09, 2007 10:41:35 ] |
Заголовок сообщения: | |
Переводить я умею, а вот там все на месте, а сообщение везде есть, и все строки вроде не масте, то это нормальное сообщение, не нисущее боков? |
Автор: | tych [ Пн апр 09, 2007 11:25:42 ] |
Заголовок сообщения: | |
Обычно "Вонинги" не страшны. |
Автор: | factorial [ Пн апр 09, 2007 11:55:15 ] |
Заголовок сообщения: | |
![]() |
Автор: | factorial [ Пн апр 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, а тоникак заставить ее работать немогу |
Автор: | tych [ Пн апр 09, 2007 19:52:43 ] |
Заголовок сообщения: | |
Может он напомнил что "знаковое слово" будет. Обчно на Си принято маленькими буквами переменные и функции называть. |
Автор: | factorial [ Пн апр 09, 2007 20:17:19 ] |
Заголовок сообщения: | |
tych писал(а): Может он напомнил что "знаковое слово" будет.
Обьявление у меня как видно -- поза всема функциями ![]() |
Автор: | tych [ Пн апр 09, 2007 20:25:09 ] |
Заголовок сообщения: | |
"два байта" - это "слово" а "знаковое" значит и отрицательные числа содержит. А без знака как по линку выше. |
Автор: | factorial [ Пн апр 09, 2007 20:30:40 ] |
Заголовок сообщения: | |
Это я понимаю, но причем тут это??? Неработает та глобальная переменная и ВСЕ. Даже приписывал ей extern для надежности -- молчит гадина. |
Автор: | factorial [ Вт апр 10, 2007 17:28:43 ] |
Заголовок сообщения: | |
При обработке перерывания регист состояния SREG запрещает все перерывания, когда выходит из подпрограммы обработки перерывания, то автоматически разрешаються глобальные перерывания. Регистр SREG по известным данным не где не сохраняеться. Вопрос: Можно ли в подпрограме обработки перерывания запретить общие перерывания, когда произрйдет выход из подпрограмы? Что бы когда вышел, а общие прерывания запрещены??? ![]() |
Автор: | tych [ Вт апр 10, 2007 17:38:31 ] |
Заголовок сообщения: | |
Это называется функция в Си. Запретить бессмысленно так как компилятор сам ставит инструкцию RETI по завершению функции. Вот если функцию не выполнять до конца а выскочить из нее безусловным переходом типа GOTO МЕТКА - тогда бы RETI не выполнилось. но по-моему CVAVR не позволяет покинуть функцию по GOTO. Но ведь можно наверно в функции вставить АСМ вставку для перехода на какое то место программы ? Може получится вот так хитро выскочить из функции не доделав ее. Надо эксперементировать вобщем. А может я наговариваю на CVAVR и GOTO сработает. |
Автор: | factorial [ Вт апр 10, 2007 18:20:56 ] |
Заголовок сообщения: | |
В асме есть две команды ret и reti. Превая выход без разрешения общих перерываний другая с. Вообщем. Записал так asm("ret"); и все. Но опять прикол с этим WinAVR, прыгает оно вообще на середину функции, которая стоит еще перед главной ![]() |
Страница 1 из 110 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |