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

 
 
> 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   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   Цитата(Genadi Zawidowski @ Dec 9 2011, 23...   Dec 12 2011, 08:20
- - 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


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


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