Перейти к содержанию
    

Вычисление адреса таблицы

Всем привет!

 

Не могу понять толи ошибка в вычислении адреса таблицы ( выделенно) , толи версия 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так пройди по шагам. Здесь же 5 мин работы. Зачем огород городить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так пройди по шагам. Здесь же 5 мин работы. Зачем огород городить.

 

Прошёл и не раз - не те данные и всё - похоже уже сам зациклился

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

.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+

без никаких лишних подпрограмм.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это AVRASM ? У него .eseg - это EEPROM ?

А причём тогда lpm ? И зачем тогда на 2 адрес умножать?

 

Это ASM AVRStudio -У него .eseg - EEPROM

Спасибо за код . Страно , что сложение на прямую не проходит , только через вычитание.

Оформленно в подпрограмму т.к. в итоге будет не одна таблица.

Если убрать .eseg , то всё вычисляется верно.

Но я так понял , что если я хочу хранить данные в EEPROM - и забирать их оттуда, то не должен умножать на 2, и не использовать lpm- Где бы почитать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Где бы почитать?

 

В даташите описано. Процессы чтения/записи во FLASH, SRAM и EEPROM отличаются кардинальным образом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В даташите описано. Процессы чтения/записи во FLASH, SRAM и EEPROM отличаются кардинальным образом.

Да , почитал - освежил память. Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...