AVR-GCC i tablice

Jun 19, 2004 4 Replies

Witam Mam zadeklarowana tablice z 1344 elementow. Dane z tej tablicy wzucane sa na LCD graficzny i tu zaczyna sie problem. Do jakies 1/3 wyswietlacza wyszytko ladowane jest poprawnie a nastepnie podawana jest ta sama wartosc. W zwiazku z tym pytanie: Czy AVR-GCC ma jakies ograniczenia co do wielkosci tablicy? Czy popelnilem jakis blad w kodzie? Tablica zadeklarowana jest jako:



unsigned char rys[1344]={ 0x3f,0x3f,0x3f,....,0x00 };



Petla glowna: int main(void) { int z=0; char xb,temp; TOSHIBA_init (0x80); for (z=0;z<1344;z++) { TOSHIBA_write_word(0x24,0x100+z); for (xb=0;xb<6;xb++) { temp=(rys[1344]>>xb); if((temp&0x01)==0x01){_write_control(0xf8+xb);} } } while(1) { } }



Serdecznie dziekuja za wszelkie sugetie i odpowiedzi Michal



mala poprawka w kodzie: temp=(rys[z]>>xb); Pzdr Michal

tak zadeklarowana tablica zostanie umieszczona w segmencie danych, więc najwyraźniej szybko kończy Ci się wolna pamięć RAM. powinno być coś w stylu:

#include <avr/pgmspace.h>

unsigned char rys[1344] PROGMEM = { 0x37,0x3f,0x3f,...,0x00 };

a zamiast tego:

temp = pgm_read_byte(rys + z) >> xb;

najlepiej przyjrzeć się dokumentacji avr-libc. tam w FAQ tłumaczą dokładnie dlaczego tak trzeba.

w.

A masz tyle pamieci ram ? Moze po prostu ~600 bajtow uzywasz na inne rzeczy, 400 bajtow zostaje na "rys" i koniec.

Poza tym jak slusznie zauwazono - skorzystaj z przestrzenii programu - i tak te dane musza byc tam zapisane, i na poczatku przepisane do ram - czyli czyste marnotrawstwo, o ile maja zawierac jakis staly obrazek.

sugeruje:

temp=(rys[1344]); for (xb=0;xb<6;xb++) { if((temp&0x01)==0x01){_write_control(0xf8+xb);} temp>>=1 ; }

albo nawet

xb=0; temp=(rys[1344]); while (temp !=0) { if((temp&0x01)==0x01){_write_control(0xf8+xb);} ++xb; temp>>=1 ; }

[o ile temp jest "unsigned char", zeby przypadkiem z 0x80 po >> nie zrobilo sie 0xC0, a w ogole to ile jest tam bitow, bo na oko 7 ]

J.

Dziekuje za pomoc. Wszytko oczywiscie ruszylo :) Pzdr Michal

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required