Minnesbrist & stora textmassor (AVR)

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Antigonos
Inlägg: 6
Blev medlem: 13 september 2005, 16:21:42

Minnesbrist & stora textmassor (AVR)

Inlägg av Antigonos »

Hej jag använder mig utav Atmega16, och har problem med minnesbrist i sram minnet som är på (1KB).

Jag har en stor display där jag skriver ut mycket text , och min fråga är hur ska man spara texten utan att den tar upp ramminnet? Det är inte mycket text i vanlig mening, men det är för mycket för att ha allt hela tiden i sram minnet.
Programmet är skrivet i C (winavr/gnu), och jag måste tyvärr ha för mycket text i programmet. Jag har ej heller möjlighet att byta microcontroller eller externt sram då den ej stöder det.

Nu har jag löst det såhär

char text[]=" hejsan svejsan";
while(text != 0)
{
PORTC = text; //skriv ut strängen på displayen
e_rs_clock();
i++;
}
Vilket innebär att hela charen[] text sparas i ramminnet. Det är inte så farligt, men jag har ett antal såna texter som skall skrivas ut. Texten behöver aldrig användas så mitt flashminne på 16KB skulle räcka hur bra som helst, om en bara visste hur..

Jag har även testat detta med samma resultat.
char text[10];
strcpy(text,"hejsan svejsan: ");
Där jag endast använde samma text[] för alla texter, och använde olika strcpy.

Någon som har ett bra tips? Detta måste väl vara ett vanligt problem, och jag trodde 1KB skulle räcka bra då jag hade kört med en 512B sram microcontroller innan (8515).
Senast redigerad av Antigonos 13 september 2005, 17:45:48, redigerad totalt 2 gånger.
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Kod: Markera allt

const uint8_t char text[] PROGMEM = " hejsan svejsan";

while (pgm_read_byte(&text[i]) != 0)
{
    PORTC = pgm_read_byte(&text[i]);
    e_rs_clock();
    i++;
}
Kolla i manualen till avr-libc. Det finns ett helt kapitel om det här där.

edit: Rättning
Senast redigerad av cykze 13 september 2005, 17:03:47, redigerad totalt 1 gång.
Antigonos
Inlägg: 6
Blev medlem: 13 september 2005, 16:21:42

Inlägg av Antigonos »

Tackar så mycket :) .
Ja, jag ska kolla igenom den manualen bättre.

Citering bortagen.
Senast redigerad av Antigonos 15 september 2005, 14:55:11, redigerad totalt 1 gång.
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Se min andring i koden ocksa. Nar du ska komma at innehallet i en variabel som ligger i Flash-minnet sa maste du anvanda speciella funktioner. De brukar borja pa pgm_ eller sa har de P i namnet. Kolla som sagt i manualen.
Antigonos
Inlägg: 6
Blev medlem: 13 september 2005, 16:21:42

Inlägg av Antigonos »

Ok, det är noterad och utskrivet.
Och tack för hjälpen ännu en gång.

citering borttagen..
Senast redigerad av Antigonos 15 september 2005, 14:52:36, redigerad totalt 1 gång.
Användarvisningsbild
ensten
EF Sponsor
Inlägg: 3759
Blev medlem: 19 oktober 2004, 15:55:20
Ort: Hudiksvall

Inlägg av ensten »

Antigonos> Citera inte senaste inlägg!
Rymdninja
Inlägg: 330
Blev medlem: 15 december 2003, 13:41:25
Ort: Göteborg

Re: Minnesbrist & stora textmassor (AVR)

Inlägg av Rymdninja »

Antigonos skrev: Jag har även testat detta med samma resultat.
char text[10];
strcpy(text,"hejsan svejsan: ");
Där jag endast använde samma text[] för alla texter, och använde olika strcpy.
Det "smartaste" är nog som du redan har fått tips om, att lägga det i annat minne än programminnet. Men du vet vär att du inte behöver använda strcopy in i en buffer? Du kan juh bara ha en char-pekare som du sätter till början av strängen du vill använda. Se bara till att dina stränar är null-terminerade. Det borde spara ett par bytes i kod iaf :)

Peace
Skriv svar