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

 
 
> Глюки программирования mega128, в WinAvr или МикроПаскале
Who_are_you?
сообщение Aug 9 2017, 07:15
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 185
Регистрация: 5-02-10
Из: Донецк
Пользователь №: 55 329



Программирую систему на ATmega128
и неважно на СИ или Паскале в WinAvr или МикроПаскале

Но возникает ситуация когда прошу, например,
подпрограмме вывести на LCD текст, а она вываливается (перезапускает main);
или не выполняются переходы при работе с прерываниями.

Я предполагал что это из-за стека, но нигде не видел в реальных программах даже обращений к стеку.
Мои эксперименты со стеком ничего не дали.
Как добиться логичности, чтобы переходы были такие, как написаны в программе, а не с глюками?
Не могут же разные компиляторы иметь похожие проблемы!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aiwa
сообщение Aug 17 2017, 22:24
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Пример использования
Код
char ER [] = "Error_RS422: ";

#pragma location = 0x000100
__flash char ER_FLASH [] = "Error_RS422: ";

#pragma location = 0x010100
__hugeflash char ER_HUGE [] = "Error_RS422: ";

void main(void)
{

for(int i=0;i<10;i++)
  ER[i]=ER_HUGE[i];
for(int i=0;i<10;i++)
  ER[i]=ER_FLASH[i];
  
}

И работа компилятора
CODE

//копируем из верхней половины, здесь трехбайтный адрес в старшем байте которого принимается во внимание только младший бит, который имеет посадочное место RAMPZ0.

// 16 ER[i]=ER_HUGE[i];
MOV R26, R25
LSL R26
SBC R26, R26
MOV R27, R26
LDI R30, LOW(ER_HUGE)
LDI R31, HIGH(ER_HUGE)
LDI R19, (ER_HUGE) >> 16
ADD R30, R24
ADC R31, R25
ADC R19, R26
OUT 0x3B, R19 !!!!!!!!! заносим в RAMPZ третий байт адреса для нижних адресов это 0x00, для верхних адресов - 0x01
ELPM R16, Z !!!!!!!!! доступ к памяти программ через "длинный" вариант - ELP, т.е. через [RAMPZ0]:Z
MOVW R31:R30, R25:R24
SUBI R30, LOW((-(ER) & 0xFFFF))
SBCI R31, (-(ER) & 0xFFFF) >> 8
ST Z, R16

копируем из нижней половины. здесь двухбайтный адрес.
// 16 ER[i]=ER_HUGE[i];
MOV R26, R25
LSL R26
SBC R26, R26
MOV R27, R26
LDI R30, LOW(ER_HUGE)
LDI R31, HIGH(ER_HUGE)
LDI R19, (ER_HUGE) >> 16
ADD R30, R24
ADC R31, R25
ADC R19, R26
OUT 0x3B, R19
ELPM R16, Z !!!!!!!!! доступ к памяти программ через "короткий" вариант - LPМ, т.е. через Z
MOVW R31:R30, R25:R24
SUBI R30, LOW((-(ER) & 0xFFFF))
SBCI R31, (-(ER) & 0xFFFF) >> 8
ST Z, R16



Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Aug 18 2017, 11:05
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Проблема в чём-то другом.
У вас ведь программа не состоит только из данных во флеше, а есть ещё и код программ.
avr-gcc (см скрипт линкера и map-файл) обычно размещает секцию с данными перед секцией кода.
Поэтому проблемы с заполнением памяти на 49% и 51% не следуют из вышеназванных предположений.

А на будущее рекомендую изучить файлик pgmspace.h
Цитата
a = pgm_read_byte_far(GET_FAR_ADDRESS(v));


Также есть смысл использовать более свежий тулчейн хотя бы avr-gcc-4.9.2 т.к. там появилась поддержка ключевого слова __flash (на подобии IAR).

https://sourceforge.net/projects/mobileches...%20%28Win32%29/


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Who_are_you?   Глюки программирования mega128   Aug 9 2017, 07:15
- - Непомнящий Евгений   Вы название темы правильно указывайте - "Глюк...   Aug 9 2017, 11:21
- - Who_are_you?   Непомнящий Евгений, спасибо за корректировку выраж...   Aug 9 2017, 15:35
|- - Непомнящий Евгений   Цитата(Who_are_you? @ Aug 9 2017, 18:35) ...   Aug 9 2017, 15:44
- - Who_are_you?   вотчдог - отключен программа большая, но была раб...   Aug 9 2017, 16:47
|- - Непомнящий Евгений   Цитата(Who_are_you? @ Aug 9 2017, 19:47) ...   Aug 10 2017, 05:07
- - aiwa   Вначале функции main прочитайте регистр MCUSR: в н...   Aug 9 2017, 17:31
- - aiwa   Проверьте на всякий случай фьюзы. Не установлен ли...   Aug 10 2017, 10:54
- - Who_are_you?   Я в чем не прав? Код#define BUFFER_SIZE 255 //...   Aug 11 2017, 09:29
|- - Непомнящий Евгений   Цитата(Who_are_you? @ Aug 11 2017, 12:29)...   Aug 11 2017, 09:59
- - Who_are_you?   Цитатану вообще говоря при чем тут стек? объявлени...   Aug 11 2017, 10:42
- - aiwa   Код cchh = (char)RxBuf[7]; ...   Aug 11 2017, 11:23
- - Who_are_you?   Почему в 1) случае выводится не всегда указанный т...   Aug 15 2017, 09:40
|- - KRS   Цитата(Who_are_you? @ Aug 15 2017, 12:40)...   Aug 15 2017, 15:04
- - aiwa   Зависит от компилятора, но обычно для первого случ...   Aug 15 2017, 11:02
- - aiwa   Цитата(KRS @ Aug 15 2017, 18:04) во 2 слу...   Aug 15 2017, 18:55
|- - Непомнящий Евгений   Цитата(aiwa @ Aug 15 2017, 21:55) При соо...   Aug 16 2017, 07:01
- - Who_are_you?   Похоже WinAVR в 1-ом случае и загоняет в стек - от...   Aug 16 2017, 12:16
- - aiwa   Цитата(Непомнящий Евгений @ Aug 16 2017, 10...   Aug 16 2017, 14:40
- - Who_are_you?   И как обойти это или в WinAVR не возможно? В конц...   Aug 17 2017, 08:50
- - aiwa   Цитата(Who_are_you? @ Aug 17 2017, 11:50)...   Aug 17 2017, 10:19
- - Who_are_you?   Из Даташит: Внутрисистемно программируемая флэш-п...   Aug 17 2017, 13:12
- - aiwa   Цитата(Who_are_you? @ Aug 17 2017, 16:12)...   Aug 17 2017, 21:24


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

 


RSS Текстовая версия Сейчас: 6th August 2025 - 12:40
Рейтинг@Mail.ru


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