Вектора в таблице прерываний трехбайтные и в "рыбе", которую предлагает STVD при старте нового проекта, все метки в прграмме с типом long. Еще вопрос. При настройке прерывания от таймера TIM4 мне пришлось первой командой в обработчике обнулять соответствующий флаг прерывания (UIF в регистре TIM4_SR) вручную, потому как МК зависал при обработке прерывания, даже в отладке. Это действительно так надо делать или я чего-то не понимаю? Второй день разбираюсь с STM8S. Общие впечатление (после AVR) - хороший контроллер, система команд намного лучше, но есть приколы.
... на самом деле 4 байта 0х82,0х00,0хHH,0хLL, где HH,LL - старшая и младшая часть адреса размещения кода.
eufs писал(а):
При настройке прерывания от таймера TIM4 мне пришлось первой командой в обработчике обнулять соответствующий флаг ...
.. да так и должно быть.
eufs писал(а):
хороший контроллер, система команд намного лучше, но есть приколы
... самый приятный "прикол" ИМХО - возможность выполнения кода в RAM, "минусы" по сравнению с AVR - более "хитрый" конвейер и как следствие рассчитать все до такта гораздо сложней ....
Ага, а что тогда 0х82? И почему именно 82? При дизассемблировании вектора переходов обозначены как INT {трехбайтный адрес}. Я посчитал, что 82 это код команды. Хотя сама структура long - четырехбайтное число. По поводу рассчета длительности выполнения команд. IMHO, при достаточном быстродействии CPU и периферии - это теряет актуальность. Может это к STM8S и не относится, но в современных PC это точно уже никто не делает. Я сомневаюсь, что понадобится с такой точностью формировать именно командами какие-либо задержки. Хотя, было дело, на АВР 90S2313 писал полностью на прерываниях формирование сигнала синхронизации для ТВ. Как положено, с чересстрочной разверткой, уравнительными импульсами. Работало с уравнивающими (на время реакции на прерывание) процедурами. Работало все четко, еще и частоту прерываний по алгоритму Брезентхэма подстраивал. Где-то проект валяется...
... 0х82 - код команды INT - команда INT + 3 байта адреса = 4. Для МК у которых больше 64К памяти второй (т.е после кода 0х82) байт представляет расширенный адрес.
ЗЫ. на самом деле все эти "детали" хорошо описаны в datasheet_e
В ПДФ я про код 82 ничего не находил. В списке команд ее нет. Может у меня не те ПДФ? А про расширенные адреса знаю, читал. В таком случае, похоже, что они прикручивают универсальное ядро к набираемой периферии. Отсюда, с одной стороны порядок и универсальность, а с другой стороны - сплошные непонятности. В частности, применение в МК STM8S003F3 команд с дальними (трехбайтными) адресами лишено смысла. Но это лишь в том случае, если я не пишу портируемые программы на другие STM8S с большой памятью (>32K)
Доброго времени Опять накопилось куча вопросов по этим камням, изза огромных возможностей конфигурации периферии совсем запутался, хочу сделать на аппаратном уровне счетчик длительности импульса. Тоесть включать таймер и сбрасывать по фронту и останавливать и вызывать прерывание по спаду внешнего сигнала. 80 страниц английского текста никак немогу освоить.
Выдернул из даташита структуру. Каким образом можно исполнить задуманное? Маршрут получается такой, Ch1 - TI1 - Filter - TI1F - TI1F_ED, TIFP1. По событию TIFP1 можно вызвать прерывание, а как быть с запуском?
Просчитать такты может понадобится для взаимодействия с медленной периферией. Например многоразрядными регистрами сдвига(64, 128 разрядов), может понадобится задержка на десяток-другой тактов для того чтобы последний регистр успел отреагировать.
Мне нужно считать для приемника. Алгоритм в двух словах такой: - Инициализируем приемник: разрешаем прерывание, сбрасываем флаг, ждем импульса - По прерыванию смотрим какой сменой уровня было вызвано прерывание если фронтом ( синхра ), мерим длительность пульса если спадом ( данные ), мерим длительность паузы до след пульса обрабатываем, ложим в память еще попутный вопрос, как можно объявить байт или слово в памяти и начначить ей какоенить человеческое имя. чтобы не писать все время адрес ячейки куда обращаться нужно
Длительность импульса измеряется таймером, тут такты считать не надо. Благо в STM-ках таймеры умеют делать и не такое...
Ссылка на константу делается меткой. Или если нужна константа не в памяти контроллера(строка текст и т.д.) то есть специальные директивы, DEFINE, EQU... вроде бы такие элементарные вещи есть во всех компиляторах.
Тоесть ram0_start.b должна находится по адресу 0x00 и быть длинной 256 байтов? пробую так: RamByte0 equ $ram0_segment_start на что STVD жестко выругалась: Error 56: unrecognised opcode ' RamByte0 equ $0' что ей надо от меня? и еще один вопрос. зачем она чистит озу? никто же не станет читать память если в нее ниего не ложили? можно ли затереть эти строки?
Добрый день!! Помогите записать данные в регистр таймера, мои познания в контроллерах этой фирмы хелловордовские, поэтому сильно не ругайтесь пробовал так: mov $52C1,#$00 ; Прескаллер 00AA mov $52C2,#$AA
Надо читать внимательней даташиты. Таймеры довольно сложные из-за своей универсальности, я думаю что имеет значение последовательность записи в старшую/младшую половины регистра. Там вероятно имеется защелка с целью предотвращения несинхронной записи половинок многоразрядных регистров. Уточните этот момент в даташите.
Хорошо, а откуда ты взял что регистр прескалера не загружен? Может он и не должен читаться, работает только на запись. Или работает только когда разрешен.
Кто-нибудь подскажет, для чего нужен в таймерах/счетчиках бит URS? В документации сказано: URS: Update request source 0: When enabled, an update interrupt request is sent as soon as registers are updated (counter overflow). 1: When enabled, an update interrupt request is sent only when the counter reaches the overflow/underflow.
Что было переведено мною примерно как: Когда равен нулю, то запрос на прерывание формируется как только регистр обновлен (счетчик переполнен) Когда равен еденице, то запрос на прерывание формируется только когда счетчик достигает значения переполнения/опустошения? Тогда какая разница в данном случаем между еденицей и нулем? Может, в первом случае имеется ввиду перышение счетчиком значения в регистре ARR?
Кто-нибудь подскажет, для чего нужен в таймерах/счетчиках бит URS? Что было переведено мною примерно как: Когда равен нулю, то запрос на прерывание формируется как только регистр обновлен (счетчик переполнен) Когда равен еденице, то запрос на прерывание формируется только когда счетчик достигает значения переполнения/опустошения? Тогда какая разница в данном случаем между еденицей и нулем? Может, в первом случае имеется ввиду перышение счетчиком значения в регистре ARR?
Дубликат вопроса на Казусе. Там я ответил. Повторять здесь?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения