Программирование STM8
Re: Программирование STM8
Вектора в таблице прерываний трехбайтные и в "рыбе", которую предлагает STVD при старте нового проекта, все метки в прграмме с типом long.
Еще вопрос. При настройке прерывания от таймера TIM4 мне пришлось первой командой в обработчике обнулять соответствующий флаг прерывания (UIF в регистре TIM4_SR) вручную, потому как МК зависал при обработке прерывания, даже в отладке. Это действительно так надо делать или я чего-то не понимаю?
Второй день разбираюсь с STM8S. Общие впечатление (после AVR) - хороший контроллер, система команд намного лучше, но есть приколы.
Еще вопрос. При настройке прерывания от таймера TIM4 мне пришлось первой командой в обработчике обнулять соответствующий флаг прерывания (UIF в регистре TIM4_SR) вручную, потому как МК зависал при обработке прерывания, даже в отладке. Это действительно так надо делать или я чего-то не понимаю?
Второй день разбираюсь с STM8S. Общие впечатление (после AVR) - хороший контроллер, система команд намного лучше, но есть приколы.
C0FFEE=12648430
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Программирование STM8
... на самом деле 4 байта 0х82,0х00,0хHH,0хLL, где HH,LL - старшая и младшая часть адреса размещения кода.eufs писал(а):Вектора в таблице прерываний трехбайтные...
.. да так и должно быть.eufs писал(а):При настройке прерывания от таймера TIM4 мне пришлось первой командой в обработчике обнулять соответствующий флаг ...
... самый приятный "прикол" ИМХО - возможность выполнения кода в RAM, "минусы" по сравнению с AVR - более "хитрый" конвейер и как следствие рассчитать все до такта гораздо сложней ....eufs писал(а):хороший контроллер, система команд намного лучше, но есть приколы
Re: Программирование STM8
Ага, а что тогда 0х82? И почему именно 82? При дизассемблировании вектора переходов обозначены как INT {трехбайтный адрес}. Я посчитал, что 82 это код команды. Хотя сама структура long - четырехбайтное число.
По поводу рассчета длительности выполнения команд. IMHO, при достаточном быстродействии CPU и периферии - это теряет актуальность. Может это к STM8S и не относится, но в современных PC это точно уже никто не делает.
Я сомневаюсь, что понадобится с такой точностью формировать именно командами какие-либо задержки. Хотя, было дело, на АВР 90S2313 писал полностью на прерываниях формирование сигнала синхронизации для ТВ. Как положено, с чересстрочной разверткой, уравнительными импульсами. Работало с уравнивающими (на время реакции на прерывание) процедурами. Работало все четко, еще и частоту прерываний по алгоритму Брезентхэма подстраивал. Где-то проект валяется...
По поводу рассчета длительности выполнения команд. IMHO, при достаточном быстродействии CPU и периферии - это теряет актуальность. Может это к STM8S и не относится, но в современных PC это точно уже никто не делает.
Я сомневаюсь, что понадобится с такой точностью формировать именно командами какие-либо задержки. Хотя, было дело, на АВР 90S2313 писал полностью на прерываниях формирование сигнала синхронизации для ТВ. Как положено, с чересстрочной разверткой, уравнительными импульсами. Работало с уравнивающими (на время реакции на прерывание) процедурами. Работало все четко, еще и частоту прерываний по алгоритму Брезентхэма подстраивал. Где-то проект валяется...
C0FFEE=12648430
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Программирование STM8
... 0х82 - код команды INT - команда INT + 3 байта адреса = 4. Для МК у которых больше 64К памяти второй (т.е после кода 0х82) байт представляет расширенный адрес.Я посчитал, что 82 это код команды
ЗЫ. на самом деле все эти "детали" хорошо описаны в datasheet_e
Re: Программирование STM8
В ПДФ я про код 82 ничего не находил. В списке команд ее нет. Может у меня не те ПДФ? А про расширенные адреса знаю, читал. В таком случае, похоже, что они прикручивают универсальное ядро к набираемой периферии. Отсюда, с одной стороны порядок и универсальность, а с другой стороны - сплошные непонятности. В частности, применение в МК STM8S003F3 команд с дальними (трехбайтными) адресами лишено смысла. Но это лишь в том случае, если я не пишу портируемые программы на другие STM8S с большой памятью (>32K)
C0FFEE=12648430
Re: Программирование STM8
Доброго времени
Опять накопилось куча вопросов по этим камням, изза огромных возможностей конфигурации периферии совсем запутался, хочу сделать на аппаратном уровне счетчик длительности импульса. Тоесть включать таймер и сбрасывать по фронту и останавливать и вызывать прерывание по спаду внешнего сигнала.
80 страниц английского текста никак немогу освоить.
Опять накопилось куча вопросов по этим камням, изза огромных возможностей конфигурации периферии совсем запутался, хочу сделать на аппаратном уровне счетчик длительности импульса. Тоесть включать таймер и сбрасывать по фронту и останавливать и вызывать прерывание по спаду внешнего сигнала.
80 страниц английского текста никак немогу освоить.
Re: Программирование STM8
Выдернул из даташита структуру. Каким образом можно исполнить задуманное? Маршрут получается такой, Ch1 - TI1 - Filter - TI1F - TI1F_ED, TIFP1.
По событию TIFP1 можно вызвать прерывание, а как быть с запуском?
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Программирование STM8
Просчитать такты может понадобится для взаимодействия с медленной периферией. Например многоразрядными регистрами сдвига(64, 128 разрядов), может понадобится задержка на десяток-другой тактов для того чтобы последний регистр успел отреагировать.
Re: Программирование STM8
Мне нужно считать для приемника. Алгоритм в двух словах такой:
- Инициализируем приемник: разрешаем прерывание, сбрасываем флаг, ждем импульса
- По прерыванию смотрим какой сменой уровня было вызвано прерывание
если фронтом ( синхра ), мерим длительность пульса
если спадом ( данные ), мерим длительность паузы до след пульса
обрабатываем, ложим в память
еще попутный вопрос, как можно объявить байт или слово в памяти и начначить ей какоенить человеческое имя. чтобы не писать все время адрес ячейки куда обращаться нужно
- Инициализируем приемник: разрешаем прерывание, сбрасываем флаг, ждем импульса
- По прерыванию смотрим какой сменой уровня было вызвано прерывание
если фронтом ( синхра ), мерим длительность пульса
если спадом ( данные ), мерим длительность паузы до след пульса
обрабатываем, ложим в память
еще попутный вопрос, как можно объявить байт или слово в памяти и начначить ей какоенить человеческое имя. чтобы не писать все время адрес ячейки куда обращаться нужно
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Программирование STM8
Длительность импульса измеряется таймером, тут такты считать не надо. Благо в STM-ках таймеры умеют делать и не такое...
Ссылка на константу делается меткой. Или если нужна константа не в памяти контроллера(строка текст и т.д.) то есть специальные директивы, DEFINE, EQU... вроде бы такие элементарные вещи есть во всех компиляторах.
Ссылка на константу делается меткой. Или если нужна константа не в памяти контроллера(строка текст и т.д.) то есть специальные директивы, DEFINE, EQU... вроде бы такие элементарные вещи есть во всех компиляторах.
Re: Программирование STM8
Эту часть кода создает STVD автоматом
Тоесть ram0_start.b должна находится по адресу 0x00 и быть длинной 256 байтов?
пробую так:
RamByte0 equ $ram0_segment_start
на что STVD жестко выругалась:
Error 56: unrecognised opcode ' RamByte0 equ $0'
что ей надо от меня?
и еще один вопрос. зачем она чистит озу? никто же не станет читать память если в нее ниего не ложили? можно ли затереть эти строки?
Код: Выделить всё
#ifdef RAM0
; clear RAM0
ram0_start.b EQU $ram0_segment_start
ram0_end.b EQU $ram0_segment_end
ldw X,#ram0_start
clear_ram0.l
clr (X)
incw X
cpw X,#ram0_end
jrule clear_ram0
#endifТоесть ram0_start.b должна находится по адресу 0x00 и быть длинной 256 байтов?
пробую так:
RamByte0 equ $ram0_segment_start
на что STVD жестко выругалась:
Error 56: unrecognised opcode ' RamByte0 equ $0'
что ей надо от меня?
и еще один вопрос. зачем она чистит озу? никто же не станет читать память если в нее ниего не ложили? можно ли затереть эти строки?
Re: Программирование STM8
Добрый день!!
Помогите записать данные в регистр таймера, мои познания в контроллерах этой фирмы хелловордовские, поэтому сильно не ругайтесь
пробовал так:
mov $52C1,#$00 ; Прескаллер 00AA
mov $52C2,#$AA
и так: mov TIM1_PSCRH,#$00
mov TIM1_PSCRL,#$AA
и так: ld a,#$AA
ld TIM1_PSCRH,a ; Прескаллер AAAA
ld TIM1_PSCRL,a
и даже через bset пробовал
в результате всего этого, в регистре прескаллера 0x0000
притом в порты в/в все отлично пишется всеми способами
в чем может быть проблема
Помогите записать данные в регистр таймера, мои познания в контроллерах этой фирмы хелловордовские, поэтому сильно не ругайтесь
пробовал так:
mov $52C1,#$00 ; Прескаллер 00AA
mov $52C2,#$AA
и так: mov TIM1_PSCRH,#$00
mov TIM1_PSCRL,#$AA
и так: ld a,#$AA
ld TIM1_PSCRH,a ; Прескаллер AAAA
ld TIM1_PSCRL,a
и даже через bset пробовал
в результате всего этого, в регистре прескаллера 0x0000
притом в порты в/в все отлично пишется всеми способами
в чем может быть проблема
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Программирование STM8
Надо читать внимательней даташиты. Таймеры довольно сложные из-за своей универсальности, я думаю что имеет значение последовательность записи в старшую/младшую половины регистра. Там вероятно имеется защелка с целью предотвращения несинхронной записи половинок многоразрядных регистров. Уточните этот момент в даташите.
Re: Программирование STM8
Спасибо за совет, уточнил, все верно, но результата нету
Разобрался, в STM8L по дефолту периферия выкл. ее включать нужно
Разобрался, в STM8L по дефолту периферия выкл. ее включать нужно
Последний раз редактировалось casus Вс дек 23, 2012 15:17:16, всего редактировалось 1 раз.
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Программирование STM8
Хорошо, а откуда ты взял что регистр прескалера не загружен? Может он и не должен читаться, работает только на запись. Или работает только когда разрешен.
Re: Программирование STM8
нужно было поставить бит1 в CLK_PCKENR2
и стало все писаться/читаться. спасибо!!!
и стало все писаться/читаться. спасибо!!!
Re: Программирование STM8
Кто-нибудь подскажет, для чего нужен в таймерах/счетчиках бит 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: 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?
Re: Программирование STM8
Дубликат вопроса на Казусе. Там я ответил. Повторять здесь?menster писал(а):Кто-нибудь подскажет, для чего нужен в таймерах/счетчиках бит URS?
Что было переведено мною примерно как:
Когда равен нулю, то запрос на прерывание формируется как только регистр обновлен (счетчик переполнен)
Когда равен еденице, то запрос на прерывание формируется только когда счетчик достигает значения переполнения/опустошения?
Тогда какая разница в данном случаем между еденицей и нулем?
Может, в первом случае имеется ввиду перышение счетчиком значения в регистре ARR?
С уважением,
Виктор.
Виктор.
Re: Программирование STM8
Доброе время суток.
Народ подскажите у STM8S105K4B6 есть заводской Bootloader?
Хочу прошить, но ST-Link не имею хочу попробывать через RS232.
Народ подскажите у STM8S105K4B6 есть заводской Bootloader?
Хочу прошить, но ST-Link не имею хочу попробывать через RS232.
Только абсолютная пустота бездны принесёт мне покой.
- Zheleznjakov
- Нашел транзистор. Понюхал.
- Сообщения: 190
- Зарегистрирован: Сб июн 12, 2010 16:19:17
- Откуда: Россия, Томск
- Контактная информация:
Re: Программирование STM8
Да, имеет.
http://www.st.com/internet/com/TECHNICA ... 201192.pdf
Можно же купить дисковери (STM8SVLDISCOVERY ) вместо ST-link-ка, значительно дешеве...
http://www.st.com/internet/com/TECHNICA ... 201192.pdf
Можно же купить дисковери (STM8SVLDISCOVERY ) вместо ST-link-ка, значительно дешеве...
С уважением, Денис Железняков aka ZiB
Мой блог: http://ziblog.ru
Мой блог: http://ziblog.ru