реклама на сайте
подробности

 
 
> Прерывание RESET в ATMega8, где лишнее определение
IF_P
сообщение Jul 19 2012, 19:24
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 136
Регистрация: 2-01-06
Пользователь №: 12 772



Хочу использовать п/п прерывания RESET. Но компилятор ругается. что уже есть такое определение. Я не могу его найти. И будет ли моё описание RESET работать?

Сообщение отредактировал IF_P - Jul 19 2012, 19:25
Эскизы прикрепленных изображений
Прикрепленное изображение
 

Прикрепленные файлы
Прикрепленный файл  TEST_RESET.RAR ( 22.66 килобайт ) Кол-во скачиваний: 15
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_Артём_
сообщение Jul 19 2012, 21:07
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 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 написать.
Go to the top of the page
 
+Quote Post
IF_P
сообщение Jul 19 2012, 21:20
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 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
 
Go to the top of the page
 
+Quote Post
Xenia
сообщение Jul 19 2012, 22:04
Сообщение #4


Гуру
******

Группа: Модератор 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() уже был запущен.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 4th August 2025 - 03:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.01415 секунд с 7
ELECTRONIX ©2004-2016