Sida 1 av 1

Minnesbrist & stora textmassor (AVR)

Postat: 13 september 2005, 16:40:33
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).

Postat: 13 september 2005, 16:55:20
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

Postat: 13 september 2005, 17:02:41
av Antigonos
Tackar så mycket :) .
Ja, jag ska kolla igenom den manualen bättre.

Citering bortagen.

Postat: 13 september 2005, 17:06:34
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.

Postat: 13 september 2005, 17:10:19
av Antigonos
Ok, det är noterad och utskrivet.
Och tack för hjälpen ännu en gång.

citering borttagen..

Postat: 13 september 2005, 21:57:38
av ensten
Antigonos> Citera inte senaste inlägg!

Re: Minnesbrist & stora textmassor (AVR)

Postat: 15 september 2005, 19:49:11
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