|
5 / 5 / 0
Регистрация: 03.09.2013
Сообщений: 79
|
||||||||||||||||||||||||||||||||||||||||||||||
Некорректно работает прошивка. Должна мигать светодиодом при переполнении TIMER023.09.2025, 17:24. Показов 2679. Ответов 47
Здравствуйте!
Когда-то давно, для общего развития, учился писать на ассемблере для avr и достиг неких результатов. Всё благодаря участникам данного форума, которые проявили ко мне невероятную терпимость! Теперь было решено, одну из программ переписать с ассемблера на си в рамках факультатива. Но что-то пошло не так и я не смог разобраться что именно, но зацепка есть. Программа на ассембере
Проверил с помощью `avr-objdump`, судя по всему, некорректно формируются первые ячейки program memory, через которые и происходит прыжки при прерывании. `avr-objdump` программы на ассемблере:
Добавлено через 1 час 13 минут Смог найти в чём проблема. Нужно убрать флаг `-nostdlib`. Добавлено через 56 минут Гыгы, ещё в ассемблерной части, была ошибка, было так:
А совсем правильно так:
1
|
||||||||||||||||||||||||||||||||||||||||||||||
| 23.09.2025, 17:24 | |
|
Ответы с готовыми решениями:
47
SysTick можно ли с его помощью мигать светодиодом Не работает TIMER0 OVF Не работает TIMER0 OVF |
|
51 / 49 / 2
Регистрация: 23.01.2019
Сообщений: 378
|
||
| 25.09.2025, 11:35 | ||
![]() IntelHex 32-х битный, а avrasm2 создаёт 16-ти битные, если я ничего не путаю.. Возможно, если вы переведёте в другую битность, то и адреса поменяются. Я так глубоко не вникаю. Просто мне интереснее заниматься более творческими занятиями, чем биться с разными форматами и создавать и преодолевать прочие ненужные сложности. Что в результате получаю я? Работающие устройства. Что в результате получаете вы? То что у вас срабатывают прерывания, которые вы не разрешали. Тогда пожалуйта - дизассемблер вам в руки и ковыряйте вместо того, что бы создать что-то полезное Мне не жалко. В архиве тестовый исходник и файл скомпилированный в avrasm2. test.rar Но повторюсь, вы сами себе придумываете сложности.
0
|
||
|
1507 / 524 / 75
Регистрация: 22.09.2023
Сообщений: 1,654
|
|
| 25.09.2025, 11:39 | |
|
В документации указаны адреса векторов в словах. гцц использует байтовую адресацию. Одно слово из документации (и avrasm) равно двум байтам гцц. Знатная подлянка, подложенная авторами ядра AVR.
1
|
|
|
51 / 49 / 2
Регистрация: 23.01.2019
Сообщений: 378
|
||
| 25.09.2025, 11:43 | ||
|
Но почему у ТС прерывания срабатывают, которые он не назначал
0
|
||
|
5 / 5 / 0
Регистрация: 03.09.2013
Сообщений: 79
|
|||||||||||||
| 25.09.2025, 11:45 [ТС] | |||||||||||||
|
Поскольку прошивка получается в бинарном формате, чтобы её отправить plain text'ом, её можно перевести в формат base64. А ещё, я не обратил внимание, что тут есть возможность прикрепить файл, я обычно общаюсь на форумах, где такой возможности нет. Затупил. )))Вот:
1
|
|||||||||||||
|
1507 / 524 / 75
Регистрация: 22.09.2023
Сообщений: 1,654
|
|||||
| 25.09.2025, 11:50 | |||||
|
Добавлено через 5 минут
0
|
|||||
|
5 / 5 / 0
Регистрация: 03.09.2013
Сообщений: 79
|
||||
| 25.09.2025, 12:17 [ТС] | ||||
|
Конкретно данная проблема решена тем, что убрал флаг `-nostdlib`, т.к. с ним не формируется секция памяти программы для прерываний (векторов). Сейчас вопрос уже в другом. :^)
Но всё равно уточню. Повторюсь, что с этими проблемами разобрался. Добавлено через 18 минут При этом с кодом на ассемблере таймер работает как надо независимо от того, какие прерывания для timer0 я разрешил, главное, что разрешил. Могу привести более актуальный код, если интересно поучаствовать. (Но правильнее, наверное, будет создать новый топик.)
0
|
||||
|
51 / 49 / 2
Регистрация: 23.01.2019
Сообщений: 378
|
|||
| 25.09.2025, 12:51 | |||
Скажу больше, число 64 меня несколько возмутило ![]() Объясню почему. Не так давно я пытался преобразовывать *.bmp изображения для вывода на дисплей. Сначала решил "выдирать" данные из бмп при помощи хекс-редактора. Но то что я увидел под виндой, было далеко от 8-ми или 16-ти бит ![]() В результате пришлось поизучать паскаль Работа с *.bmp изображением В содержание темы можно не вникать, там картинок достаточно. Добился кодирования изображений в RLE-сжатии до 8-ми цветов. Но это уже совсем другая история.. ))
0
|
|||
|
4147 / 2725 / 433
Регистрация: 09.09.2017
Сообщений: 12,074
|
||
| 26.09.2025, 08:46 | ||
|
1
|
||
|
5 / 5 / 0
Регистрация: 03.09.2013
Сообщений: 79
|
||||||||||||
| 26.09.2025, 10:30 [ТС] | ||||||||||||
0
|
||||||||||||
|
1507 / 524 / 75
Регистрация: 22.09.2023
Сообщений: 1,654
|
||
| 26.09.2025, 19:09 | ||
Сообщение было отмечено Medusa Kaiser как решение
РешениеВсе другие прерывания тоже срабатывают пока таймер дотикает до переполнения. Просто в ассемблерном исполняемом коде у вас на месте остальных векторов пусто, там остается код "все единицы" из стертого флеша, которые (кажется) являются кодом операции NOP и при возникновении любого разрешенного прерывания исполнение "проваливается" по этим кодам до существующего обработчика переполнения, а в библиотечном коде гцц все неиспользуемые вектора забиты "заглушками" из одной команды reti и попав в любое другое прерывание ядро выполняет reti и выходит из него.
2
|
||
|
51 / 49 / 2
Регистрация: 23.01.2019
Сообщений: 378
|
|
| 26.09.2025, 19:15 | |
|
1
|
|
|
51 / 49 / 2
Регистрация: 23.01.2019
Сообщений: 378
|
|||||||||||
| 27.09.2025, 10:04 | |||||||||||
|
Проверил. avrasm2 у меня, поэтому адреса согласно дш.
при
ldi R16, (1<<OCIE0A) - не работает при
ldi R16, (1<<OCIE0A) - работает Полностью нужно таблицу векторов в коде писать. При сокращенном написании место во флеш не увеличится.
1
|
|||||||||||
|
5 / 5 / 0
Регистрация: 03.09.2013
Сообщений: 79
|
|||||||
| 27.09.2025, 23:05 [ТС] | |||||||
Подскажите, пожалуйста, напоследок, как мне взять сишную программу, транслировать её сначала в ассемблерный код, а потом собрать? Я хочу в этих же местах поставить nop'ы, собрать и посмотреть что будет. :^)
0
|
|||||||
|
1507 / 524 / 75
Регистрация: 22.09.2023
Сообщений: 1,654
|
|
| 28.09.2025, 01:35 | |
|
Напишите свою таблицу векторов по примеру https://github.com/avrdudes/av... t1/gcrt1.S, подключите к проекту (с -nostartfiles, чтобы не было конфликтов) и пересоберите.
Скормить дизассемблированный код ассемблеру - задача непростая, тут уж точно, проще hex-редактором поправить двоичный код.
0
|
|
|
658 / 411 / 76
Регистрация: 21.09.2008
Сообщений: 1,411
|
||
| 28.09.2025, 09:42 | ||
![]() Можно попробовать 010 Editor. Испытательный срок 30 дней. Поддерживает множество форматов.
0
|
||
|
51 / 49 / 2
Регистрация: 23.01.2019
Сообщений: 378
|
|
| 28.09.2025, 09:55 | |
|
Я может меркантильный
, но какой практический смысл нопить сишную прошивку..И вообще, как я раньше жил без этих знаний ..и даже писать что-то получалось
0
|
|
|
4147 / 2725 / 433
Регистрация: 09.09.2017
Сообщений: 12,074
|
||||
| 28.09.2025, 11:11 | ||||
|
Но учитывая, что ТС хочет всего лишь проверить таблицу прерываний, можно и правда влезть руками в *.hex и поправить пару первых строк.
0
|
||||
|
51 / 49 / 2
Регистрация: 23.01.2019
Сообщений: 378
|
||
| 28.09.2025, 11:44 | ||
![]() Наверное многие столкнулись с такой ситуацией первый раз, невзирая на опыт. Поэтому и не сразу вопрос разрешился. А нужно было всего лишь, или использовать gcc, или писать полную таблицу векторов на асме, или не использовать непонятную запись (1<<1), а вместо неё писать 0b0000_0001 или (1<<TOIE0). Вобщем я за соблюдение элементарных правил + подсветку синтаксиса, тогда и отвлекаться меньше придётся
0
|
||
|
4147 / 2725 / 433
Регистрация: 09.09.2017
Сообщений: 12,074
|
||||||||
| 28.09.2025, 14:13 | ||||||||
P.S. кстати, я не следил, в стандарт языка С ввели наконец 0b или оно так и остается "нестандартным".
0
|
||||||||
| 28.09.2025, 14:13 | |
|
Мигание светодиода по переполнению счетчика
MP430. Timer0. Compare mode Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео:
https:/ / vkvideo. ru/ video-240781534_456239017
YouTube:
eY5-5PyI9NM
Текстовая версия
|
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать
Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
|
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|