ILYAUL 0 29 апреля, 2008 Опубликовано 29 апреля, 2008 · Жалоба Всем привет! Не могу понять толи ошибка в вычислении адреса таблицы ( выделенно) , толи версия 4.14 глючит , но данные в иммуляторе выдаются не верно. :05: HELP InitregDS: clr count ; очищаем счетчик количества данных mov YL,count ; вычисляем адрес данных в таблице ldi ZL,low(tablini*2) ldi ZH,high(tablini*2) call Addaddr ; К подпрограмме сложения MET1: lpm temp,Z+ ; извлекаем данные push temp ; сохраняем данные на случай NACK MET3: sts TWDR,temp ; пересылаем данные в DS1337 сall dataWR ; вызываем подпрограмму отсылки lds temp, TWSR ; проверям ACK andi temp,$F8 cpi temp,NORMDATW breq MET2 ; если есть ACK на МЕТ2 brne RET1 ; если NACK то повтор отсылки тех же данных MET2: inc count ; добавляем счётчик данных cpi count,$12 ; проверяем на последний байт данных brne MET1 ; если не достигнут конец таблицы - вычисление следующего адреса breq MET4 ; если достигнут формирование STOP RET1: pop temp ; если NACK извлекаем последниие rjmp MET3 ; данные табл. и отсылаем ещё раз MET4: call STOP STOP: rjmp STOP ………………………………… ;************************************************* ;* * ;* Подпрограмма вычисления адреса данных INIT * ;* * ;************************************************* Addaddr: push YH ; Coхраняем YH lsl YL ; Умножаем YL на 2 ldi YH,0 ; В YH - 0 add ZL,YL ; Складываем address adc ZH,YH pop YH ret ; ВозвратТаблица .eseg tablini: .db 00,00,00,$12,01,01,$08,00 .db 00,00,00,00,00,00,00,00 .db 00,00 ; Two control bytes Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 29 апреля, 2008 Опубликовано 29 апреля, 2008 · Жалоба Так пройди по шагам. Здесь же 5 мин работы. Зачем огород городить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 29 апреля, 2008 Опубликовано 29 апреля, 2008 · Жалоба Так пройди по шагам. Здесь же 5 мин работы. Зачем огород городить. Прошёл и не раз - не те данные и всё - похоже уже сам зациклился Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 29 апреля, 2008 Опубликовано 29 апреля, 2008 · Жалоба .eseg tablini: .db 00,00,00,$12,01,01,$08,00 .db 00,00,00,00,00,00,00,00 .db 00,00 ; Two control bytes Это AVRASM ? У него .eseg - это EEPROM ? А причём тогда lpm ? И зачем тогда на 2 адрес умножать? Ну а адрес в таблице лучше (быстрее и при этом не длиннее по коду) так вычислять: mov ZL,count clr ZH subi ZL,low(-tablini*2) sbci ZH,high(-tablini*2) lpm temp, Z+ без никаких лишних подпрограмм. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 30 апреля, 2008 Опубликовано 30 апреля, 2008 · Жалоба Это AVRASM ? У него .eseg - это EEPROM ? А причём тогда lpm ? И зачем тогда на 2 адрес умножать? Это ASM AVRStudio -У него .eseg - EEPROM Спасибо за код . Страно , что сложение на прямую не проходит , только через вычитание. Оформленно в подпрограмму т.к. в итоге будет не одна таблица. Если убрать .eseg , то всё вычисляется верно. Но я так понял , что если я хочу хранить данные в EEPROM - и забирать их оттуда, то не должен умножать на 2, и не использовать lpm- Где бы почитать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
biDE 0 30 апреля, 2008 Опубликовано 30 апреля, 2008 · Жалоба Где бы почитать? В даташите описано. Процессы чтения/записи во FLASH, SRAM и EEPROM отличаются кардинальным образом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 30 апреля, 2008 Опубликовано 30 апреля, 2008 · Жалоба В даташите описано. Процессы чтения/записи во FLASH, SRAM и EEPROM отличаются кардинальным образом. Да , почитал - освежил память. Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться