|
Прерывание RESET в ATMega8, где лишнее определение |
|
|
|
Jul 19 2012, 19:24
|
Частый гость
 
Группа: Участник
Сообщений: 136
Регистрация: 2-01-06
Пользователь №: 12 772

|
Хочу использовать п/п прерывания RESET. Но компилятор ругается. что уже есть такое определение. Я не могу его найти. И будет ли моё описание RESET работать?
Сообщение отредактировал IF_P - Jul 19 2012, 19:25
Эскизы прикрепленных изображений
|
|
|
|
|
 |
Ответов
(1 - 10)
|
Jul 19 2012, 21:07
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(IF_P @ Jul 19 2012, 22:24)  Хочу использовать п/п прерывания RESET. Как его хотите использовать? Зачем это? Цитата(IF_P @ Jul 19 2012, 22:24)  Но компилятор ругается. что уже есть такое определение. Я не могу его найти. cstartup.s90 - лежит в папке Program Files\IAR Systems\Embedded Workbench 6.0\avr\src\lib\. Скопируите cstartup.s90 и macros.m90 в папку проекта и добавьте cstartup.s90 к проекту.И пишуте туда что хотите. Цитата(IF_P @ Jul 19 2012, 22:24)  И будет ли моё описание RESET работать? Скорей всего нет - место для RESET_vect уже занято. А что работает? Update: Цитата(IF_P @ Jul 19 2012, 22:24)  И будет ли моё описание RESET работать? У вас R_Interrupt определён как __interrupt, значит в конце его будет RETI. Интересно куда? Код #pragma vector=RESET_vect __interrupt void R_Interrupt(void ) Может более правильно будет свою __low_level_init написать.
|
|
|
|
|
Jul 19 2012, 21:20
|
Частый гость
 
Группа: Участник
Сообщений: 136
Регистрация: 2-01-06
Пользователь №: 12 772

|
Цитата(_Артём_ @ Jul 19 2012, 23:18)  Как его хотите использовать? Зачем это?
Скорей всего нет - место для RESET_vect уже занято. А что работает? Вот схема. При включении и выключении на выходах проскакивает "иллюминация". Вот и подумал - нельзя ли блокировать выходы (выключать). Например, при снижении напряжения, при срабатывании WATCHDOG и т.д. Вот посмотрел "cstartup" и думаю, как лучше сделать. То ли в "cstartup" дописать обработку прерывания, то ли убрать RESET из "cstartup" а описать в своей программе. Я в первом посте привел пример программы использования прерывания RESET. Но оно не работало. Сейчас понял почему. Завтра попробую поменять и испытать в "железе". Цитата(_Артём_ @ Jul 20 2012, 00:07)  Может более правильно будет свою __low_level_init написать. Никогда такого не делал. Надо будет разбираться. Где можно почитать? Я с IAR не так глубоко знаком.
Сообщение отредактировал IF_P - Jul 19 2012, 21:15
Прикрепленные файлы
Schema.pdf ( 84.44 килобайт )
Кол-во скачиваний: 34
|
|
|
|
|
Jul 19 2012, 21:53
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(IF_P @ Jul 20 2012, 00:20)  Вот схема. При включении и выключении на выходах проскакивает "иллюминация". Вот и подумал - нельзя ли блокировать выходы (выключать). После сброса все входы в Z-state. Если иллюминирует, то может линии надо притянуть к чему-нибудь подходящему. Цитата(IF_P @ Jul 20 2012, 00:20)  Например, при снижении напряжения, при срабатывании WATCHDOG и т.д. Watchdog по нормальному не должен срабатывать. Плохой признак. Цитата(IF_P @ Jul 20 2012, 00:20)  То ли в "cstartup" дописать обработку прерывания, то ли убрать RESET из "cstartup" а описать в своей программе. Я в первом посте привел пример программы использования прерывания RESET. Можно так, например: cstartup.s90 делает jmp на мой код (APP_START_VECT): Код EXTERN ?C_STARTUP EXTERN ?APP_START_VECT PUBLIC __program_start PUBLIC ?RESET
ORG $0 __program_start: ?RESET: XJMP ?APP_START_VECT app_start.s: Код MODULE ?A #include "macros.m90" COMMON START_SEGMENT:CODE:ROOT(1); Align at an even address
EXTERN ?C_STARTUP PUBLIC ?APP_START_VECT
?APP_START_VECT: // сюда можно вставить что-то своё XJMP ?C_STARTUP
END Но может и через __low_level_init лучше будет. Цитата(IF_P @ Jul 20 2012, 00:20)  Надо будет разбираться. Где можно почитать? Я с IAR не так глубоко знаком. Запустить IAR, меню Help - AVR - C/C++ Compiler reference
|
|
|
|
|
Jul 19 2012, 22:04
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(IF_P @ Jul 20 2012, 01:20)  Вот посмотрел "cstartup" и думаю, как лучше сделать. То ли в "cstartup" дописать обработку прерывания, то ли убрать RESET из "cstartup" а описать в своей программе. Я в первом посте привел пример программы использования прерывания RESET. Но оно не работало. Сейчас понял почему. Завтра попробую поменять и испытать в "железе". Но ведь, "оживая", МК стартует с адреса 0. И это не программой какой-то определяется, а самим железом. Вот с адреса 0 и начинается запуск, который сперва вызывает C_startup(), а тот, в свою очередь, __low_level_init(), __segment_init() и наконец, main(). Если вы вляпаете на нулевой адрес ссылку на самописный интеррапт, то именно с него и начнется выполнение кода, когда МК стартует. Ну, а кто же тогда вашу main() запускать станет, если вы про нее в своем интеррапте забыли? Тогда уж флаг какой-то надо выставить, чтобы при сброшенном флаге ваш интеррапт устанавливал этот флаг и вызвал C_startup(), а если тот флаг уже был установлен, то делал то, что вы сейчас в интеррапте делаете. Т.е. флаг служил бы признаком того, что main() уже был запущен.
|
|
|
|
|
Jul 19 2012, 22:21
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(Xenia @ Jul 20 2012, 01:04)  Но ведь "оживая", МК стартует с адреса 0. И это не программой какой-то определяется, а самим железом. Вот с адреса 0 и начинается запуск может и с 0xC00 стартануть - от fuse зависит. А дальше какая-та команда на 0x0000 должна его кинуть. Цитата(Xenia @ Jul 20 2012, 01:04)  Если вы вляпаете на нулевой адрес ссылку на самописный интеррапт, то именно с него и начнется выполнение кода, когда МК стартует. Ну, а кто же тогда вашу main() запускать станет, если вы про нее в своем интеррапте забыли? Резонно. Цитата(Xenia @ Jul 20 2012, 01:04)  Тогда уж флаг какой-то надо выставить (и то не соображу из чего его сделать), чтобы при сброшенном флаге ваш интеррапт устанавливал этот флаг и вызвал C_startup(), а если тот флаг уже был установлен, то делал то, что вы сейчас в интеррапте делаете. Флаг-то зачем? Раз попал на сброс - значит нужно стартовать, это же не периферийное прерывание, а старт программы.
|
|
|
|
|
Jul 20 2012, 07:38
|
Частый гость
 
Группа: Участник
Сообщений: 136
Регистрация: 2-01-06
Пользователь №: 12 772

|
Цитата(ARV @ Jul 20 2012, 09:33)  а никого не беспокоит тот факт, что в atmega8 попросту нет ПРЕРЫВАНИЯ по сигналу RST? Ну а как быть с вот этим? Цитата(Dog Pawlowa @ Jul 20 2012, 09:48)  В данном контексте это не имеет значения. Есть вектор, на который автор что-то хочет прилепить что-то свое, грохнув чужое. Ну почему так категорично "грохнув". Можно и модифицировать. Я хотел в прерывании анализировать вот эти флаги и соответственно принимать решение. Но если это получается сложно, то попробую сделать анализ в программе. Цитата(_Артём_ @ Jul 20 2012, 00:53)  Watchdog по нормальному не должен срабатывать. Плохой признак. Это я знаю. Но в даном случае это защита от потери управления. ATMega8 у меня ведомая. И если нет команды от CPU на протяжении определенного времени, то все выходы необходимо выключить до возобновления управления.
Сообщение отредактировал IF_P - Jul 20 2012, 07:40
Эскизы прикрепленных изображений
|
|
|
|
|
Jul 20 2012, 08:26
|
Частый гость
 
Группа: Участник
Сообщений: 136
Регистрация: 2-01-06
Пользователь №: 12 772

|
Цитата(Dog Pawlowa @ Jul 20 2012, 11:05)  Ну Вам вообще-то справедливо указали, что прерывания нет, потому что прерывание - это когда после него происходит возврат. Было бы здорово, если бы Вы всё-таки стали правильно использовать термины, а не подтасовывали аргументы  Я прошу извинить, если я написал что-то не так. Подтасовками я не пользуюсь. Писал как думал. В приведенной выше таблице увидел: "Interrupt Vectors in ATmega8" Вот и решил, что есть такое прерывание. Сейчас более тщательно посмотрел и увидел уже меньшим шрифтом: " Reset and Interrupt Vectors" Следовательно, RESET выделено отдельно от прерываний. Я вначале не обратил на это внимание. Спасибо за подсказку. Учту на будущее.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|