Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы
Непрочитано 18.11.2017, 12:33  
alxchep
Почётный гражданин KAZUS.RU
 
Аватар для alxchep
 
Регистрация: 29.01.2007
Адрес: Пермский край
Сообщений: 1,577
Сказал спасибо: 415
Сказали Спасибо 1,340 раз(а) в 505 сообщении(ях)
alxchep на пути к лучшему
По умолчанию Mega48/88 загрузка регистра tmr1 данными из таблицы

Здравствуйте, уважаемые!
Ткните носом, как правильно на AVRASMe, а главное, красиво выбрать из таблицы данные для загрузки OCR1A. Есть регистр (допустим r16), в котором значение меняется инкрементом-декрементом в пределах 1-31, в соответствии с этим числом надо выбрать значение для загрузки в таймер.
На ум приходит лишь организация таблицы в виде данных .db , для выбора нужного значения сделать (r16-1) штук холостых чтений таблицы, последнее забрать. Как-то не кошерно.
Может есть у кого-нить правильное решение? Буду признателен кусочку кода. Если есть решение на Си, пжлст, черкните, как оно выглядит и приложите его .hex, интересно, что делает компилятор из такого кода.

Спасибо.
Реклама:

Последний раз редактировалось alxchep; 19.11.2017 в 19:08.
alxchep вне форума  
Непрочитано 18.11.2017, 12:43  
ForcePoint
Почётный гражданин KAZUS.RU
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,797
Сказал спасибо: 2,913
Сказали Спасибо 3,120 раз(а) в 2,111 сообщении(ях)
ForcePoint на пути к лучшему
По умолчанию Re: Mega48/88 зарядка регистра tmr1 данными из таблицы

Сообщение от alxchep Посмотреть сообщение
Есть регистр (допустим r16)
Заменить R16 на индексный регистр, например - Y (R29:R28 ), и использовать команду косвенной адресации LD [dest],Y.
__________________
Экзорцист 40-го уровня.
ForcePoint вне форума  
Непрочитано 18.11.2017, 13:45  
alxchep
Почётный гражданин KAZUS.RU
 
Аватар для alxchep
 
Регистрация: 29.01.2007
Адрес: Пермский край
Сообщений: 1,577
Сказал спасибо: 415
Сказали Спасибо 1,340 раз(а) в 505 сообщении(ях)
alxchep на пути к лучшему
По умолчанию Re: Mega48/88 зарядка регистра tmr1 данными из таблицы

Т.е. держать число в r28, инкремент (и декремент) делать по 2 раза (в памяти числа будут 16-ти разрядные), в r29 держать смещение адреса, а затем
Цитата:
LD r16, Y+
LD r17, Y ; загрузка табличного значения
CLR r27
LDI r26, OCR1AH ; загрузка в пару адреса OCR1AH
ST X, r16
ST -X, r17 ; загрузка регистра OCR1A
Изящно, жаль регистровых пар мало. Попробую.
Спасибо.
alxchep вне форума  
Непрочитано 18.11.2017, 15:40  
ForcePoint
Почётный гражданин KAZUS.RU
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,797
Сказал спасибо: 2,913
Сказали Спасибо 3,120 раз(а) в 2,111 сообщении(ях)
ForcePoint на пути к лучшему
По умолчанию Re: Mega48/88 зарядка регистра tmr1 данными из таблицы

Да, примерно так.
__________________
Экзорцист 40-го уровня.
ForcePoint вне форума  
Непрочитано 19.11.2017, 04:08  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,246
Сказал спасибо: 11,165
Сказали Спасибо 3,854 раз(а) в 2,925 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: Mega48/88 зарядка регистра tmr1 данными из таблицы

alxchep, а в названии темы нужно или самостоятельно (раздел о форуме с инструкцией), или с помощью модераторов поправить зарядка на загрузка .
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
mike-y-k вне форума  
Сказали "Спасибо" mike-y-k
alxchep (19.11.2017)
Непрочитано 20.11.2017, 11:44  
МВА
Гражданин KAZUS.RU
 
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
МВА на пути к лучшему
По умолчанию Re: Mega48/88 зарядка регистра tmr1 данными из таблицы

Сообщение от ForcePoint Посмотреть сообщение
Заменить R16 на индексный регистр, например - Y (R29:R28 ), и использовать команду косвенной адресации LD [dest],Y.
Если
Цитата:
На ум приходит лишь организация таблицы в виде данных .db
Тогда эта таблица находится во flash а не в sram, и тогда данные не заберешь через команду LD.
Когда я делал генератор синуса - я загонял во флэш через .db эту таблицу, а потом загружал в Z адрес таблицы (предварительно умноженный на 2) и в прерывании доставал данные с пос-инкрементом через команду lpm в любой промежуточный регистр из которого легко загрузить OCR.
Если же надо загрузить любое значение смещения, в вашем случае количество байт указанное в регистре r16 прибавляете это значение, умноженное на 2 (если данные двухбайтовые) к адресу Вашей таблицы и через команду lpm достаете в какой-нибудь регистр, а потом в OCR.
Если не изменяет память, давно не писал на асме, я делал это примерно так.
PHP код:
  .CSEG
FA
:    .db 0,127,220,255,220,127
........................
......................
start:
................
...
ldi  ZLlow(FA*2)
ldi  ZHhigh(FA*2)

loop:
lpm r14Z+
out ocr0r14
//дальше проверка конечного адреса и если достигли конца загружаем вновь. 
//Если не достигли конца таблицы на метку loop.
..........................
//Вариант 2
//Если нужно смещение не по порядку, а выбранное смещение в R16 - прибавляем его к адресу.
ldi  ZLlow(FA*2)
ldi  ZHhigh(FA*2)

clr r15
add ZL
r16
adс ZH
r15

lpm r17
Z
out OCR0
r17 

Если делать через комаду LD, то делаем все тоже самое, но тогда таблица должна находится в .DSEG и адрес умножать не надо.

PS. Заметил, что Вам данные нужны двухбайтовые. Для двухбайтовых данных делаем все тоже, только смещение из R16 тоже умножаем на 2. Ну и достаем по два раза в два регистра с пос инкрементом адреса так же, как это делали Вы в Вашем примере.

Последний раз редактировалось МВА; 20.11.2017 в 18:33.
МВА вне форума  
Сказали "Спасибо" МВА
alxchep (02.12.2017)
Непрочитано 02.12.2017, 23:28  
alxchep
Почётный гражданин KAZUS.RU
 
Аватар для alxchep
 
Регистрация: 29.01.2007
Адрес: Пермский край
Сообщений: 1,577
Сказал спасибо: 415
Сказали Спасибо 1,340 раз(а) в 505 сообщении(ях)
alxchep на пути к лучшему
По умолчанию Re: Mega48/88 зарядка регистра tmr1 данными из таблицы

Ну, да. с командами маленько напутал, главное - понял идею. Долго сидел на Пиках, решил вспомнить АВР, отвечал по памяти, немного путаюсь. Сейчас код вылизываю в Протеусе, эта часть работает.
alxchep вне форума  
Непрочитано 06.12.2017, 12:34  
Insector
Частый гость
 
Регистрация: 24.11.2006
Сообщений: 27
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
Insector на пути к лучшему
По умолчанию Re: Mega48/88 зарядка регистра tmr1 данными из таблицы

Код:
.cseg
Table:
.dw 0x0001, 0x1002, 0x2030, 0x3040, 0x5000, 0x7010, 0xAA20, 0x5530

   // В CNT индекс

   clr      ZH
   mov      ZL, CNT
   lsl      ZL
   subi   ZL, LOW(-(Table*2))
   sbci   ZH, HIGH(-(Table*2))
   lpm    r16, Z+
   out OCR1AH, r16
   lpm    r16, Z
   out OCR1AL, r16
Порядок точно не помню, при dw старшая или младшая часть слова считывается, если что, поменяете местами строчки lpm r16, Z
Insector вне форума  
 

Закладки
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ускорить компьютер 7Fantomas7 Ремонт оргтехники 111 08.08.2018 05:27


Часовой пояс GMT +4, время: 05:35.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot