AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
18.11.2017, 12:33
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.01.2007
Адрес: Пермский край
Сообщений: 1,577
Сказал спасибо: 415
Сказали Спасибо 1,340 раз(а) в 505 сообщении(ях)
|
Mega48/88 загрузка регистра tmr1 данными из таблицы
Здравствуйте, уважаемые!
Ткните носом, как правильно на AVRASMe, а главное, красиво выбрать из таблицы данные для загрузки OCR1A. Есть регистр (допустим r16), в котором значение меняется инкрементом-декрементом в пределах 1-31, в соответствии с этим числом надо выбрать значение для загрузки в таймер.
На ум приходит лишь организация таблицы в виде данных .db , для выбора нужного значения сделать (r16-1) штук холостых чтений таблицы, последнее забрать. Как-то не кошерно.
Может есть у кого-нить правильное решение? Буду признателен кусочку кода. Если есть решение на Си, пжлст, черкните, как оно выглядит и приложите его .hex, интересно, что делает компилятор из такого кода.
Спасибо.
Последний раз редактировалось alxchep; 19.11.2017 в 19:08.
|
|
|
|
18.11.2017, 12:43
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,797
Сказал спасибо: 2,913
Сказали Спасибо 3,120 раз(а) в 2,111 сообщении(ях)
|
Re: Mega48/88 зарядка регистра tmr1 данными из таблицы
Сообщение от alxchep
|
Есть регистр (допустим r16)
|
Заменить R16 на индексный регистр, например - Y (R29:R28 ), и использовать команду косвенной адресации LD [dest],Y.
__________________
Экзорцист 40-го уровня.
|
|
|
|
18.11.2017, 13:45
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.01.2007
Адрес: Пермский край
Сообщений: 1,577
Сказал спасибо: 415
Сказали Спасибо 1,340 раз(а) в 505 сообщении(ях)
|
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
|
Изящно, жаль регистровых пар мало. Попробую.
Спасибо.
|
|
|
|
18.11.2017, 15:40
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,797
Сказал спасибо: 2,913
Сказали Спасибо 3,120 раз(а) в 2,111 сообщении(ях)
|
Re: Mega48/88 зарядка регистра tmr1 данными из таблицы
Да, примерно так.
__________________
Экзорцист 40-го уровня.
|
|
|
|
19.11.2017, 04:08
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,246
Сказал спасибо: 11,165
Сказали Спасибо 3,854 раз(а) в 2,925 сообщении(ях)
|
Re: Mega48/88 зарядка регистра tmr1 данными из таблицы
alxchep, а в названии темы нужно или самостоятельно (раздел о форуме с инструкцией), или с помощью модераторов поправить зарядка на загрузка .
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
Сказали "Спасибо" mike-y-k
|
|
|
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 ZL, low(FA*2) ldi ZH, high(FA*2)
loop: lpm r14, Z+ out ocr0, r14 //дальше проверка конечного адреса и если достигли конца загружаем вновь. //Если не достигли конца таблицы на метку loop. .......................... //Вариант 2 //Если нужно смещение не по порядку, а выбранное смещение в R16 - прибавляем его к адресу. ldi ZL, low(FA*2) ldi ZH, high(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.
|
|
|
|
02.12.2017, 23:28
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.01.2007
Адрес: Пермский край
Сообщений: 1,577
Сказал спасибо: 415
Сказали Спасибо 1,340 раз(а) в 505 сообщении(ях)
|
Re: Mega48/88 зарядка регистра tmr1 данными из таблицы
Ну, да. с командами маленько напутал, главное - понял идею. Долго сидел на Пиках, решил вспомнить АВР, отвечал по памяти, немного путаюсь. Сейчас код вылизываю в Протеусе, эта часть работает.
|
|
|
|
06.12.2017, 12:34
|
|
Частый гость
Регистрация: 24.11.2006
Сообщений: 27
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
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
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Ускорить компьютер
|
7Fantomas7 |
Ремонт оргтехники |
111 |
08.08.2018 05:27 |
Часовой пояс GMT +4, время: 05:35.
|
|