Easyelectronics.ru

Электроника для всех
Текущее время: 12 ноя 2018, 23:27

Часовой пояс: UTC + 5 часов



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин комплектующих.

Начать новую тему Ответить на тему  [ Сообщений: 89 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 10 ноя 2016, 11:30 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 2931
Откуда: КЧР, поселок Нижний Архыз
casus писал(а):
Всем привет. Поделитесь массивом Брадиса для синуса в 16 битном формате.

Для синусов/косинусов нужно не постоянный шаг по углу обеспечить, а постоянную точность. Шаг при этом будет переменным. Определять значения можно как перебором, так и (что быстрей) бисекцией.
Я себе вот такой велосипед накалякал, чтобы генерировать для мелкоконтроллеров таблицы тригонометрических функций с заданной точностью.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 07 дек 2016, 06:29 
Только пришел

Зарегистрирован: 07 дек 2016, 06:20
Сообщения: 6
Доброго здоровьичка всем!
ковыряю STM8L discovery. Пытаюсь реализовать общение отладочной платы с компьютером через USART. столкнулся с такой проблемой: Данные от платы к компу идут(не вполне корректные, но идут. Символы, которые приходят, не соответствуют ASCII-таблицам. Кроме того, отправка данных от компьютера к плате не работает - прерывание при отправке данных просто не срабатывает, однако при переоткрытии порта терминалом на компе, отладка благополучно выпадает в прерывание USART.
К компу подключаю плату через китайский конвертер 232-USB на микрухе FT232.
Контроллер программирую на ASM.

P.S. если у кого-то есть материалы по асм данного контроллера и по его программированию, а также по использованию его функционала, буду крайне благодарен за предоставление. Особенно, если есть материалы на русском.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 07 дек 2016, 09:20 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 616
Откуда: Челябинск
mtroosh писал(а):
P.S. если у кого-то есть материалы по асм данного контроллера и по его программированию, а также по использованию его функционала, буду крайне благодарен за предоставление. Особенно, если есть материалы на русском.

Ассемблеры всякие бывают: ST, Raisonance, Cosmic, IAR. Какой именно вы используете?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 07 дек 2016, 22:12 
Только пришел

Зарегистрирован: 07 дек 2016, 06:20
Сообщения: 6
Bill писал(а):
Ассемблеры всякие бывают: ST, Raisonance, Cosmic, IAR. Какой именно вы используете?


STVD


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 08 дек 2016, 12:43 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5124
mtroosh, это не компилятор а IDE, компилятор Cosmic. Исправляйте свои пробелы в знание.
Ну а озвученное "асм" и "документация на русском" говорит о том что у вас все впереди.
Займитесь лучше изучением языка, как английского так и С ну и естественно работы периферии.
Лишь в этом случае будет безболезнен переход на стм32, а он неизбежен...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 09 дек 2016, 06:34 
Только пришел

Зарегистрирован: 07 дек 2016, 06:20
Сообщения: 6
dosikus_2 писал(а):
mtroosh, это не компилятор а IDE, компилятор Cosmic. Исправляйте свои пробелы в знание.
Ну а озвученное "асм" и "документация на русском" говорит о том что у вас все впереди.
Займитесь лучше изучением языка, как английского так и С ну и естественно работы периферии.
Лишь в этом случае будет безболезнен переход на стм32, а он неизбежен...

Благодарю за беспокойство о моем образовании. Почему Вы решили, что если у меня есть желание изучить уже кем-то переработанную и изложенную на родном мне языке информацию, то мне нужно учить английский? В совершенстве не говорю, но для чтения тех документации вполне владею. Если бы у меня была информация, которая мне нужна, я бы не искал её, согласитесь? Есть такой старый анекдот:

Show "анекдот"

Так вот все же мне нужен конкретный "баран". Насколько я понимаю, ассемблер у меня все же ST, а не Cosmic. Однако не в этом суть вопроса. В конце концов, не так важен компилятор, как четкий алгоритм действий и согласованная работа электроники. Или Вы не можете мне помочь в силу отсутствия знаний ассемблера для данного типа контроллеров в принципе? Не сочтите за грубость


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 09 дек 2016, 12:00 
Старожил
Аватара пользователя

Зарегистрирован: 28 янв 2010, 11:56
Сообщения: 2856
Откуда: Винница
dosikus_2 писал(а):
Лишь в этом случае будет безболезнен переход на стм32, а он неизбежен...

(Ворчливо) На кортексы... на STM32 свет клином не сошёлся.

_________________
Китайская комплектация - европейское качество!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 09 дек 2016, 12:54 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 1336
mtroosh писал(а):
У нас не страна баранов, а Страна Советов!
Похоже уже наоборот )
mtroosh, не даст никто никаких советов, потому что не пишет никто на ассемблере stm8 и не будет писать


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 11 дек 2016, 04:23 
Только пришел

Зарегистрирован: 07 дек 2016, 06:20
Сообщения: 6
vt340 писал(а):
mtroosh писал(а):
У нас не страна баранов, а Страна Советов!
Похоже уже наоборот )
mtroosh, не даст никто никаких советов, потому что не пишет никто на ассемблере stm8 и не будет писать

Однако же тема существует?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 11 дек 2016, 09:25 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 27 янв 2010, 18:55
Сообщения: 163
Откуда: Томск
mtroosh, а чем вас официальная документация не устраивает? Глубокого знания английского для чтения этих документов не требуется.
Конкретно по ассемблеру читайте документ PM0044. По настройке периферии для STM8L152 читайте документ RM0031. По адресному пространству
читайте соответствующий product specification, для STM8L152 это DS6372. Все это легко ищется на официальном сайте.
А вообще на ассемблере писать код долго, и поддерживать его тоже не очень удобно. На ассемблере имеет смысл писать код только из
спортивного интереса :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 11 дек 2016, 14:02 
Старожил

Зарегистрирован: 27 апр 2013, 13:53
Сообщения: 772
vt340 писал(а):
mtroosh, не даст никто никаких советов, потому что не пишет никто на ассемблере stm8 и не будет писать


Одна из ссылок навскидку STM8S Programming

P.S. STM8 отладочную плату Discovery пока отложил до "будущих" времён, а взор направил на STM32L4 после экспериментов с STM32L100 :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 11 дек 2016, 20:53 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 15 фев 2011, 22:21
Сообщения: 199
mtroosh писал(а):
vt340 писал(а):
mtroosh писал(а):
У нас не страна баранов, а Страна Советов!
Похоже уже наоборот )
mtroosh, не даст никто никаких советов, потому что не пишет никто на ассемблере stm8 и не будет писать

Однако же тема существует?

Тема существует, поэтому гони отсюда баранов к чертям и идусским супербиблиотекам С+++++++,
кубам и прочей ленности неассемблерного мозга.
А чтобы до конца стошнило некоторым, пора в теме паявиться ASM листингу STVD.
Даю кусочки проектика думаю mtroosh, тебе будет интересно.
Show

тут имеются макросы, облегчают жизнь, минимализм листинга и максимум читабельности кода.
Это в С+++++++++++++ листинг для того чтобы ссылаться на ещё 10 листингов 30 хидеров
и еще кучу мусора, чтобы изменить 1 бит!!!
Итак, макрос который тебе пригодится и таким, как ты:
Show

Страшно? )))
Это до того как прочитаешь мануал, как в нем работают макросы. МОгу сразу сказать
там многое уродски сделано. НУ если захочешь (или надо), то вкуришь.
Ещё один ОЧЕНЬ полезный слон:
Show
Ну и ещё немного приправы для зычности 8-мибитника:
Show

Успехов и Ювелирного Ассемблера!
P.S.
http://forum.easyelectronics.ru/viewtopic.php?f=33&t=16460


Последний раз редактировалось elisey 11 дек 2016, 21:10, всего редактировалось 1 раз.
Большие листинги кода нужно прятать под спойлер


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 12 дек 2016, 03:52 
Только пришел

Зарегистрирован: 07 дек 2016, 06:20
Сообщения: 6
vastani писал(а):
Даю кусочки проектика думаю mtroosh, тебе будет интересно.

Да пребудет с тобой благоденствие! Вот именно то, что надо. По листингам куда проще разобрать работу периферии, чем по не самому подробному манулу.
Спасибо огромное ещё раз.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 12 дек 2016, 04:08 
Только пришел

Зарегистрирован: 07 дек 2016, 06:20
Сообщения: 6
dmk793 писал(а):
По настройке периферии для STM8L152 читайте документ RM0031

Вот конкретно за это благодарю особо - этот референс я прощелкал и потому довольствовался D15962...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 12 дек 2016, 13:37 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 1336
vastani писал(а):
Успехов и Ювелирного Ассемблера!
vastani, писать на асме для stm8 - это тюнинговать запорожец )
Ну и уёбищный препроцессор - буэ )
В ювелирном деле камень требует хорошей оправы - асм требует хорошего скриптового языка сверху
http://www.theweb.dk/KickAssembler/webh ... ction.html


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 20 май 2017, 09:13 
Старожил

Зарегистрирован: 23 дек 2012, 16:46
Сообщения: 310
Откуда: Новый Уренгой
Всем добра. Хочу поделиться процедурами чтения и записи в чип по USART.
Всё больше мне начинает нравиться ассемблер, как-то делали с человеком оцифровку сигнала, у него код занял 30кб, у меня тот же функционал на асме занял 500 байт из которых 128 байт - вектора прерываний. В итоге он пишет на стороне хоста, а я на камнях. После компиляции занимает около 100 байт кода, и может быть использована для обновления прошивки через терминальную программу в режиме RunTime, что намного лучше встроенного bootloader'а. Правда для этого надо будет еще дописать пару строк для стирания флеши, копирования кода в озу и выполнить его там.
Следущие переменные это просто задефайненые области памяти, например
uartrx equ $0100
Код:
uartrx
findflag
rxofset
rxaddrh
rxaddrl


для чтения нужно хостом отправить на микроконтроллер три байта 'R',H,L - где H старший адрес памяти, L - младший
для записи нужно отправить на камень уже 4 байта. 'W' или 0x57, H,L,D - где D - байт данных.
Например для записи в еепром по смещению 1 значения 0xFA я отправляю: 0x57, 0x40, 0x01, 0xFA. Если камень вернул инвертированное значение того байта что надо было записать, значит всё норм. Тоесть для 0xFA камень должен вернуть 0x05
Я использую один провод для приема/передачи, поэтому отключаю приемник во время передачи.

Код:
;-------------------------------------------------------------------------------
   interrupt Int17          ;   Tx complete
Int17.l
   bres UART1_SR, #6         ; Сброс флага прерывания
   bset   UART1_CR2,   #2   ;   Приемник включить
   iret
;-------------------------------------------------------------------------------
   interrupt Int18          ;   UART Receive register DATA FULL
Int18.l
   sim
   mov      uartrx,   UART1_DR
   bres   UART1_SR,   #5
   tnz      findflag            ;   команда принята - выполняем, нет - ищем
   jrne   doCmd
   
   ld   a,   uartrx
seek_write_cmnd
   cp   a,   #$57                  ;   W
   jrne   seek_read_cmnd
   bset   findflag,   #7
   jra      endreceive
seek_read_cmnd
   cp   a,   #$52                  ;   R
   jrne   endreceive
   bset   findflag,   #6
   jra      endreceive

doCmd
   btjt findflag,   #7,   write_proc
   call   read
   jra      endreceive
write_proc
   call   write
endreceive
   rim
   iret
;------------------------------------------------------------------------------
read                           ; отправляет один байт на хост R[ADDR]
   tnz      rxofset
   jreq   receive_first_rd_byte
second_rd_byte_received
   ld      a,   rxaddrh
   ld      xh,   a
   ld      a,   uartrx
   ld      xl,   a
   ld      a,   (x)
   bres           UART1_CR2,   #2   ;   Приемник выключить
   ld      UART1_DR, a
   clr      findflag
   clr    rxofset
   jra    end_rd_proc
receive_first_rd_byte
   mov      rxaddrh,   uartrx
   inc      rxofset
end_rd_proc
   ret
;------------------------------------------------------------------------------
write                              ; принимает и записывает байт W[ADDR],D
   ld      a,   rxofset
   cp      a,   #0
   jreq   receive_first_wr_byte
   cp      a,   #1
   jreq   receive_second_wr_byte
data_byte_received
   ld      a,   rxaddrh
   cp      a,   #$40
   jrne   store_byte
eeprom_unlock
   mov      FLASH_DUKR,   #$AE
   mov      FLASH_DUKR,   #$56
wait_for_unlock
   btjf   FLASH_IAPSR,   #3,   wait_for_unlock
store_byte
   ld      xh,      a
   ld      a,      rxaddrl
   ld      xl,      a
   ld      a,      uartrx
   ld      (x),   a
   ld      a,   (x)
   xor      a,      #$FF
   bres           UART1_CR2,   #2   ;   Приемник выключить
   ld      UART1_DR, a
   bres   FLASH_IAPSR,   #3
   clr      findflag
   clr    rxofset
   jra    end_wr_proc
receive_first_wr_byte
   mov      rxaddrh,   uartrx
   jra      wait_next_byte
receive_second_wr_byte
   mov      rxaddrl,   uartrx
wait_next_byte
   inc      rxofset
end_wr_proc
   ret
;------------------------------------------------------------------------------


Вложения:
Комментарий к файлу: терминальная прога и исходник делфи (я си незнаю) для связи с мк, у меня COM2. Умеет читать и писать диапазон памяти по одному проводу.
proj.7z [162.82 Кб]
Скачиваний: 54

_________________
vk.com/casusnur
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 20 май 2017, 19:18 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 616
Откуда: Челябинск
casus писал(а):
Всем добра. Хочу поделиться процедурами чтения и записи в чип по USART.
Всё больше мне начинает нравиться ассемблер, как-то делали с человеком оцифровку сигнала, у него код занял 30кб, у меня тот же функционал на асме занял 500 байт из которых 128 байт - вектора прерываний. В итоге он пишет на стороне хоста, а я на камнях. После компиляции занимает около 100 байт кода, и может быть использована для обновления прошивки через терминальную программу в режиме RunTime, что намного лучше встроенного bootloader'а. Правда для этого надо будет еще дописать пару строк для стирания флеши, копирования кода в озу и выполнить его там.
Следущие переменные это просто задефайненые области памяти, например
uartrx equ $0100
Код:
uartrx
findflag
rxofset
rxaddrh
rxaddrl


для чтения нужно хостом отправить на микроконтроллер три байта 'R',H,L - где H старший адрес памяти, L - младший
для записи нужно отправить на камень уже 4 байта. 'W' или 0x57, H,L,D - где D - байт данных.
Например для записи в еепром по смещению 1 значения 0xFA я отправляю: 0x57, 0x40, 0x01, 0xFA. Если камень вернул инвертированное значение того байта что надо было записать, значит всё норм. Тоесть для 0xFA камень должен вернуть 0x05
Я использую один провод для приема/передачи, поэтому отключаю приемник во время передачи.
Show

Замечания (то, что бросилось сразу в глаза):
1.
Код:
   rim
   iret
Инструкция rim здесь абсолютно не нужна.
2.
Код:
   cp   a,   #$52                  ;   R
Постарайтесь не использовать магические числа
Код:
   cp   a,   #'R'      ; ???
3.
Код:
   ld      a,   rxofset
   cp      a,   #0
   jreq   receive_first_wr_byte
Инструкция
Код:
   cp      a,   #0
здесь лишняя, поскольку предыдущая инструкция ld устанавливает флаги Z и N
Код:
   ld      a,   rxofset
   jreq   receive_first_wr_byte
4.
Код:
   xor      a,      #$FF
Здесь проще сделать так
Код:
   cpl   a

5.
Цитата:
Следущие переменные это просто задефайненые области памяти, например
uartrx equ $0100
Переменные не следует "дефайнить", поскольку это чревато множеством ошибок. Обычно память для них резервируется с использованием соответствующих директив ассемблера. Например, в ассемблере от ST существует директива segment.
Код:
   my_RAM segment DATA at $0100
UARTrx   ds     1       ; UART Rx buffer
UARTtx   ds     1       ; UART Tx buffer


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 21 май 2017, 01:55 
Старожил

Зарегистрирован: 23 дек 2012, 16:46
Сообщения: 310
Откуда: Новый Уренгой
задоминировал

p.s. rim нужна, так как сразу после входа в прерывание я через sim запретил все прерывания, ибо нефиг мешать столь важной задаче вложенными и приоритетными прерываниями.
инструкция
Код:
cp      a,   #0
нужна чтобы при первом вызове подпрограммы записи байт сохранился в ячейке хранящей старший адрес байта который нужно переписать. Возможно вы и правы, влияние команд на флаги ядра я не помню, зато читабельно.
также кое чего нового узнал. просто директиву jreq-переход при равенстве, не могу предсказать без самого сравнения на равенство. оставил так ибо работает, всегда работает, без сбоев и всем устраивает.
xor на любом языке понятен, с другой стороны cpl на 1 байт меньше. не спорю, есть способы уменьшить код еще на десяток байт.
у меня возникло с ходу пара вопросов: чем segment лучше дефайнов? и зачем назначать адреса динамически если я вышеизложенными процедурами собираюсь вычитывать и писать строго определенные адреса памяти? я ими же осуществляю связь с мк. например вычитав конкретный адрес, я на 100% уверен что данные пренадлежат нужному мне параметру. в программе тоже ошибок нет, т.к. обращаюсь к дефайнам а не к адресу.
второй вопрос, как получить адрес конца сегмента кода? тоесть я хочу записать некоторую информацию после памяти программ, и мне нужен указатель на адрес. в коде понятно, перед interrupt ставлю метку и после нее всё пространство моё. а как быть с директивой segment?
Код:
;-------------------------------
rxmemh            equ $006E
rxmeml            equ   $006F
freqcntr         equ   $0070
ADCchan            equ   $0071
findflag         equ   $0072
rpmcalch         equ   $0073
rpmcalcl         equ   $0074
;------- eeprom -------
shifttable      equ $4000
revparam_a      equ   $4011   
revparam_c      equ   $4012
revparamv_a      equ   $4013
revparamv_c      equ   $4014
rpmparam_a      equ   $4015
rpmparam_c      equ   $4016
fspdparam_a      equ $4017
fspdparam_c      equ   $4018

_________________
vk.com/casusnur


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 21 май 2017, 10:38 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 616
Откуда: Челябинск
casus писал(а):
задоминировал

p.s. rim нужна, так как сразу после входа в прерывание я через sim запретил все прерывания, ибо нефиг мешать столь важной задаче вложенными и приоритетными прерываниями.

Еще раз прочитайте внимательней руководство по микроконтроллерам, раздел связанный с прерываниями. При прерываниях автоматически сохраняются в стеке все регистры процессора, в том числе и регистр состояния. При этом автоматически выполняется "инструкция" sim, запрещая тем самым другие прерывания с равным приоритетом. При выходе из прерывания по команде iret восстанавливается содержимое всех регистров из стека. Так что изменения любого из регистров в процедуре обработки прерывания игнорируются, всегда восстанавливается то содержимое регистра, которое он имел до входа в прерывание.
casus писал(а):
инструкция
Код:
cp      a,   #0
нужна чтобы при первом вызове подпрограммы записи байт сохранился в ячейке хранящей старший адрес байта который нужно переписать. Возможно вы и правы, влияние команд на флаги ядра я не помню, зато читабельно.
также кое чего нового узнал. просто директиву jreq-переход при равенстве, не могу предсказать без самого сравнения на равенство. оставил так ибо работает, всегда работает, без сбоев и всем устраивает.
xor на любом языке понятен, с другой стороны cpl на 1 байт меньше. не спорю, есть способы уменьшить код еще на десяток байт.
Еще раз: инструкции jreq/jrne выполняются в зависимости от значения флаага Z. Условие для выполнения первой инструкции - флаг Z установлен, для выполнения второй - флаг Z сброшен. Инструкция ld изменяет значения флагов Z и N точно также как и инструкция cp. Поэтому инструкция сравнения с нулем в данном случае лишняя. С другой стороны, на это случай существует инструкция tnz, которая короче первой и выполняется быстрее.
Вот если бы вы вместо магических чисел 0, 1, 2.... использовали их символические значения, то тогда все было бы логично. Например:
Код:
Init_state     equ 0     ; No byte was received
First_state    equ 1     ; Header byte was received
Scnd_state     equ 2    ; Info byte was received
.......
      ld     a, State           ; See in what state we are
      cp     a, #Init_state     ; Initial state?
      jreq   Process0           ; Yes, do its processing

      cp     a, #First_state    ; First state?
      jreq   Process1           ; Jump if yes

    ......
В этом случае изменение значений делается только в одном месте, при этом программа становится более читабельной.
casus писал(а):
у меня возникло с ходу пара вопросов: чем segment лучше дефайнов? и зачем назначать адреса динамически если я вышеизложенными процедурами собираюсь вычитывать и писать строго определенные адреса памяти? я ими же осуществляю связь с мк. например вычитав конкретный адрес, я на 100% уверен что данные пренадлежат нужному мне параметру. в программе тоже ошибок нет, т.к. обращаюсь к дефайнам а не к адресу.
Код:
;-------------------------------
rpmh               equ   $0000   
rpml               equ   $0001
txofset            equ $0060
rxofset            equ   $0061
rxaddrh            equ   $0062
rxaddrl            equ   $0063
txcount            equ $0064   ; количество байт в буфере передатчика
rxcount            equ   $0065   ;   количество байт в буфере приемника
delay               equ   $0066
rpmfreqh         equ   $0067
rpmfreql         equ   $0068
revfreqh         equ   $0069
revfreql         equ $006A
uartsr            equ   $006B

rxmemh            equ $006E
rxmeml            equ   $006F
freqcntr         equ   $0070
ADCchan            equ   $0071
findflag         equ   $0072
rpmcalch         equ   $0073
rpmcalcl         equ   $0074
;------- eeprom -------
shifttable      equ $4000
shiftscale      equ   $4010
revparam_a      equ   $4011   
revparam_c      equ   $4012
revparamv_a      equ   $4013
revparamv_c      equ   $4014
rpmparam_a      equ   $4015
rpmparam_c      equ   $4016
fspdparam_a      equ $4017
fspdparam_c      equ   $4018
dpdzmin            equ   $4019
dpdzmax            equ   $401a
hydtrrevh         equ $401b
hydtrrevl         equ $401c
hydtrfreq         equ   $401d
hydtrpwmmax      equ   $401e
hydtrtimeon      equ $401f
hydtrmode         equ $4020
hydtrblck         equ   $4021
hydtrdelay      equ $4022
solmodes         equ $4023
continioussol   equ $4028
uphiftsol         equ $4029
downshiftsol   equ $402a
locksol            equ $402b
pwm1onshift      equ   $4034
pwm1ctrl         equ   $4035
spddwnshftost   equ $4036

Ну, во-первых, в вашей программе непонятно где у вас объявлены просто константы, а где - адреса переменных. Во-вторых, вы распределяете память вручную, а это часто приводит к большому количество ошибок. Особенно в тех случаях, когда количество переменных достаточно велико и требуется некоторая модификация программы. Попробуйте модифицировать вашу программу при ручной разметке памяти в случае, например, изменеия размеров буферов приемника или передатчика. Сколько чисел и в скольки местах вам потребуется сделать измения?
В сучае использования механизма сегментации (сексционирования) памяти, при которой программа разбивается на ряд программных сегментов, вычисление адресов делается автоматически ассемблером/линкером и вероятность появления ошибок значительно снижается. К тому же модификация программ становится гораздо быстрее и проще. К примеру,
Код:
RX_SIZE      equ 65      ; UART Rx buffer size
TX_SIZE      equ 66      ; UART Tx buffer size

         segment    my_RAM   ; Start address of the segment is defined in other module
;
; UART buffers
;
; make it public
;
      public    TxBuffer, RxBuffer

TxBuffer:         ; Transmitter buffer
     ds       TX_SIZE
RxBuffer:         ; Receiver buffer
     ds       RX_SIZE
UARTstate:      ; Current UART state
    ds        1

         segment    my_CODE   ; Switch to program section
Здесь программисту требуется определить всего две константыи и вычислять ничего не нужно. С другой стороны, можно, например, изменить порядок следования переменных и к ошибке это не приведет, поскольку их адреса будут вычислены линкером на этапе сборки программы.
Чем еще удобно механизма сегментации? Например при объединении программных модулей написанных и на Си, и на ассемблере. Я, например, работу с периферией пишу на ассемблере, а все остальное - на Си. В компиляторе уже используются программные секции с определенными именами для различных областей памяти и мне самому вообще не нужно определять сегменты самому. А раз я ничего не делаю сам, то и моих ошибок программе нет. Не так ли?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 21 май 2017, 11:34 
Старожил

Зарегистрирован: 23 дек 2012, 16:46
Сообщения: 310
Откуда: Новый Уренгой
Почти согласен. Но вот например случилось так что нужен счетчик 3 разрядный, динамическое распределение памяти почти уверен что накосячит. например
Код:
CntrA equ $000A
...
CntrC equ $000C

count_proc
ldw x, CntrC
incw x
ldw CntrC, x
...
ldw x, CntrB
incw x
ldw CntrB, x
...
ldw x, CntrA
incw x
ldw CntrA, x
т.к. все дефайны обязаны располагаться в стогом порядке. т.к. старший разряд одного слова, является младшим разрядом другого.
p.s. константы пишу так #define UARTBUFSIZE 128

_________________
vk.com/casusnur


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 21 май 2017, 15:39 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 616
Откуда: Челябинск
casus писал(а):
Почти согласен. Но вот например случилось так что нужен счетчик 3 разрядный, динамическое распределение памяти почти уверен что накосячит. например
Код:
CntrA equ $000A
...
CntrC equ $000C

count_proc
ldw x, CntrC
incw x
ldw CntrC, x
...
ldw x, CntrB
incw x
ldw CntrB, x
...
ldw x, CntrA
incw x
ldw CntrA, x
т.к. все дефайны обязаны располагаться в стогом порядке. т.к. старший разряд одного слова, является младшим разрядом другого.
p.s. константы пишу так #define UARTBUFSIZE 128

Тоже проблем нет. Можно, например, сделать так
Код:
CntrC:    ds   2
CntrB:    ds   2
CntrA:    ds   2
Кстати из вашего примера не видно, что переменные связаны между собой, поэтому их можно располагать в производльном порядке. С другой стороны в некоторых ассемблерах (например, от IAR) имеются директивы для резервирования данных разной рарядности:
Цитата:
DS8 Allocates space for 8-bit integers.
DS16 Allocates space for 16-bit integers.
DS24 Allocates space for 24-bit integers.
DS32 Allocates space for 32-bit integers.
DS64 Allocates space for 64-bit integers.

PS: Адреса памяти будут определятся порядком объявлени переменных, т.е. переменные объявленне в программе первыми будут иметь меньшие адреса. Поэтому, если в моем примере CntrC будет иметь адрес 100, то у переменных CntrB и CntrA адреса будут 102 и 104 соответственно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 23 май 2017, 01:21 
Старожил

Зарегистрирован: 23 дек 2012, 16:46
Сообщения: 310
Откуда: Новый Уренгой
Цитата:
Кстати из вашего примера не видно, что переменные связаны между собой, поэтому их можно располагать в производльном порядке

Код:
CntrA equ $000A
...
CntrC equ $000C

count_proc
ldw x, CntrC
incw x
ldw CntrC, x
...
ldw x, CntrB
incw x
ldw CntrB, x
...
ldw x, CntrA
incw x
ldw CntrA, x


СntrC находится по адресу 0C, директива LDW X, грузит $0C в XH и $0D в XL
далее CntrB находится по адресу 0B (поленился задефайнить), и соответственно в X загрузится содержимое адресов 0B и 0C,
так вот старший разряд CntrC тоесть $0C пересекается с младшим CntrB который тоже 0C, и т.д.
тоесть при переполнении младшего разряда CntrC перенос идет в старший разряд, который является младшим разрядом CntrB.
Благодаря чему можно в пару строк выполнять операции с многоразрядными числами на восьмибитном мк. Поэтому пересечение здесь необходимо.

_________________
vk.com/casusnur


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 23 май 2017, 07:32 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 616
Откуда: Челябинск
casus писал(а):
Цитата:
Кстати из вашего примера не видно, что переменные связаны между собой, поэтому их можно располагать в производльном порядке

Код:
CntrA equ $000A
...
CntrC equ $000C

count_proc
ldw x, CntrC
incw x
ldw CntrC, x
...
ldw x, CntrB
incw x
ldw CntrB, x
...
ldw x, CntrA
incw x
ldw CntrA, x


СntrC находится по адресу 0C, директива LDW X, грузит $0C в XH и $0D в XL
далее CntrB находится по адресу 0B (поленился задефайнить), и соответственно в X загрузится содержимое адресов 0B и 0C,
так вот старший разряд CntrC тоесть $0C пересекается с младшим CntrB который тоже 0C, и т.д.
тоесть при переполнении младшего разряда CntrC перенос идет в старший разряд, который является младшим разрядом CntrB.
Благодаря чему можно в пару строк выполнять операции с многоразрядными числами на восьмибитном мк. Поэтому пересечение здесь необходимо.
Прошу прощения сразу не понял. Но только речь, видимо, идет не о разрядах, а о байтах. То есть требуется обработка 24-разрядных чисел?
Кстати, в вашем случае достаточно определить только один адрес для младшего байта - CntrС. К остальным байтам можно обращаться по смещению. Например:
Код:
CntrC equ $000C

count_proc
ldw x, CntrC
incw x
ldw CntrC, x
...
ldw x, CntrС-1
incw x
ldw CntrС-1, x
...
ldw x, CntrС-2
incw x
ldw CntrС-2, x
Я думаю, так было бы наглядней. Но, опять же, в любом случае, у вас явно не видно сколько памяти необходимо выделять. Программисту все время нужно об этом помнить. А это - возможные ошибки.
Если же использовать директивы ассемблера для резервирования памяти, то таких ошибок не будет. Например, в IAR можно сделать так:
Код:
     rseg      DATA
Cntr:      ds8    3       ; 3-byte counter
или так
Код:
     rseg      DATA
Cntr:      ds24    1       ; 3-byte counter
И здесь имеется еще один плюс. Обычно для линкера создается скриптовый файл, где описываются имена секций, их размеры и начальные адреса. Это делается только один раз и далее программисту уже не нужно больше об этом думать. Различные части программы будут гарантированно располагаться в соответствующих областях памяти: SRAM, EEPROM, FLASH... Более того, линкер буде информировать программиста в случаях, когда объем данных превысит размеры отведенного для них сегмента. Такие вот дела.
PS: Мне понравился ваш прием обработки много байтовых чисел. Так что, возьму его себе на заметку. Спасибо!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 24 май 2017, 10:37 
Старожил
Аватара пользователя

Зарегистрирован: 13 май 2010, 01:32
Сообщения: 991
Откуда: Ижевск
как вставить opcode ?
хочу проверить несколько недокументированных команд,

_________________
Attiny13aПо20р.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 24 май 2017, 12:26 
Старожил

Зарегистрирован: 23 дек 2012, 16:46
Сообщения: 310
Откуда: Новый Уренгой
selevo писал(а):
как вставить opcode ?
хочу проверить несколько недокументированных команд,


должно быть так

tvoy_opcode byte $01, $42, $FF, $FF, $FF вобщем те байты что тебе надо

потом выполнить их jp #tvoy_opcode (неуверен насчет решетки, вроде нужна)

Bill писал(а):
При прерываниях автоматически сохраняются в стеке все регистры процессора, в том числе и регистр состояния

Вопрос: нафига козе баян: операторы pop, popw и push, pushw? Какое их практическое применение, если всё автоматизированно?

_________________
vk.com/casusnur


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 89 ]  На страницу Пред.  1, 2, 3, 4  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB