реклама на сайте
подробности

 
 
> Вычисление адреса таблицы, Не понятки
ILYAUL
сообщение Apr 29 2008, 18:02
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Всем привет!

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


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ReAl
сообщение Apr 29 2008, 18:57
Сообщение #2


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(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+
без никаких лишних подпрограмм.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 21:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.01383 секунд с 7
ELECTRONIX ©2004-2016