AVR Assembler. Заметки

Короткие заметки по AVR Assembler.

Глухая заглушка без меток:
JMP PC

Данные во флэш и работа с ними.
В секторе .CSEG данные, например, строка, записываются в виде:
Метка: .db "TEXT"
Пример:
OK_MSG: .db "OK"
ERR_MSG: .db "ERROR",0
Примечание: для сообщения ошибки добавляется ",0" чтобы не возникало предупреждение "misalignment - padding zero byte", связанное с особенностями ассемблера AVR. Предупреждение возникает, когда количество байт нечетное, поэтому для "ОК" его нет, а в "ERROR" - 5 байт, поэтому добавляется нолик.
Далее для работы с этими данными надо получить их адрес:
LDI R20,low(2*OK_MSG) ; Берем младший байт
LDI R21,High(2*OK_MSG) ; Берем старший байт
Умножаем на 2, т.к. МК 8-битный, а флэш адресуется в словах 16-битных.
Для удобства в оперативке создаем переменную-указатель на эти данные:
.DSEG
OK_Ptr: .byte 2
И сохраняем адрес в эту переменную:
STS OK_Ptr,R20 ; Сохраняем Младший байт
STS OK_Ptr+1,R21 ; Сохраняем Старший байт
Теперь адрес хранится в переменной OK_Ptr.
Получение данных для дальнейшей работы:
LDS ZL,OK_Ptr ; Грузим указатели в индексные регистры
LDS ZH,OK_Ptr+1
LPM R16,Z+ ; Хватаем байт из флеша. Из нашей строки, инкрементируем указатель
STS OK_Ptr,ZL ; Сохраняем указатель 
STS OK_Ptr+1,ZH ; обратно, в память
; Действия с R16 (с данными из памяти)
Работаем с данными как хотим (они теперь в регистре R16). Вкратце: Загрузили в регистры адрес первого байта данных OK_MSG и записали его в указатель OK_Ptr, в указателе после этого хранится адрес данных. Затем в регистровую пару Z грузим этот адрес, командой LPM читаем в регистр данные из ячейки, адрес которой хранится в регистровой паре Z, и одновременно инкрементируем указатель, т.е. адрес, и записываем его обратно в переменную-указатель OK_Ptr, теперь в ней хранится адрес следующего байта, а в регистре R16 хранится байт данных, который можно обрабатывать как угодно.

Комментарии

Популярные сообщения из этого блога

STM32. Часть 4. Задержки, таймеры, системный таймер SysTick

AVR. Assembler. Алгоритмы.

STM32. Создание проекта в Keil.