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

 
 
> Считать из flash-памяти PIC. Срочно!, IAR язык Си
Andrеys
сообщение Dec 21 2007, 19:27
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 32
Регистрация: 13-08-07
Из: г. Челябинск
Пользователь №: 29 741



т.к. памяти стало не хватать(держал много массивов с байтами) придется хранить их где-то в памяти и обращаться поадресно, на 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

очень похоже на то что мне надо(или я ошибаюсь?)
если да, то как это использовать?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Andrеys
сообщение Dec 26 2007, 18:54
Сообщение #2


Участник
*

Группа: Новичок
Сообщений: 32
Регистрация: 13-08-07
Из: г. Челябинск
Пользователь №: 29 741



Окей, я сделал так:
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 ;
}

Сообщение отредактировал Andrеys - Dec 26 2007, 18:55
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Andrеys   Считать из flash-памяти PIC. Срочно!   Dec 21 2007, 19:27
- - ncux   Цитатапридется хранить их где-то в памяти А массив...   Dec 22 2007, 22:09
- - Andrеys   да, я был некорректен. держать в памяти я имел вви...   Dec 23 2007, 09:18
- - Baser   Цитата(Andrеys @ Dec 21 2007, 21:27) очен...   Dec 23 2007, 12:15
- - Andrеys   это случилось когда невольно пришлось писать прогр...   Dec 23 2007, 13:58
|- - Baser   Цитата(Andrеys @ Dec 23 2007, 15:58) это ...   Dec 23 2007, 14:31
- - Andrеys   ага. а у меня дело-то в том что это "злой пре...   Dec 23 2007, 16:33
|- - Baser   Цитата(Andrеys @ Dec 23 2007, 18:33) знач...   Dec 23 2007, 17:41
- - Baser   Ну для начала просьба не выкладывать такие куски п...   Dec 26 2007, 21:40
- - Andrеys   ЦитатаОдна явная ошибка налицо: ... Учтено! ...   Dec 30 2007, 10:59
|- - Baser   Цитата(Andrеys @ Dec 30 2007, 12:59) каки...   Dec 30 2007, 16:23
- - Andrеys   я так понял ругаться начинает только в том куске, ...   Jan 2 2008, 09:16
|- - Baser   Цитата(Andrеys @ Jan 2 2008, 11:16) я так...   Jan 2 2008, 21:59
- - Andrеys   Baser! Спасибо за хорошее отношение и терпелив...   Jan 10 2008, 17:55
- - KAI   Цитата(Baser @ Jan 3 2008, 00:59) Версия ...   Feb 15 2008, 10:04


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

 


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


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