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

 
 
> WinAVR: Как правильно размещать и работать с таблицами данных во Flash (памяти программ) ?, Не читает данные из Flash-памяти!
MaxiMuz
сообщение Dec 7 2011, 17:58
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658



Доброго времяни суток!
Видимо опять столкнулся с кривизной WinAVR sad.gif
Пример: нужно читать данные из памяти программ, и задействовать из в программе. Чтобы небыло лишних вопросов привожу весь текст программы:
Код
#include <avr/io.h>
#include <avr/interrupt.h>     // задает макросы sei() , cli()
#include <inttypes.h>
#include <avr/pgmspace.h>

uint8_t Cnt1;// фоновый счетчик длительности переключения свдиода
volatile int16_t *p;// указатель

volatile register struct
{
  uint8_t bOne : 1;
  uint8_t bTwo : 1;
  uint8_t bThree : 1;
  uint8_t bFour : 1;
} RF asm ("r17");

#define sbi(p,b) (p |= (1<<b)) //Установить бит

#define DIRB 0b00010001
#define PUPB 0b00000111
#define Led PB0    /* линия светодиода ("1" - вкл. ч/з резистор на общ.) */

//;----------------------------------------------------------------------------------------------------------------------------------------
//Определение констант:


#define Vl_DBKCnt 101
#define Vl_FLCnt 5


const uint8_t a[] PROGMEM={22,15,233,40,69,39,203,2,1};

//=====================================================================
ISR( TIM0_COMPA_vect)
{
    if (!(--Cnt1))
    {
     RF.bOne=0;
     sbi (PINB,Led);// ________ Переключение свдиода !
    }
}

//_______________ПОДПРОГРАММЫ_________________
void init (void)
{
PORTB=PUPB; //иницализация порта B
DDRB=DIRB; // задание направления для порта B
TIMSK0=(1<<OCIE0A); /* установка разр. прер-ия по совпадению т/сч.0 с регистром OCR0A */
OCR0A=234;    //загрузка регистра совпадения OCR0A коэф. деления
TCCR0A= (1<<WGM01);    //установка режима СТС - обнуление Т/С0 при совпадении с регистром OCR0A
TCCR0B=(1<<CS02)|(1<<CS00);    // <---- конфигурация и запуск сч-ка в реж. СТС с предделителем ckl/1024
RF.bOne=0;
Cnt1=100; //задание начальных значений для счетчиков

p=&a; // Установка указателя на начало таблицы a
}

//=============================================================================
int main (void)
{
//_________________________ ИНИЦИАЛИЗАЦИЯ _____________________________
uint16_t temp;

init();
sei ();// Разрешение общего прерывания
while (1)
    {
    if (RF.bOne==0)
        { RF.bOne=1;
            temp=*p;
            Cnt1=(uint8_t)temp;
            ++p;
        }
    }    
}

После использования команды PROGMEM в задании таблицы из программы удалилась секция где массив копировался в ОЗУ, что собственно и требовалось. Но обращение к таблице не поменялось.
Вопрос вызывает только место:
Код
temp=*p;
  a6:    81 91           ld    r24, Z+
  a8:    91 91           ld    r25, Z+
Cnt1=(uint8_t)temp;
  aa:    80 93 62 00     sts    0x0062, r24

Читает неизвестно откуда , только не из программы!
Как прочитать данные из программы?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Genadi Zawidowsk...
сообщение Dec 9 2011, 20:29
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



А это было вообще "шедевр"
Код
   //Cnt1=pgm_read_byte(&(a[p])); // варианте 2

Вы хоть немного читайте диагностику компилятора. А то на asm ("r17"); Вас хватило, а на адресную арифметику нет...

В приведённом тексте ++p будет через пропускать каждый второй элемент массива a.

Сообщение отредактировал Genadi Zawidowski - Dec 9 2011, 20:34
Go to the top of the page
 
+Quote Post
MaxiMuz
сообщение Dec 12 2011, 08:20
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658



Цитата(Genadi Zawidowski @ Dec 9 2011, 23:29) *
А это было вообще "шедевр"
Код
   //Cnt1=pgm_read_byte(&(a[p])); // варианте 2

Кстати, это тоже рабочий вариант и ни какой не шедевр! Если правильно задать массив , то работает, но байт информации в массиве пакуется в слово с 00h в ст.байте:
Код
uint8_t *a[] PROGMEM={22,15,233,40,69,39,203,2,1};
00000014 <a>:
  14: 16 00 0f 00 e9 00 28 00 45 00 27 00 cb 00 02 00     ......(.E.'.....
  24: 01 00  
uint16_t p;
p=0;
......
......
int main (void)
{
init();
  9c: ea df           rcall .-44    ; 0x72 <init>
sei ();
  9e: 78 94          sei
  a0: e0 91 60 00  lds r30, 0x0060
  a4: f0 91 61 00  lds r31, 0x0061
  a8: ee 0f           add r30, r30
  aa: ff 1f            adc r31, r31
  ac: ec 5e           subi r30, 0xEC; 236
  ae: ff 4f            sbci r31, 0xFF; 255
if (RF.bOne==0)
  b0: 10 fd           sbrc r17, 0
  b2: fe cf            rjmp .-4     ; 0xb0 <__stack+0x11>
  { RF.bOne=1;
  b4: 11 60           ori r17, 0x01; 1
   Cnt1=pgm_read_byte(&(a[p++]));
  b6: 84 91           lpm r24, Z+
  b8: 80 93 62 00   sts 0x0062, r24
  bc: 32 96           adiw r30, 0x02; 2
  be: f8 cf            rjmp .-16    ; 0xb0 <__stack+0x11>


Здесь я обнаружил неточную трансляцию команд, в месте :
Код
b6: 84 91           lpm r24, Z+

на самом деле заменяется командой lpm r24,Z !!! Что меня в начале смутило , так как инкремент судя по листингу происходит 3 раза.

Цитата(demiurg_spb @ Dec 12 2011, 10:56) *
Приведите строки вызова компилятора.

Код
> "make.exe" all

-------- begin --------
avr-gcc (WinAVR 20100110) 4.3.3
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Size before:
AVR Memory Usage
----------------
Device: attiny13a

Program:     196 bytes (19.1% Full)
(.text + .data + .bootloader)

Data:          3 bytes (4.7% Full)
(.data + .bss + .noinit)




Compiling C: table_Fsh.c
avr-gcc -c -mmcu=attiny13a -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./table_Fsh.lst  -std=gnu99 -MMD -MP -MF .dep/table_Fsh.o.d table_Fsh.c -o table_Fsh.o
table_Fsh.c:56: warning: initialization makes pointer from integer without a cast
table_Fsh.c:56: warning: initialization makes pointer from integer without a cast
table_Fsh.c:56: warning: initialization makes pointer from integer without a cast
table_Fsh.c:56: warning: initialization makes pointer from integer without a cast
table_Fsh.c:56: warning: initialization makes pointer from integer without a cast
table_Fsh.c:56: warning: initialization makes pointer from integer without a cast
table_Fsh.c:56: warning: initialization makes pointer from integer without a cast
table_Fsh.c:56: warning: initialization makes pointer from integer without a cast
table_Fsh.c:56: warning: initialization makes pointer from integer without a cast

Linking: table_Fsh.elf
avr-gcc -mmcu=attiny13a -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=table_Fsh.o  -std=gnu99 -MMD -MP -MF .dep/table_Fsh.elf.d table_Fsh.o --output table_Fsh.elf -Wl,-Map=table_Fsh.map,--cref,-gc-sections     -lm

Creating load file for Flash: table_Fsh.hex
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature table_Fsh.elf table_Fsh.hex

Creating load file for EEPROM: table_Fsh.eep
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \
--change-section-lma .eeprom=0 --no-change-warnings -O ihex table_Fsh.elf table_Fsh.eep || exit 0

Creating Extended Listing: table_Fsh.lss
avr-objdump -h -S -z table_Fsh.elf > table_Fsh.lss

Creating Symbol Table: table_Fsh.sym
avr-nm -n table_Fsh.elf > table_Fsh.sym

Size after:
AVR Memory Usage
----------------
Device: attiny13a

Program:     196 bytes (19.1% Full)
(.text + .data + .bootloader)

Data:          3 bytes (4.7% Full)
(.data + .bss + .noinit)



-------- end --------


> Process Exit Code: 0
> Time Taken: 00:04







Сообщение отредактировал MaxiMuz - Dec 12 2011, 08:15
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- MaxiMuz   WinAVR: Как правильно размещать и работать с таблицами данных во Flash (памяти программ) ?   Dec 7 2011, 17:58
- - Сергей Борщ   QUOTE (MaxiMuz @ Dec 7 2011, 19:58) Видим...   Dec 7 2011, 18:37
- - Палыч   Цитата(MaxiMuz @ Dec 7 2011, 21:58) Как п...   Dec 7 2011, 18:49
|- - Сергей Борщ   QUOTE (Палыч @ Dec 7 2011, 20:49) (PROGME...   Dec 8 2011, 06:57
- - Genadi Zawidowski   Может, поможет: Кодvoid uc1601s_put_str_P(con...   Dec 8 2011, 08:21
|- - MaxiMuz   Цитата(Genadi Zawidowski @ Dec 8 2011, 11...   Dec 8 2011, 11:36
|- - Сергей Борщ   QUOTE (MaxiMuz @ Dec 8 2011, 13:36) Ничег...   Dec 8 2011, 13:03
- - Genadi Zawidowski   А немного пофантазируем... Скорее всего, человек н...   Dec 8 2011, 18:23
- - MaxiMuz   Код#include <avr/io.h> #include <avr/i...   Dec 9 2011, 12:06
|- - Сергей Борщ   QUOTE (MaxiMuz @ Dec 9 2011, 14:06) вот т...   Dec 9 2011, 13:51
|- - MaxiMuz   Цитата(Сергей Борщ @ Dec 9 2011, 16:51) И...   Dec 12 2011, 07:09
|- - demiurg_spb   Цитата(MaxiMuz @ Dec 12 2011, 10:09) Я не...   Dec 12 2011, 07:56
- - MaxiMuz   _   Dec 9 2011, 12:07
- - MaxiMuz   Вообщем я понял, из за неприспосбленного и непроду...   Dec 12 2011, 10:20
|- - Сергей Борщ   QUOTE (MaxiMuz @ Dec 12 2011, 12:20) поче...   Dec 12 2011, 10:53
|- - MaxiMuz   Цитата(Сергей Борщ @ Dec 12 2011, 13:53) ...   Dec 12 2011, 11:48
- - Genadi Zawidowski   КстЦитатаати, это тоже рабочий вариант и ни какой ...   Dec 12 2011, 22:05
|- - MaxiMuz   Цитата(Genadi Zawidowski @ Dec 13 2011, 01...   Dec 13 2011, 11:05
|- - Сергей Борщ   QUOTE (MaxiMuz @ Dec 13 2011, 13:05) warn...   Dec 13 2011, 12:02
- - MaxiMuz   Заменил p=&a; на p=&a[0]; действительно ...   Dec 14 2011, 16:14
|- - AHTOXA   И кто будет после этого утверждать, что изучать ас...   Dec 14 2011, 19:29
- - MaxiMuz   Проблема решилась выносом p++ за "скобки...   Jan 20 2012, 17:24
- - ARV   какая проблема решилась? по-моему, что в скобках, ...   Jan 21 2012, 07:34
|- - demiurg_spb   Цитата(ARV @ Jan 21 2012, 10:34) по-моему...   Jan 23 2012, 05:07
|- - MaxiMuz   Цитата(ARV @ Jan 21 2012, 10:34) какая пр...   Jan 23 2012, 07:39
- - AHTOXA   Цитата(ARV @ Jan 21 2012, 13:34) какая пр...   Jan 23 2012, 05:37


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

 


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


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