Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вычисление адреса таблицы
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
ILYAUL
Всем привет!

Не могу понять толи ошибка в вычислении адреса таблицы ( выделенно) , толи версия 4.14 глючит , но данные в иммуляторе выдаются не верно. 05.gif 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
SasaVitebsk
Так пройди по шагам. Здесь же 5 мин работы. Зачем огород городить.
ILYAUL
Цитата(SasaVitebsk @ Apr 29 2008, 22:10) *
Так пройди по шагам. Здесь же 5 мин работы. Зачем огород городить.


Прошёл и не раз - не те данные и всё - похоже уже сам зациклился
ReAl
Цитата(ILYAUL @ Apr 29 2008, 21:02) *
.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
Цитата(ReAl @ Apr 29 2008, 22:57) *
Это AVRASM ? У него .eseg - это EEPROM ?
А причём тогда lpm ? И зачем тогда на 2 адрес умножать?


Это ASM AVRStudio -У него .eseg - EEPROM
Спасибо за код . Страно , что сложение на прямую не проходит , только через вычитание.
Оформленно в подпрограмму т.к. в итоге будет не одна таблица.
Если убрать .eseg , то всё вычисляется верно.
Но я так понял , что если я хочу хранить данные в EEPROM - и забирать их оттуда, то не должен умножать на 2, и не использовать lpm- Где бы почитать?
biDE
Цитата(ILYAUL @ Apr 30 2008, 16:56) *
Где бы почитать?


В даташите описано. Процессы чтения/записи во FLASH, SRAM и EEPROM отличаются кардинальным образом.
ILYAUL
Цитата(biDE @ Apr 30 2008, 18:36) *
В даташите описано. Процессы чтения/записи во FLASH, SRAM и EEPROM отличаются кардинальным образом.

Да , почитал - освежил память. Спасибо!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.