Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: константы в программной памяти AVR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
barvap
Имеется код для Codevision AVR:

extern flash unsigned int Sernum;

void main (void){
unsigned int nomer;
nomer=Sernum;
}
.....
interrupt [23] void PP_ID(void){
#asm
_Sernum: .DW 0x1234
#endasm
}

при использовании Codevision AVR 1.24.4 все прекрасно работает, но при переходе на 1.24.7f
линкер выдает ошибку - Sernum не определен.
Как правильно описать Sernum ??
_Bill
Обычно у ассемблера есть специальная директива для определения глобальных символов, типа public или globl:
#asm
public _Sernum
_Sernum: .DW 0x1234
#endasm
Но с данным ассемблером не знаком, поэтому Вам нужно посмотреть в документации какие директивы для этого в ассемблере имеются.
vet
_Bill
не пойдёт, CV транслирует код в один asm-файл.

Цитата(barvap @ Apr 17 2006, 15:58) *
Как правильно описать Sernum ??


Вот так:

#asm(".cseg")
#asm(".org 0x1FFE")
flash unsigned int Sernum;
/*далее переменная из другого адр.пространства, чтобы компилятор перебил определение сегмента, и дальнейший код+константы ложились, куда положено*/
int something;
barvap
Метод

#asm(".cseg")
#asm(".org 0x1FFE")
flash unsigned int Sernum;

не подходит, поскольку блок данных должен размешаться после interrupt.
Просто это уже готовый проект и внешний программатор заносит в Sernum новые данные при программировании AVR.
Адрес Sernum определяется через адреса вектора прерывания, т.е. нельзя менять размещение Sernum.

Буду пробовать через адрес функции обработки прерывания добраться до Sernum
vet
Тогда использовать исходный вариант, а серийник считывать ассемблерной вставкой.
Пример:
Код
interrupt [23] void PP_ID(void){
#asm
_Sernum: .DW 0x1234
#endasm
}

#pragma warn-
unsigned int getSernum() {
#asm
ldi r30,low(_Sernum*2)
ldi r31,high(_Sernum*2)
lpm r26,Z+
lpm r31,Z
mov r30,r26
#endasm
}
#pragma warn+
barvap
Цитата(vet @ Apr 19 2006, 10:18) *
Тогда использовать исходный вариант, а серийник считывать ассемблерной вставкой.
Пример:
Код
interrupt [23] void PP_ID(void){
#asm
_Sernum: .DW 0x1234
#endasm
}

#pragma warn-
unsigned int getSernum() {
#asm
ldi r30,low(_Sernum*2)
ldi r31,high(_Sernum*2)
lpm r26,Z+
lpm r31,Z
mov r30,r26
#endasm
}
#pragma warn+

Ура все заработало и из ассемблера и через подрограмму обработки прерывания. !! Я сам ступил, давно не писал, забыл из байтов перейти к словам. Спасибо !
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.