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

 
 
 
Reply to this topicStart new topic
> константы в программной памяти AVR
barvap
сообщение Apr 17 2006, 11:58
Сообщение #1





Группа: Новичок
Сообщений: 3
Регистрация: 13-04-06
Пользователь №: 16 088



Имеется код для 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 ??
Go to the top of the page
 
+Quote Post
_Bill
сообщение Apr 18 2006, 08:37
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Обычно у ассемблера есть специальная директива для определения глобальных символов, типа public или globl:
#asm
public _Sernum
_Sernum: .DW 0x1234
#endasm
Но с данным ассемблером не знаком, поэтому Вам нужно посмотреть в документации какие директивы для этого в ассемблере имеются.
Go to the top of the page
 
+Quote Post
vet
сообщение Apr 18 2006, 09:04
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



_Bill
не пойдёт, CV транслирует код в один asm-файл.

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


Вот так:

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


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
barvap
сообщение Apr 19 2006, 06:18
Сообщение #4





Группа: Новичок
Сообщений: 3
Регистрация: 13-04-06
Пользователь №: 16 088



Метод

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

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

Буду пробовать через адрес функции обработки прерывания добраться до Sernum
Go to the top of the page
 
+Quote Post
vet
сообщение Apr 19 2006, 07:18
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Тогда использовать исходный вариант, а серийник считывать ассемблерной вставкой.
Пример:
Код
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+


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
barvap
сообщение Apr 19 2006, 08:18
Сообщение #6





Группа: Новичок
Сообщений: 3
Регистрация: 13-04-06
Пользователь №: 16 088



Цитата(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+

Ура все заработало и из ассемблера и через подрограмму обработки прерывания. !! Я сам ступил, давно не писал, забыл из байтов перейти к словам. Спасибо !
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 16th July 2025 - 10:56
Рейтинг@Mail.ru


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