0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
1

Перенос таблицы из FLASH в SRAM

13.02.2013, 22:46. Показов 15239. Ответов 33
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как перенести таблицу данных из Ftosh в SROM? Не могу понять, где ошибка.
В SROM записывается, но не то что надо! Вот кусок кода из моей программы.
Код
; Таблица в SROM куда ходу перенести данные
.dseg
phrase_1:            .byte 13
phrase_2:            .byte 12
phrase_3:            .byte 14
phrase_4:            .byte 13    ; всего 52 байта

; Программа
.cseg

fill_ROM:
ldi  ZH, high(Message)   ; загрузили в Z адрес начала таблицы в FLASH
ldi  ZL, low(Message)
ldi  XH, high(phrase_1)   ; загрузили в X адрес начала таблицы в SROM
ldi  XL, low(phrase_1)
ldi  r16, 52                   ; В счетчик количество байт
f1:
lpm  r17, Z+                 ; загружаю из FLASH с начала таблицы
st   X+, r17                  ; сохраняю в SROM с начала таблицы
dec  r16                      ; уменьшаю счетчик
brne f1                        ; как счетчик обнулился выхожу
ret

; Таблица во FLASH откуда хочу взять данные

Message:     .db  0x4F, 0xC1, 0xB8, 0xB2, 0xBA, 0x61, 0x20, 0x6F, 0xB2, 0xBC, 0x65, 0xBD, 0x61
Message1:   .db  0x48, 0x65, 0xB8, 0x63, 0xBE, 0x70, 0x61, 0xB3, 0xBD, 0x63, 0xBF, 0xC4
Message2:   .db  0x48, 0x65, 0xB8, 0x63, 0xBE, 0x70, 0x61, 0xB3, 0xBD, 0x63, 0xBF, 0xC4, 0x20, 0xE0
Message3:   .db  0x4F, 0xBF, 0xBA, 0xBB, 0xC6, 0xC0, 0x65, 0xBD, 0xB8, 0x65, 0x20, 0x4B, 0xA4
И еще, AVR Studyo выдает после компиляции 2 worning:
Код
C:\Assembler\Block_A\Block_A.asm(509): warning: .cseg .db misotygnment - padding zero byte
C:\Assembler\Block_A\Block_A.asm(512): warning: .cseg .db misotygnment - padding zero byte
Это в последней таблице. Что она от меня хочет?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.02.2013, 22:46
Ответы с готовыми решениями:

F030 - перенос таблицы векторов прерываний в SRAM
Решил запилить для F030 мелкий бутлоадер. В бутлоадере сделал переход на основное приложение, все...

Обмен данными между FLASH-памятью, SRAM и EEPROM
Написать программу которая будет содержать в FLESH памяти программ числа 12,34,45,23. Считать эти...

Часть программы в flash rom + часть в sram = непонятно
Есть прошивка для часов qualsom toq https://cloud.mail.ru/public/2KQJ/PwfTAsDYz Часы сделаны на...

Перенос проекта на C# в Adobe Flash
Добрый вечер, форум, хотел поинтересоваться, существует ли возможность перевести проект, написанный...

Flash Builder - перенос проекта из среды в другое место
1) На мой комп не встал Flash Builder - при запуске пишет failed to create the virtual java machine...

33
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
13.02.2013, 22:56 2
Код
ldi  ZH, high(Message*2)   ; загрузили в Z адрес начала таблицы в FLASH
ldi  ZL, low(Message*2)
Так правильно.
:\Assembler\Block_A\Block_A.asm(509): warning: .cseg .db misotygnment - padding zero byte
C:\Assembler\Block_A\Block_A.asm(512): warning: .cseg .db misotygnment - padding zero byte
Начхать. Но если напрягает добавьте до чётного 0x00 строках таблицы.

Вместо ret
rjmp PC
0
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 115
13.02.2013, 23:01 3
Ню, насколько я помню адресация в LPM байтовая, а загружена таблица с адресом слова. Умножь Ftosh-адрес на 2 .
0
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 115
13.02.2013, 23:03 4
Цитата Сообщение от wypuk
Код:
C:\Assembler\Block_A\Block_A.asm(509): warning: .cseg .db misotygnment - padding zero byte
C:\Assembler\Block_A\Block_A.asm(512): warning: .cseg .db misotygnment - padding zero byte
Это в последней таблице. Что она от меня хочет?
Она предупредила, что дополнила строки с нечетным числом байт лишним нулем в конце...
0
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
13.02.2013, 23:07 5
Цитата Сообщение от YTYOUT
Вместо ret
rjmp PC
Вот этого не понял. Я тут тока часть кода привел. Вызываю программу по RCALL, потому и ret.
команда rjmp PC - как я понимаю сама на себя будет прыгать
0
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
13.02.2013, 23:15 6
rjmp PC - как я понимаю сама на себя будет прыгать
Да.
Ну если rcall тогда да- ret
Она предупредила, что дополнила строки с нечетным числом байт лишним нулем в конце...
Ну так я и написал НАЧХАТЬ, если напрягает то... сделай это сам и ручками
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
14.02.2013, 00:11 7
Просто о стиле программирования на ассемблере.
rjmp PC - переход на текущий адрес, зацикливание. Все верно.
Но если знать, что ассемблер в качестве текущего адреса использует $, тоже самое можно написать как
rjmp $.
Раньше это помогало при использовании меток в макросах. Перед именем метки ставился $, и макрос можно было использовать многократно. Сейчас эти ограничения сняты.
0
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
14.02.2013, 01:38 8
Еще один вопрос, но уже по UART.
Если написать так, то данные передаются.
Код
 cbi  UCSRB, RXEN
sbi  UCSRB, TXEN
sbi  UCSRB, TXB8
sbi  PORTD, PD2
out  UDR, r17
sbi  UCSRB, UDRIE
а если так:
Код
 in    r16, UCSRB
cbr  r16, RXEN
sbr  r16, TXEN
sbr  r16, TXB8
out UCSRB, r16
sbi  PORTD, PD2
out  UDR, r17
sbi  UCSRB, UDRIE
то не работает! Просто для интереса.
Регистр UCSRB вроде как не отмечен в m32def.yms файле как "MEMORY MAPPED" и его можно использовать с командами in/out.
Или я ошибаюсь?
0
1 / 1 / 0
Регистрация: 28.01.2010
Сообщений: 537
14.02.2013, 01:46 9
cbr r16, RXEN
sbr r16, TXEN

В качестве параметра нужно подставлять битовую маску. А ты номера битов.
Команда CBR - oчистить биты в регистре
Описание:

Очистка определенных битов регистра Rd. Выполняется логическое AND между содержимым регистра Rd и комплементом постоянной K

Операция:

(i) Rd <-- Rd * ($FF - K)
Синтаксис Операнды: Счетчик программ:
(i) CBR Rd 16 < d < 31, 0 < K <255 PC <- PC + 1
Команда CBI - Очистить бит в регистре I/O
Описание:

Очистка определенного бита в регистре ввода/вывода. Команда работает c младшими 32 регистрами ввода/вывода - адреса с 0 по 31.

Операция:

(i) I/O(P,b)<-- 0
Синтаксис Операнды: Счетчик программ:
(i) CBI P,b 0 < P < 31, 0 < b < 7 PC <-- PC + 1
0
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 115
14.02.2013, 02:50 10
Цитата Сообщение от S_Otyx
cbr r16, RXEN
sbr r16, TXEN

В качестве параметра нужно подставлять битовую маску. А ты номера битов.
Т.е. надо примерно так:
cbr r16, (1<<RXEN)
sbr r16, (1<<TXEN)

Или еще конкретнее:
Код
 in    r16, UCSRB
cbr  r16, (1<<RXEN)
sbr  r16, (1<<TXEN)|(1<<TXB8)
out UCSRB, r16
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
14.02.2013, 03:02 11
Цитата Сообщение от OrtimKOD
Т.е. надо примерно так:
cbr r16, (1<<RXEN)
sbr r16, (1<<TXEN)
Вы только подготовили битовую маску в регистре r16. А уж как вы ее дальше примените...
Более наглядно такие операции делаются командами ORI и ANDI.


<Изображение удалено>
0
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 115
14.02.2013, 04:37 12
Цитата Сообщение от omokost
Цитата Сообщение от OrtimKOD
Т.е. надо примерно так:
cbr r16, (1<<RXEN)
sbr r16, (1<<TXEN)
Вы только подготовили битовую маску в регистре r16. А уж как вы ее дальше примените...
Более наглядно такие операции делаются командами ORI и ANDI.
Нет. Там именно сбросил биты в регистре по константной маске и установил биты в регистре по константной маске. По сути CBR это и есть ANDI - по крайней мере для процессора это одна команда которая в Асме имеет две записи. Т.е. две следующие строки имеют результатом абсолютно одинаковый код
cbr r16, (1<<RXEN)
ANDI r16, ~(1<<RXEN)

Аналогично с SBR и ORI, но еще проще - это вообще одна команда записаная двумя разными именами...

ЗЫ. Подготовить маску это LDI ...
0
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
14.02.2013, 08:46 13
Цитата Сообщение от OrtimKOD
Т.е. надо примерно так:
Код:
cbr r16, (1<<RXEN)
sbr r16, (1<<TXEN)

Или еще конкретнее:
Код
 in    r16, UCSRB
cbr  r16, (1<<RXEN)
sbr  r16, (1<<TXEN)|(1<<TXB8)
out UCSRB, r16
А так можно:?
Код
sbr  r16, (0<<RXEN)|(1<<TXEN)|(1<<TXB8)
0
0 / 0 / 0
Регистрация: 04.09.2012
Сообщений: 82
14.02.2013, 10:48 14
Цитата Сообщение от YTYOUT
Код:
ldi ZH, high(Message*2) ; загрузили в Z адрес начала таблицы в FLASH
ldi ZL, low(Message*2) Так правильно.
:\Assembler\Block_A\Block_A.asm(509): warning: .cseg .db misotygnment - padding zero byte
C:\Assembler\Block_A\Block_A.asm(512): warning: .cseg .db misotygnment - padding zero byte
Начхать. Но если напрягает добавьте до чётного 0x00 строках таблицы.

Это все верно, только начхать не получиться, дело в том, что в первой и четвертой строках по 13 байт объявлено (т.е. нечетное), соответственно компилятор добавит по одному байту в конец строк (это уже написано), но перенос производится только 52 байт, а их реально стало 54 (можно 53 переносить). И в памяти SROM под первое Message нужно выделять на один байт больше, соответственно метки в SROM сместятся.
0
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
14.02.2013, 11:12 15
Цитата Сообщение от domis
Это все верно, только начхать не получиться, дело в том, что в первой и четвертой строках по 13 байт объявлено (т.е. нечетное), соответственно компилятор добавит по одному байту в конец строк (это уже написано), но перенос производится только 52 байт, а их реально стало 54 (можно 53 переносить). И в памяти SROM под первое Message нужно выделять на один байт больше, соответственно метки в SROM сместятся.
Я это сразу заметил и уже учел! Получилось вот что:
Пишется теперь верно. Только эти 2 лишних байта жалко ;)))
; Таблица в SROM куда ходу перенести данные
.dseg
phrase_1: .byte 14
phrase_2: .byte 12
phrase_3: .byte 14
phrase_4: .byte 14 ; всего 54 байта

; Программа
.cseg

fill_ROM:
ldi ZH, high(Message*2) ; загрузили в Z адрес начала таблицы в FLASH
ldi ZL, low(Message*2)
ldi XH, high(phrase_1) ; загрузили в X адрес начала таблицы в SROM
ldi XL, low(phrase_1)
ldi r16, 54 ; В счетчик количество байт
f1:
lpm r17, Z+ ; загружаю из FLASH с начала таблицы
st X+, r17 ; сохраняю в SROM с начала таблицы
dec r16 ; уменьшаю счетчик
brne f1 ; как счетчик обнулился выхожу
ret

; Таблица во FLASH откуда хочу взять данные

Message: .db 0x4F, 0xC1, 0xB8, 0xB2, 0xBA, 0x61, 0x20, 0x6F, 0xB2, 0xBC, 0x65, 0xBD, 0x61, 0x00
Message1: .db 0x48, 0x65, 0xB8, 0x63, 0xBE, 0x70, 0x61, 0xB3, 0xBD, 0x63, 0xBF, 0xC4
Message2: .db 0x48, 0x65, 0xB8, 0x63, 0xBE, 0x70, 0x61, 0xB3, 0xBD, 0x63, 0xBF, 0xC4, 0x20, 0xE0
Message3: .db 0x4F, 0xBF, 0xBA, 0xBB, 0xC6, 0xC0, 0x65, 0xBD, 0xB8, 0x65, 0x20, 0x4B, 0xA4, 0x00
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
14.02.2013, 11:49 16
Цитата Сообщение от wypuk
А так можно:?Код:
sbr r16, (0<<RXEN)|(1<<TXEN)|(1<<TXB8)
Нельзя, если модернизировать байт, для установки и сброса битов можно использовать только отдельные команды.
А то что вы написали, это LDI - загрузка константы.
0
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
14.02.2013, 12:09 17
Это все верно, только начхать не получиться, дело в том, что в первой и четвертой строках по 13 байт объявлено (т.е. нечетное), соответственно компилятор добавит по одному байту в конец строк (это уже написано), но перенос производится только 52 байт, а их реально стало 54 (можно 53 переносить). И в памяти SROM под первое Message нужно выделять на один байт больше, соответственно метки в SROM сместятся.
Если он уберёт все лишние Message и подравняет все строки то добавится только один 0 в конец , который ему и нах не нужен. Всё равно всё переносит в SROM

Нельзя, если модернизировать байт, для установки и сброса битов можно использовать только отдельные команды.
А то что вы написали, это LDI - загрузка константы.
Так не понял . чего это Вы написали. C каких пор SBR == LDI?
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
14.02.2013, 13:06 18
Цитата Сообщение от YTYOUT
C каких пор SBR == LDI?
Ни с каких. Еще раз. То что ТС написал, с командой SBR сработает неправильно. Но если SBR заменить на LDI получите вменяемый код.
0
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
14.02.2013, 13:14 19
А ну да.
0
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 115
14.02.2013, 13:44 20
Цитата Сообщение от wypuk
Цитата Сообщение от OrtimKOD
Или еще конкретнее:
Код:
in r16, UCSRB
cbr r16, (1<<RXEN)
sbr r16, (1<<TXEN)|(1<<TXB8)
out UCSRB, r16

А так можно:?
Код
sbr  r16, (0<<RXEN)|(1<<TXEN)|(1<<TXB8)
Можно, то можно... Только такая команда выполнит совсем не то, что было выше. Эта команда устанавливает в регистре R16 биты которые установлены в маске как единица в единицу. Т.е. она установит в R16 биты TXEN и TXB8, а бит RXEN, как и остальные биты, оставит неизменными.

Т.е. изначально первая команда обнуляла бит RXEN не меняя остальных, а вторая команда устанавливала биты TXEN и TXB8 не меняя остальных.
0
14.02.2013, 13:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.02.2013, 13:44
Помогаю со студенческими работами здесь

Перенос Значений столбца одной таблицы, в столбцы другой таблицы
Доброго времени суток, товарищи подскажите правильность запроса к таблицам БД. В файле БД есть...

Перенос данных из одного листа одной таблицы в создаваемые листы другой таблицы
Доброго времени суток! Подскажите пожалуйста как написать макрос в Excel для переноса данных из...

Перенос двух ячеек из одной строки таблицы, в одну ячейку другой таблицы.
Можно ли каким-то образом перенести так как показано на рисунках. Нужно при нажатии на клавишу,...

Перенос двух ячеек из одной строки таблицы, в одну ячейку другой таблицы.
Я объясню по кароче. Если чек бокс = true то две ячеки надо занести и объединить в одну в другой...

Выборочный перенос данных из общей таблицы в таблицы по условиям
Добрый день спецы Excel. Прошу помочь мне в следующей задаче. Существует общая таблица на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru