Страница 1 из 1

Проблемы с внутреннем ОЗУ в ATmega 128

Добавлено: Ср окт 08, 2008 16:56:51
Moyo
Здравствуйте!!! Проблемма такая, пытаюсь записать в ОЗУ константы и считать их после, при чтении, в регистр попадает другое число. Как выяснил, почемуто запись происходит в область ДРРВ - 160 байт, как я понимаю должно записываться в следующие 4 кБ.

Эти 160 байт ОЗУ преднозначено для служебных регистров, в AverStudio я наблюдаю там по разным адресам разные числа, это говорит о том что моя прога использует эту область и при чем очень хорошо, т.к. занято примерно процентов 70.

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

Пытался записать по адресу в те 4 кБ ни чего не получается, запись не происходит, состояние ячейки не меняется.

Какие адреса использовал для принудительного определения?

0x1100
0x1101
0x1102

Использовал прямую запись в память и так же чтение.
sts
lds

Для определения компелятором области памяти использовал

.dseg

adr1: byte 1 ;выделяемая ячейка 0x61
adr2: byte 1 ;выделяемая ячейка 0x62
adr3: byte 1 ;выделяемая ячейка 0x63 ячейка уже была занята
adr4: byte 1 ;выделяемая ячейка 0x64

Добавлено: Чт окт 09, 2008 08:07:56
Moyo
Я разобрался!!!! Надо было всего лиш указать начало сегмента данных. Так как ОЗУ 4 кБ в ATmega128 распологается с 0x0100 до 0x10FF надо было написать:

.dseg ;програмный сегмент
.org 0x0100 ;начало програмного сегмента с адреса 0x0100

ind: bayte 1 ;выделить 1 байт для ind

А я писал:

.dseg ;програмный сегмент

ind: bayte 1 ;выделить 1 байт для ind


В AverStudio ОЗУ прописана как Data, в ней из начальна мусор всякий записан, а не программа использует, как я думал в начале.

Добавлено: Чт окт 09, 2008 08:09:42
Moyo
Спасибо за то что выслушали!!!! :)))

Добавлено: Чт окт 09, 2008 08:41:57
ARV
имхо, для МК с таким объемом памяти программ нерационально использовать ассемблер - используйте Си, который сам разберется со всей памятью.

Добавлено: Чт окт 09, 2008 17:26:53
NiTr0
ARV писал(а):имхо, для МК с таким объемом памяти программ нерационально использовать ассемблер - используйте Си, который сам разберется со всей памятью.
Все зависит от задачи... если нужна скорость - асму конкурентов нет.
Ну а память выделять директивами асма - на любителя ИМХО... проще принудительно указать ячейки под переменные, а не шаманить с .dseg
хотя для мелких проектов хватает и регистров, память нужна для больших объемов данных (массивов)...

Добавлено: Чт окт 09, 2008 17:36:52
ARV
NiTr0 писал(а):Ну а память выделять директивами асма - на любителя ИМХО... проще принудительно указать ячейки под переменные, а не шаманить с .dseg
я думаю иначе: явное указание ячеек не есть гуд, а названный вами "шаманством" подход - как раз верный

Добавлено: Чт окт 09, 2008 17:54:42
NiTr0
Ну какбэ высокоуровневый подход для низкоуровневого языка - ИМХО не совсем правильно. Задать константами жестко положение каждой ячейки - логичнее.

Добавлено: Чт окт 09, 2008 18:05:02
ARV
подход как раз правильный.
ассемблер AVR-ов в реализации Atmel и т.п. - довольно убогий язык, а нормальный ассемблер достаточно продвинутый язык. например, GCC ASM работает с перемещаемыми сегментами, и там фиксированные ячейки не прокатят так просто... лучше не привыкать делать неверно...

Добавлено: Чт окт 16, 2008 16:22:56
Moyo
Я в си ни чего не шарю, так пытался разобратся немного но пока нет того уровня чтобы писать даже простейшие проги, вот и юзаю пока asm. Изучать конечно надо, но времени пока нет, да и была бы обучалка такая же как для асма http://radiokot.ru/start/mcu_fpga/avr/
то си освоел бы в считаные дни. Другие источники пока сильно не торкают :)))

Добавлено: Чт окт 16, 2008 16:29:54
tych
Moyo писал(а):Я в си ни чего не шарю

Другие источники пока сильно не торкают :)))
Зайдите в мою домашнюю страничку - может "торкнет", многих торкает не по-детски, матерятся сильно.