Окей, я сделал так:
char flash_read(char address)
{
char b;
b = __flash_read_int( address );
return b;
}
фун-ия читает из флеш.
Но, я продолжил писать программу и вскоре вылетело вот это
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 ;
}