Помогите пожалуйста. 3 дня ковыряюсь в прошивке для МК Atmega8A. В Atmel Studio все нормально, пошагово проходит всю программу как положено, со всеми реакциями. Схема планировалась как таймер задержки с реакцией на кнопку при каждом нажатии в течении 7 сек. Если в течении 7 сек кнопка не нажималась то потом отсчитывает 1, 2, 3-6 часов ( в зависимости сколько раз была нажата кнопка). Сделано для часового кварца. Загоняю прошивку в МК реакция на кнопку есть 7 сек отсчитывает, а потом все слетает и похоже срывается в бесконечный цикл. Замучался уже ковыряться, ткните пож. в ошибку.
wait: push loop ldi loop,5 ;200 wt1: dec loop brne wt1 pop loop ret ;*********************************************************************************************************
z7: ; ldi r20,0b10000000; out timsk,r20 ; ldi r21,ddel ; out ocr2,r21 ; out tcnt2,r17; sei cz0: in rin,pinb; sbrc rin,1; rjmp cz0; cli ldi r20,0b00000000; out timsk,r20 ; ret ;************************************************************************************************ end: cbi portb,0;
По меткам schet и end беда бедная. По end залазим в бесконечный цикл, а по schet, походу, выполняем основную программу. Ошибка в организации подпрограммы обработки прерывания.
...В Atmel Studio все нормально, пошагово проходит всю программу как положено, со всеми реакциями....
Обратите внимание на то, чтобы подпрограмма обработки прерывания отрабатывалась корректно. Да, и уберите эти cli sei. Запрет и разрешение прерываний отрабатываются железом.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Все NOP-ы в таблице прерываний надо обязательно на RETI заменить. Не гоже, если некоторые прерывания срабатывают по какой-либо причине, а вызывается обработка каких-нибудь других прерываний..
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Заголовок сообщения: Re: Прошу помощи в поиске ошибки кода Atmega8
Добавлено: Пт июл 27, 2018 05:01:39
Опытный кот
Карма: 13
Рейтинг сообщений: 163
Зарегистрирован: Сб дек 22, 2012 08:17:42 Сообщений: 744 Откуда: Караганда, Казахстан
Рейтинг сообщения:0
Вообще-то, случайных прерываний не бывает. Бывают ошибки, когда сам откроешь какое-то прерывание, а программу его обслуживания подключишь не туда, или забудешь ее подключить. И RETI в этом случае не поможет. Помогает RJMP PC. Зависло - поглядел в отладчике и увидел, на каком RJMP PC она висит.
Я уже не раз рассказывал, как это делают "по взрослому" - на тех же ARM, допустим. Таблица векторов заполняется вся, полностью, и где-то, в удобном месте программы делается таблица заглушек для всех прерываний. У "взрослых" она заполняется т.н. слабыми ссылками, которые работают только если нет нормальной ссылки. Есть нормальная программа - подключается она, нет - подключается заглушка, и при этом никто не ругается на повторение внешнего имени.
В нашей AVR-овской песочнице такого механизма нет, поэтому таблицу правим руками - понадобилось какое-то прерывание, закомментируем нужную строчку из этой таблицы, скопипастим ее в нужное место программы и вперед!
Ну, и о том, как "слегка механизировать" сочинение этой таблицы и таблицы векторов. В даташите на каждую АВР-ку есть пример заполнения таблицы векторов на АСМе. Например, у 8-й Меги он расположен на стр. 45. Вот он. Спойлер
Здесь приведен пример таблицы векторов. и начало программы - установка указателя стека и разрешение прерываний. Копипастим это целиком в нормальный редактор программ, подправляем пробелами или табуляциями колонки Address, Label, Code и Comments, чтобы они действительно стали колонками (я подправил пробелами, так, как движок форума не вполне адекватно реагирует на табуляции) и начинаем редактировать. Первым делом полностью убираем колонку Address, так, чтобы метка RESET (Main program start) оказалась в первой позиции. Особенно удобно, если ваш редактор поддерживает работу с вертикальным блоками, в таком редакторе это удаление делается в пару движений.
Все, таблица векторов готова. Единственное, что не подходит, это строчка
rjmp ADC ; ADC Conversion Complete Handler
Метка ADC, которую написали атмеловцы, не годится - совпадает с кодом машинной команды. Я ее исправляю на iADC. Заодно готово и начало программы.
Теперь копипастим (исправленную) таблицу векторов еще раз, уже без кусочка Main program start. Удаляем коды операции (rjmp) вместе с пробелами/табуляциями как перед, так и после них, чтобы метки, куда отсылают эти rjmp, оказались с первой позиции. После каждой из меток ставим двоеточие и, может быть, команду rjmp pc.
Все, таблица заглушек тоже готова.
Я, обычно, ставлю одну rjmp pc после всей таблицы меток. Если вдруг программа зависнет на этой команде, тогда я ставлю rjmp pc после каждой метки заглушек и разбираюсь. За все время работы с АВР-ками это пришлось сделать один раз. Вот итоговое начало программы для 8-й Меги. Спойлер
Достоинства этого подхода: - нет брошенных прерываний; - надежно распознается ошибка "не обслужено / обслужено не то прерывание"; - не надо сочинять метки для программ обслуживания прерываний - их заботливо предоставилипрограммисты Atmel (не считая косяка с iADC); - не надо напрягаться с набирательством официально рекомендованных длинных пар типа
Код:
org INT0addr rjmp <метка в моей программе, которую тоже надо сочинить>
и, при этом, не забыть какое-то из прерываний, иначе останется "дырка"
И вообще, работа по набору таблицы прерываний в моем варианте чисто механическая. Так и подмывает сочинить программулю для писюка, которой суёшь на вход копипасту из атмеловского даташита, а на выходе имеешь готовые таблицы.
_________________ Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Заголовок сообщения: Re: Прошу помощи в поиске ошибки кода Atmega8
Добавлено: Пт июл 27, 2018 19:50:41
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2694 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
B@R5uk писал(а):
...Не гоже, если некоторые прерывания срабатывают по какой-либо причине, а вызывается обработка каких-нибудь других прерываний..
Непонятно откуда, но периодически такое вылазит в форумах. Звучит так же, а что если jmp addss сработает как jmp rand_addss. Второй утверждение же врядли кто посчитает не абсурдным, но это одно и тоже.
afz писал(а):
У "взрослых" она заполняется т.н. слабыми ссылками
В асме такое бывает?
afz писал(а):
Помогает RJMP PC.
Лучше сделать обработчик по умолчанию, и то он нужен для обработки исключений, коих нет avr (вроде).
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Заголовок сообщения: Re: Прошу помощи в поиске ошибки кода Atmega8
Добавлено: Сб июл 28, 2018 03:39:54
Опытный кот
Карма: 13
Рейтинг сообщений: 163
Зарегистрирован: Сб дек 22, 2012 08:17:42 Сообщений: 744 Откуда: Караганда, Казахстан
Рейтинг сообщения:0
Цитата:
Непонятно откуда, но периодически такое вылазит в форумах.
Угу, еще и, почему-то, для этих неожиданных прерываний предлагают молча выходить из них. Хотя незапланированное прерывание может быть только из-за ошибки в программе. И вот для поиска таких ошибок нужна именно заглушка типа RJMP PC. Зависла программа, смотришь в отладчике и видишь, что вылезло не то прерывание, которое ожидалось.
А организовать это дело - запросто. Загнал 8-й Меге в регистр TIMSK не тот бит, который хотел, и радуйся жизни. И если для всех "случайных" прерываний поставить RETI, эту ошибку придется искать очень долго.
Цитата:
В асме такое бывает?
Во "взрослых" асмах - естественно, да. В нашей "песочнице", естественно, нет.
_________________ Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Заголовок сообщения: Re: Прошу помощи в поиске ошибки кода Atmega8
Добавлено: Сб июл 28, 2018 16:11:45
Опытный кот
Карма: 13
Рейтинг сообщений: 163
Зарегистрирован: Сб дек 22, 2012 08:17:42 Сообщений: 744 Откуда: Караганда, Казахстан
Рейтинг сообщения:3
Легко. Впрочем, здесь это оффтопик, поэтому уберу-ка я все это дело под спойлер. СпойлерБерем любой кейловский проект STM32 и ищем в его папке (обычно, в подоглавлении RTE\Device\<чуть укороченное название контроллера>) файл startup_stm32*.s. У меня, для контроллера STM32F103C8T6, это RTE\Device\STM32F103C8\startup_stm32f10x_md.s, каковой я и выкладываю.
Здесь от метки __Vectors до метки __Vectors_End находится таблица векторов. В отличие от AVR, у STM32 (да и у всех АРМов) в таблице векторов лежат не команды переходов, а только адреса, то есть процессор не просто переходит по адресу вектора, а достает из этого вектора адрес и переходит по нему. Ну, и самое первое слово - это не адрес команды в программе, а адрес вершины стека.
Далее идет Reset handler, т.е. программа действий по Reset'у или включению питания. Она вызывает программу SystemInit, а затем уходит в программу __main.
Далее начинаются заглушки для неиспользуемых прерываний. Первые 9 заглушек - с NMI_Handler по SysTickHandler - индивидуальные, каждая представлена отдельной командой перехода на себя саму.
Далее целая куча меток - с WWDG_IRQHandler по USBWakeUp_IRQHandler - поставлена на одну единственную зацикленную команду, все незапланированные прерывания уйдут на нее. Да, двоеточие после метки в АРМовских асмах, обычно, не ставится. Директива ассемблера EXPORT <метка> означает, что эта метка должна считаться внешней, на нее можно ссылаться из других программ (в т.ч. отдельно оттранслированных), если где-то к ней обратятся, линкер подставит ее адрес. [WEAK] означает, что внешнее имя "слабое", если где-то встретится точно такое же внешнее имя, но не слабое, линкер подставит его вместо слабого.
Все это предоставлено разработчиками, нам, допустим, для работы с USART1, достаточно будет написать программу обслуживания этого прерывания USART1_IRQHandler() и нормальное (не слабое) внешнее имя этой программы "передавит" слабое внешнее имя заглушки, соответственно, в таблице векторов в строчке
Код:
DCD USART1_IRQHandler ; USART1
вместо адреса заглушки окажется адрес этой программы.
_________________ Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
/* Macro to define default handlers. Default handler * will be weak symbol and just dead loops. They can be * overwritten by other handlers */ .macro def_irq_handler handler_name .align 1 .thumb_func .weak \handler_name .type \handler_name, %function \handler_name : b. .size \handler_name, . - \handler_name .endm
Заголовок сообщения: Re: Прошу помощи в поиске ошибки кода Atmega8
Добавлено: Сб июл 28, 2018 17:36:27
Опытный кот
Карма: 13
Рейтинг сообщений: 163
Зарегистрирован: Сб дек 22, 2012 08:17:42 Сообщений: 744 Откуда: Караганда, Казахстан
Рейтинг сообщения:0
Вообще-то, слабые внешние ссылки - стандартная фича всех "больших" систем. Появилось это дело, если не врет мой склероз, еще на Системе-360. Ну, и ассемблеры, обычно, поддерживают все фичи системы.
Я всего один раз встретил нечто, имеющееся в системе и не поддержанное ассемблером. Было это на Минск-32, там в загрузочных модулях, среди прочего, была команда "переслать с повторением", т.е. заданный код рассылался в группу смежных ячеек памяти, а в асме соответствующей директивы не было. И то, до конца я не уверен - я тогда наизусть знал руководство по первой версии ассемблера, а были и новее, может там это сделали, а новых руководств нам на ВЦ, почему-то, не досталось.
_________________ Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 50
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения