Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Считать из flash-памяти PIC. Срочно!
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Andrеys
т.к. памяти стало не хватать(держал много массивов с байтами) придется хранить их где-то в памяти и обращаться поадресно, на 1 адрес 6 байт, возможно ли такое на PIC?
модель PIC16F877. Как это осуществляется?
нашел в файле inpic.h вот это:


#ifdef __FLASH__
__intrinsic int __flash_read_int( unsigned short address );
__intrinsic void __flash_write_int( unsigned short address, int value );
__intrinsic char __flash_read_low_char( unsigned short address );
__intrinsic char __flash_read_high_char( unsigned short address );
#endif

очень похоже на то что мне надо(или я ошибаюсь?)
если да, то как это использовать?
ncux
Цитата
придется хранить их где-то в памяти

А массивы не в памяти были?
Цитата
и обращаться поадресно

По любому...
Объясните подробнее, что Вам нужно
Andrеys
да, я был некорректен.
держать в памяти я имел ввиду во flash памяти программ,
массивы мои все такого вида
int massO[6]={0x00, 0x3e, 0x41, 0x41, 0x41, 0x3e};
...

при компиляции пишет следующее:
Error[e104]: Failed to fit all segments into specified ranges. Problem discovered in segment HCODE. Unable to place 1 block(s) (0x72b6 byte(s) total) in 0x3cc2 byte(s) of memory. The problem occurred while processing the segment placement command "-P(CODE)HCODE=0-3FFF", where at the moment of placement the available memory ranges were "CODE:12-13,CODE:340-3fff"

Значит память закончилась,
я хочу чтобы каждый массив был доступен по одному адресу из flash,
и доставать бай за байтом,
мой вопрос это как это реализовать?
или есть другой путь?
Baser
Цитата(Andrеys @ Dec 21 2007, 21:27) *
очень похоже на то что мне надо(или я ошибаюсь?)

Вы бы, батенька, все таки объяснили понятно, что у вас не получается и в чем конкретно вопрос. А то боюсь вас никто так и не понял laughing.gif Предлагаете восстанавливать ход ваших мыслей по скупым деталям smile.gif
Цитата(Andrеys @ Dec 23 2007, 11:18) *
массивы мои все такого вида
int massO[6]={0x00, 0x3e, 0x41, 0x41, 0x41, 0x3e};
...

при компиляции пишет следующее:
Error[e104]: Failed to fit all segments into specified ranges. Problem discovered in segment HCODE. Unable to place 1 block(s) (0x72b6 byte(s) total) in 0x3cc2 byte(s) of memory. The problem occurred while processing the segment placement command "-P(CODE)HCODE=0-3FFF", where at the moment of placement the available memory ranges were "CODE:12-13,CODE:340-3fff"

То есть ваши массивы ранее были в оперативной памяти а теперь вы их хотите поместить во флэш?
Но судя по ошибке линкера у вас забита вся флеш. Более того не хватает около 6 Кслов флэша!
Это как, случилось в одночасье или наблюдалось уже давно?
Andrеys
это случилось когда невольно пришлось писать программу на пике, при этом с памятью никогда не встречался. Значит флеш не хватало, спасибо за это разъяснение.
а у вас есть предложение как это можно осуществить?:
хранить где-то эти массивы, чтобы память ни ОЗУ ни FLASH не заканчивалась,
и можно было байт за байтом из них извлекать.

вообще, в каждом массиве у меня лежит буква для графического дисплея, но возникла эта трудность
Baser
Цитата(Andrеys @ Dec 23 2007, 15:58) *
это случилось когда невольно пришлось писать программу на пике, при этом с памятью никогда не встречался.

Уважаю в людях чувство юмора! lol.gif

Цитата
а у вас есть предложение как это можно осуществить?:
хранить где-то эти массивы, чтобы память ни ОЗУ ни FLASH не заканчивалась,
и можно было байт за байтом из них извлекать.
вообще, в каждом массиве у меня лежит буква для графического дисплея, но возникла эта трудность

Если внутренней флэш памяти мало, а нужно хранить большие массивы констант (напр. фонты и тексты для LCD), тогда применяют внешнюю память. В зависимости от нужного объема можно применить EEPROM (до 128 кбайт) или DataFlash (мегабайты). Эти чипы подключают при помощи сериальных интерфейсов I2C (серия 24C02 - 24С1024), SPI (25Cxx, Atmel DataFlash AT45DBxxx).
При работе с ними придется сначала читать нужный массив из этой памяти в ОЗУ процессора, и только потом использовать по назначению.
Andrеys
ага. а у меня дело-то в том что это "злой препод" smile.gif мне подвесил в курсовой проект именно графический дисплей, хотя хватило бы символьного двухстрочного за глаза) и вывести мне надо буквально 1 экран, комбинации примерно из 20 символов включая точки, запятые и пр., ( в паре мест менять циферки, но это конроллер потянет без записи "куда-то в память") так что внешнюю память подключать я думаю смысла нет, а главное времени. значит выход - EEPROM самого контроллера? но там на 1 адрес весь массив не запишешь..
я так понял EEPROM на одном адресе хранит 1 байт, т.е. мне адреса все перебирать... так и они могут тоже не влезть если их в массив и перебирать..?
или может последовательно забить в EEPROM все, и говорить пику с такого-то по такой адрес бери, а здесь вот отсюда... надо попробовать.
Baser
Цитата(Andrеys @ Dec 23 2007, 18:33) *
значит выход - EEPROM самого контроллера? но там на 1 адрес весь массив не запишешь..
я так понял EEPROM на одном адресе хранит 1 байт, т.е. мне адреса все перебирать... так и они могут тоже не влезть если их в массив и перебирать..?
или может последовательно забить в EEPROM все, и говорить пику с такого-то по такой адрес бери, а здесь вот отсюда... надо попробовать.

Судя по всему вам надо сначала почитать что-нибудь по основам адресации памяти. А потом data sheet на PIC16F877, раздел 2.0 MEMORY ORGANIZATION.
PIC16 восьмиразрядный контроллер, и все три адресных пространства (Flash, SRAM, EEPROM) адресуются ПОБАЙТНО. Т.е. именно как вы говорите, "на одном адресе хранит 1 байт". И адреса всех байт внутри массивов вам придется перебирать, как вы не крутитесь smile.gif Другое дело, что это может быть для вас скрыто внутри Си.

Чесно говоря не пойму чем у вас занята вся флэш, если это просто курсовик. В 8 кслов можно кроме дисплея с одним экраном забить ещё хренову тучу всего biggrin.gif

Вот вам кое-что в качестве наводки:
объявление массива констант, находящихся во флэш:
Код
char __flash massO[]={0x00, 0x3e, 0x41, 0x41, 0x41, 0x3e};

то же для EEPROM:
Код
char __eeprom massO[]={0x00, 0x3e, 0x41, 0x41, 0x41, 0x3e};

процедура копирования массива из флэш во временный буфер в ОЗУ:
Код
unsigned char Temp_Buf[6];  // временный буфер
{ unsigned char i;
for (i=0; i<sizeof(Temp_Buf); i++) Temp_Buf[i] = massO[i];
}

p.s. Возможно в ИАРе для ПИКов с переменными в EEPROM и FLASH нужно работать через __intrinsic функции, точно не знаю, смотрите хелп. Для АВР это проходит.
Andrеys
Окей, я сделал так:
char flash_read(char address)
{
char b;
b = __flash_read_int( address );
return b;
}
фун-ия читает из флеш.

Но, я продолжил писать программу и вскоре вылетело вот это lol.gif
Error[e104]: Failed to fit all segments into specified ranges. Problem discovered in segment HCODE. Unable to place 1 block(s) (0x802a byte(s) total) in 0x3ee2 byte(s) of memory. The problem occurred while processing the segment placement command "-P(CODE)HCODE=0-3FFF", where at the moment of placement the available memory ranges were "CODE:12-13,CODE:120-3fff"

я что, исчерпал всю память?? это же смешно.
Подскажите, пожалуйста, что ее так заполняет если в нее можно много чего запихнуть?
ниже привожу текст всей программы, для наглядности:
#include <io16f877.h> //îïðåäåëåíèÿ ðåãèñòðîâ è àäðåñíîãî ïðîòñðàíñòâà
#include <inpic.h>
#include <file.h> //âñå #define è ïðî÷åå
#include <stdlib.h>
//------------Îáúÿâëåíèå ïåðìåííûõ åñëè íàäî, òî çäåñü


void main(void)
{
int i, rezultat, max=0x3FF;
float rez;
div_t rez2;
init_ports();
display_Init();
display_shablon();
for(;;)
{
//íàñòðîéêà ÀÖÏ
ADCON0 &= ~ ((1<<CHS0) | (1<<CHS1) | (1<<CHS0) | (1<<ADCS1)); //áóäåì ìåðÿòü íàïð. â ñåòè
ADCON0 = (1<<ADCS0) | (1<<ADON);
ADCON1 = (1<<ADFM) | (1<<PCFG1);
ADCON1 &= ~ ((1<<PCFG0) | (1<<PCFG2) | (1<<PCFG3));
ADCON0 = (1<<GO/-DONE); //íà÷àëî ïðåîáðàçîâàíèÿ ÀÖÏ

if (GO/-DONE==0) //åñëè ïðåîáð. çàêîí÷åíî, âçÿòü è îáðàáîòàòü ðåçóëüòàò
{
rezultat=ADRESH;
for ( i=0; i<8; i++)
{
rezultat <<= 1;
}
rezultat=rezultat+ADRESL; //òåïåðü ðåçóëüòàò ñîáðàí ïî ÷àñòÿì
//ïåðåñ÷åò â âîëüòû ñïîñîáîì ïðîïîðöèè
rezultat=5*rezultat;
rez=rezultat/max;
rez2 = div(rez, 10);


//в разработке..

}








}
}
//********************************************************************************
******
//
//*********************************** ÏÎÄÏÐÎÃÐÀÌÌÛ ***********************************
//
//********************************************************************************
******
void init_ports(void) //ÈÍÈÖÈÀËÈÇÀÖÈß ÏÎÐÒÎÂ ÂÂÎÄÀ/ÂÛÂÎÄÀ
{
TRISA = 0; //âñå íà âûõîä
TRISA |= (1<<iBut) | (1<<RA0) | (1<<RA1); //âõîä äëÿ iButton
TRISB = 0; //âñå íà âûõîä (ðåãèñòð îáùåíèÿ ñ LCD)
TRISC = 0; //âñå íà âûõîä
//T0IE=0;
STATUS |= (1<<RP0); //çàøëè â áàíê 0 (?????????????????)
TRISD = 0; //âñå íà âûõîä (ïîêà)
STATUS &= ~(1<<RP0); //âûøëè èç áàíêà 0 (?????????????????)
//INTCON = 3;
/ /INTCON = 1;
}



void display_Init(void)
{
int a;
PORTD |= (1 << E) | (1 << RW) | (1 << A0) | (1 << CS2) | (1 << CS1) | (1 << RES) | (1 << BACKLIGHT);
PORTD &= ~((1 << E) | (1 << RW) | (1 << A0) | (1 << CS2) | (1 << CS1) | (1 << RES) | (1 << BACKLIGHT));
PORTD |= (1 << CS1) | (1 << CS2); //âêëþ÷åíû òîëüêî êðèñòàëëû
PORTD &= ~(1 << RES); //RES â "0"
for (a=0; a<6; a++); //ïàóçà 1ìêñ (ò.ê. êâàðö 4ÌÃö çíà÷èò 4 öèêëà âûïîëíÿþòñÿ çà 1ìêñ)
PORTD |= (1 << RES); //RES â "1"
for (a=0; a<42; a++); //ïàóçà 10ìêñ (40öèêëîâ)
LCD_Clear(); //î÷èñòêà äèñïëåÿ
//äèñïëåé ãîòîâ ê ðàáîòå

//Write_Cmd_Display_ON();
//LCD_BackLight_ON_Cntr = 0;
//Start_Timer(LCD_BACKLIGHT_TIMER, 1, &LCD_BackLight_Timer_Proc, TIMER_CYCLE);
//return;
}




void LCD_Clear(void) //Î×ÈÑÒÊÀ ÝÊÐÀÍÀ LCD
{

int a, page, adres=0;
for(page = 0; page < 8; page++)
{
// óñòàíîâèì ñòðàíèöó (ê íîìåðó ñòðàíèöû äîáàâèì 0xb8 = 10111000 êîìàíäà Set_Page)
Write_Cmd_to_LCD(2, 0xb8 + (page)); //1 è 2 êðèñòàëë áóäóò âûáðàíû
//Âûñòàâèì àäðåñ âíóòðè ñòðàíèöû, ñ êîòîðîãî íà÷íåì çàïîëíåíèå
Write_Cmd_to_LCD(2, 0x40 + (adres));
for(a=0; a<63; a++) Write_Data_to_LCD(2, 0x00); //âûâåäåì íóëè 64 ðàçà â äëèíó âñåé ñòðàíèöû
}
}




void Wait_LCD_ready(void)
{
int c, status=0;
TRISB = 0xFF; //ïîðò B íà âõîä
PORTD |= (1<<RW); //óïðàâëÿþùèå
PORTD &= ~(1 << A0); //ñèãíàëû
while (status & (1 << 7)) //ïîêà 7 áèò BUSY íå ñòàíåò 0 âåðòèìñÿ è æäåì
{
PORTD |= (1 << E); //ñòðîá
for(c=0; c<32; c++); //8ìêñ
status = PORTB; //ñ÷èàòü çíà÷åíèå ñòàòóñà LCD
PORTD &= ~(1 << E); //ñòðîá
for(c=0; c<32; c++); //8ìêñ
}
TRISB = 0; //ïîðò Â íà âûõîä
}





void display_shablon(void)
{

int adress, adres=0, page=0;
char byte, n1, n2, n3; //çíà÷åíèå, âûâîäèìîå íà LCD
n1=0;
n2=0;
n3=0;
for (adress=0x0005; adress<0x0083; adress++) //ïåðåáèðàåì àäðåñíîå ïðîñòðàíñòâî (ïî ïîðÿäêó) ãäå ëåæàò ñèìâîëû â íóæíîé ïîñëåäîâàòåëüíîñòè äëÿ 1 êðèñòàëëà
{
byte = flash_read(adress); //ïðî÷èòàåì áàéò èç ïàìÿòè

//òåïåðü âûâåñòè byte
// óñòàíîâèì ñòðàíèöó (ê íîìåðó ñòðàíèöû äîáàâèì 0xb8 = 10111000 êîìàíäà Set_Page)
Write_Cmd_to_LCD(0, 0xb8 + (page)); //1 êðèñòàëë ñòðàíèöà 0
Write_Cmd_to_LCD(0, 0x40 + (adres)); //ñ 0 àäðåñà íà÷àòü çàïîëíåíèå ñòðàíèöû
Write_Data_to_LCD(0, byte); //âûâåñòè ñ÷èòàííûé èç ïàìÿòè áàéò íà ýêðàí
n1++; //óâåëè÷èâàåì ñ÷åò÷èê ñèìâîëà
n2++;
n3++;
if (n2==8) //åñëè çàïîëíèëè âñþ âòîðóþ ñòðàíèöó, ïåðåéäåì ê çàïîëíåíèþ
{
n2=200;
page=4;
adres=0;
}
if (n1==4) //åñëè âûâåëè óæå âñþ ïåðâóþ ñòðîêó, ïåðåéäåì íà òðåòüþ
{
n1=200;
page=2;
adres=0;
}
if (n3==7)
{
n2=200;
page=6;
adres=0;
}
}
page=2;
byte = flash_read(0x009B); //êîä äëÿ "-"
Write_Cmd_to_LCD(0, 0xb8 + (page));
Write_Cmd_to_LCD(0, 0x40 + (0));
Write_Data_to_LCD(0, byte);
//çàïîëíåíèå âòîðîé ÷àñòè ýêðàíà
adres=0x0029; //àäðåñ ìåñòà ïîä çàïÿòóþ
page=4;
byte = flash_read(0x0083); //çäåñü ëåæèò êîä äëÿ çàïÿòîé
Write_Cmd_to_LCD(1, 0xb8 + (page)); //2 êðèñòàëë ñòðàíèöà 4(ñòðîêà 3)
Write_Cmd_to_LCD(1, 0x40 + (adres)); //ñ 0 àäðåñà íà÷àòü çàïîëíåíèå ñòðàíèöû
Write_Data_to_LCD(1, byte); //âûâåñòè ñ÷èòàííûé èç ïàìÿòè áàéò íà ýêðàí
Write_Data_to_LCD(1, 0x00); //ïðîáåë
byte = flash_read(0x0089); //êîä äëÿ "Â"
Write_Data_to_LCD(1, byte);
page=6;
byte = flash_read(0x008F); //êîä äëÿ "Ë"
Write_Cmd_to_LCD(1, 0xb8 + (page)); //2 êðèñòàëë ñòðàíèöà 6(ñòðîêà 4)
Write_Cmd_to_LCD(1, 0x40 + (0x002b)); //ìåñòî äëÿ "Ë"
Write_Data_to_LCD(1, byte);
page=2;
byte = flash_read(0x0095); //êîä äëÿ "+"
Write_Cmd_to_LCD(1, 0xb8 + (page));
Write_Cmd_to_LCD(1, 0x40 + (0x002b));
Write_Data_to_LCD(1, byte);
}



void Write_Cmd_to_LCD (int c, int data)
{
Wait_LCD_ready(); // äîæäåìñÿ ãîòîâíîñòè êîíòðîëëåðà
PORTD &= ~((1 << A0) | (1 << RW)); //ïðèãîòîâèì äèñïëåé ê ïðèåìó ÊÎÌÀÍÄ
if (c==2)
{
PORTD |= (1<<CS1) | (1<<CS2); //Âêëþ÷èì îáà êðèñòàëëà
}
else
{
if (c==0) //Âêëþ÷èì íóæíûé êðèñòàëë.
{
PORTD |= (1<<CS1);
PORTD &= ~(1<<CS2);
}
else
{
PORTD |= (1<<CS2);
PORTD &= ~(1<<CS1);
}
}
//Âêëþ÷èëè íóæíûé êðèñòàëë
PORTB = data; //Âûâåëè data â LCD
//Ñòðîá
PORTD |= (1<<E);
for(c=0; c<32; c++); //ïàóçà 8ìêñ
PORTD &= ~(1<<E);
}



void Write_Data_to_LCD (int c, int data) //Âûâîäèò ÄÀÍÍÛÅ
{
Wait_LCD_ready(); // äîæäåìñÿ ãîòîâíîñòè êîíòðîëëåðà
if (c==2)
{
PORTD |= (1<<CS1) | (1<<CS2); //Âêëþ÷èì îáà êðèñòàëëà
}
else
{
if (c==0) //Âêëþ÷èì íóæíûé êðèñòàëë.
{
PORTD |= (1<<CS1);
PORTD &= ~(1<<CS2);
}
else
{
PORTD |= (1<<CS2);
PORTD &= ~(1<<CS1);
}
}
PORTD &= ~(1 << RW);
PORTD |= (1<<A0);
//Ïåðåêëþ÷èëèñü íà âûâîä äàííûõ
PORTB = data;
//Ñòðîá
PORTD |= (1<<E);
for(c=0; c<32; c++); //ïàóçà 8ìêñ
PORTD &= ~(1<<E);
}



char flash_read(char address)
{
char b;
b = __flash_read_int( address );
return b;
}



char iBReadBit(void) //à ðàíüøå îí áûë bit, à íå char
{
/*
IB_TRIS = 0 ; // IB_BIT as output
IB_BIT = 0 ; // Begin time slot
DelayUs(2) ; // Tsu = 2 Us
IB_TRIS = 1 ; // IB_BIT as input
DelayUs(2); // Tlowr = 2 + 2 = 4 Us
DelayUs(10); // Sample time is 4 + 10 = 14 Us

if( IB_BIT == 1 )// Is the one on line ?
{
DelayUs(100); // Time slot is 100 + 14 = 114 Us
Recover();
return 1 ; // Yes, return 1
}
DelayUs(100); // Time slot is 100 + 14 = 114 Us
Recover();
return 0 ; // No, return 0
*/
return 0;
}


char iBReadByte( void )
{
char b = 0 , i ;
for ( i = 0 ; i < 8 ; i ++ )
{
b >>= 1 ;
if( iBReadBit() )
b |= 0x80 ;
}

return b ;
}
Baser
Ну для начала просьба не выкладывать такие куски прямо в посте, а прикреплять их в виде файлов. Да и если куски кода постите, то оформляйте их как код, а то без форматирования разбираться в этом очень тяжело sad.gif

Теперь по программе. Сильно я в ней не разбирался, но конечно она не может дать такой объем кода, чтобы забить всю флеш. Поэтому:
- проверьте установки вашего проекта и настройки линкера и его командный файл .xcl
- устраните все ошибки, которые выдаются на этапе компиляции. Что-то мне не верится что их нет. Та ошибка, что вы приводите, это ошибка линкера. А если есть ошибки компилятора, то что делает линкер уже непредсказуемо.

Одна явная ошибка налицо:
Цитата(Andrеys @ Dec 26 2007, 20:54) *
Код
__intrinsic int __flash_read_int( unsigned short address );

char flash_read(char address)
    {
    char b;
    b = __flash_read_int( address );
    return b;
    }

byte = flash_read(0x008F);

Адрес двухбайтный, вы его объявили char. Читаете флеш через ненужную паразитную функцию по какому-то абсолютному адресу sad.gif Где вы эти адреса взяли?
Попробуйте так:
Код
char __flash massO[]={0x00, 0x3e, 0x41, 0x41, 0x41, 0x3e};

byte = __flash_read_int((unsigned short)&massO[0]);
...
byte = __flash_read_int((unsigned short)&massO[5]);

В PIC16 константы во флеши хранятся в виде инструкций RETLW byte и результат функции __flash_read_int все равно будет усекаться до одного байта.

Ещё бросилось в глаза:
Цитата(Andrеys @ Dec 26 2007, 20:54) *
Код
rezultat=ADRESH;
for ( i=0; i<8; i++)
    {
    rezultat <<= 1;
    }
    rezultat=rezultat+ADRESL;

Тут вы явно перемудрили, достаточно такого:
Код
rezultat = ((unsigned int)ADRESH<<8)|ADRESL;

Ну и напоследок, если у вас целые беззнаковые, то и объявляйте их unsigned int rezultat;
А то компилятор будет их обрабатыват как знаковые, а это не везде будет правильно smile.gif
Andrеys
Цитата
Одна явная ошибка налицо:
...

Учтено! a14.gif
Цитата
- проверьте установки вашего проекта и настройки линкера и его командный файл .xcl
- устраните все ошибки, которые выдаются на этапе компиляции. Что-то мне не верится что их нет. Та ошибка, что вы приводите, это ошибка линкера. А если есть ошибки компилятора, то что делает линкер уже непредсказуемо.

какие настройки надо проверить???
у меня при всех предидущих компиляциях 0 ошибок и 0 предупреждений.
сейчас, чтобы не вылетало это гнусное сообщение и я мог дальше писать я просто комментарю некотрые куски кода!! help.gif
Baser
Цитата(Andrеys @ Dec 30 2007, 12:59) *
какие настройки надо проверить???
у меня при всех предидущих компиляциях 0 ошибок и 0 предупреждений.

Я имею в виду настройки проекта в ИАРе: Project->Options-> далее просмотрите все опции, попробуйте с ними поиграться. Еще включите там же генерацию *.map файла и посмотрите что там выдается.

Цитата(Andrеys @ Dec 30 2007, 12:59) *
сейчас, чтобы не вылетало это гнусное сообщение и я мог дальше писать я просто комментарю некотрые куски кода!!

Вот как раз, чтобы понять, что не нравится компилятору, нужно найти тот кусок кода, после добавления которого линкер начинает ругаться. А дальше: код в студию smile.gif
p.s. Я сам для ПИКов применяю ХайТэч, поэтому ваш проект целиком проверить не могу. Но если ничего не получится, прицепите к сообщению архив со всеми файлами проекта, может кто проверит на ИАРе, а я могу проверить на PICC.
Andrеys
я так понял ругаться начинает только в том куске, где идет работа с флеш-памятью, считывание,
конструкции типа этой в ИАРе не канают:
Цитата
char __flash massO[]={0x00, 0x3e, 0x41, 0x41, 0x41, 0x3e};


в файле inpic.h иара нашел следующие строки
__intrinsic int __flash_read_int( unsigned short address );
__intrinsic void __flash_write_int( unsigned short address, int value );
__intrinsic char __flash_read_low_char( unsigned short address );
__intrinsic char __flash_read_high_char( unsigned short address )
их использую, а выдает ошибку... unsure.gif
как они правильно применяются? думаю что адреса использую не те, начальный подсмотрел в pdf
Baser
Цитата(Andrеys @ Jan 2 2008, 11:16) *
я так понял ругаться начинает только в том куске, где идет работа с флеш-памятью, считывание

Да если дело только в этом, то просто расширения Си в ИАРе по другому определяются, да и делов то!
Примените стандартную сишную конструкцию, она везде железно работать должна smile.gif
Код
const char massO[]={0x00, 0x3e, 0x41, 0x41, 0x41, 0x3e};

И дальше обращайтесь к элементам массива стандартным образом:
Код
temp_char = massO[5];
...
Write_Data_to_LCD(1, massO[1]);
...
if (massO[2] == 0x41) ...
...
for (i=0, i<sizeof(massO), i++) temp_buf[i] = massO[i];
...


И еще отступление:
Кто вам посоветовал взять ИАРовский компилятор, тоже "злой препод" biggrin.gif или сами выбрали?
Я тут глянул на сайт ИАРа и с удивлением обнаружил, что они уже 5 лет не развивают компилятор для PIC16. Видимо поняли, что тут им ловить уже нечего, это семейство слабо подходит для классической реализации Си, где они были всегда сильны, и перебросили силы на новые семейства Микрочипа: PIC18, PIC24, dsPIC.
Версия 2.21А (она же последняя) выпущена в октябре 2002. В ноябре я её пробовал, и даже небольшую статейку написал. Если есть интерес, можете глянуть:
IAR-C v2.21A for PIC16: Глава 1. Первые впечатления и проблемы несовместимости с HT-PICC
IAR-C v2.21A for PIC16: Глава 2. Изучаем компилятор
Так что если есть планы и дальше применять PIC16, то лучше возмите HiTech PICC - он все время развивается santa2.gif
Andrеys
Baser!
Спасибо за хорошее отношение и терпеливость в оказании помощи, статьи почитал, сделал как там - не помогло ))) сдал так, препод в итоге программу особо и не смотрел, смотрел на аналоговую часть, а я заработал свою твердую 4 и выход на сессию.
Поздравляю с прошедшими новогодними : )
KAI
Цитата(Baser @ Jan 3 2008, 00:59) *
Версия 2.21А (она же последняя) выпущена в октябре 2002. В ноябре я её пробовал, и даже небольшую статейку написал. Если есть интерес, можете глянуть:
IAR-C v2.21A for PIC16: Глава 1. Первые впечатления и проблемы несовместимости с HT-PICC
IAR-C v2.21A for PIC16: Глава 2. Изучаем компилятор

позволю себе немного Вас поправить: последняя версия: IAR PIC 2.21C вышла 19 октября 2005г. А последний апгрейд пач для IAR PIC 2.21 вышел 13 сентября 2007г.
Цитата(Baser @ Jan 3 2008, 00:59) *
Так что если есть планы и дальше применять PIC16, то лучше возмите HiTech PICC - он все время развивается santa2.gif

Но в моём случае под IAR уже много наработок для PIC16.

С уважением.
Константин.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.