Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прерывание RESET в ATMega8
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
IF_P
Хочу использовать п/п прерывания RESET. Но компилятор ругается. что уже есть такое определение. Я не могу его найти. И будет ли моё описание RESET работать?
_Артём_
Цитата(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 написать.
IF_P
Цитата(_Артём_ @ 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 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
Xenia
Цитата(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() уже был запущен.
_Артём_
Цитата(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(), а если тот флаг уже был установлен, то делал то, что вы сейчас в интеррапте делаете.

Флаг-то зачем? Раз попал на сброс - значит нужно стартовать, это же не периферийное прерывание, а старт программы.
ARV
а никого не беспокоит тот факт, что в atmega8 попросту нет ПРЕРЫВАНИЯ по сигналу RST?
Dog Pawlowa
Цитата(ARV @ Jul 20 2012, 09:33) *
нет ПРЕРЫВАНИЯ по сигналу RST

В данном контексте это не имеет значения. Есть вектор, на который автор что-то хочет прилепить что-то свое, грохнув чужое.
IF_P
Цитата(ARV @ Jul 20 2012, 09:33) *
а никого не беспокоит тот факт, что в atmega8 попросту нет ПРЕРЫВАНИЯ по сигналу RST?

Ну а как быть с вот этим?

Цитата(Dog Pawlowa @ Jul 20 2012, 09:48) *
В данном контексте это не имеет значения. Есть вектор, на который автор что-то хочет прилепить что-то свое, грохнув чужое.

Ну почему так категорично "грохнув". Можно и модифицировать.
Я хотел в прерывании анализировать вот эти флаги и соответственно принимать решение. Но если это получается сложно, то попробую сделать анализ в программе.

Цитата(_Артём_ @ Jul 20 2012, 00:53) *
Watchdog по нормальному не должен срабатывать. Плохой признак.

Это я знаю. Но в даном случае это защита от потери управления. ATMega8 у меня ведомая. И если нет команды от CPU на протяжении определенного времени, то все выходы необходимо выключить до возобновления управления.
Dog Pawlowa
Цитата(IF_P @ Jul 20 2012, 10:38) *
Я хотел в прерывании анализировать

Ну Вам вообще-то справедливо указали, что прерывания нет, потому что прерывание - это когда после него происходит возврат.
Было бы здорово, если бы Вы всё-таки стали правильно использовать термины, а не подтасовывали аргументы wink.gif
IF_P
Цитата(Dog Pawlowa @ Jul 20 2012, 11:05) *
Ну Вам вообще-то справедливо указали, что прерывания нет, потому что прерывание - это когда после него происходит возврат.
Было бы здорово, если бы Вы всё-таки стали правильно использовать термины, а не подтасовывали аргументы wink.gif

Я прошу извинить, если я написал что-то не так. Подтасовками я не пользуюсь. Писал как думал. В приведенной выше таблице увидел:

"Interrupt Vectors
in ATmega8"

Вот и решил, что есть такое прерывание. Сейчас более тщательно посмотрел и увидел уже меньшим шрифтом:

" Reset and Interrupt Vectors"

Следовательно, RESET выделено отдельно от прерываний. Я вначале не обратил на это внимание. Спасибо за подсказку. Учту на будущее.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.