Видимо опять столкнулся с кривизной WinAVR

Пример: нужно читать данные из памяти программ, и задействовать из в программе. Чтобы небыло лишних вопросов привожу весь текст программы:
Код
#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;
}
}
}
#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
a6: 81 91 ld r24, Z+
a8: 91 91 ld r25, Z+
Cnt1=(uint8_t)temp;
aa: 80 93 62 00 sts 0x0062, r24
Читает неизвестно откуда , только не из программы!
Как прочитать данные из программы?