25-04-2020, 18:40
(Ten post był ostatnio modyfikowany: 25-04-2020, 18:41 przez ElektronPL.)
Witam! Spotkałem się z dziwnym zachowaniem mikrokontrolera Atmega1284 (lub kompilatora). mianowicie uruchomiłem pewny wyświetlacz LCD (24bit kolor, 160x240) tego typu obrazek zajmuje 115200 bajtów. W ramach testu chciałem zapisać w pamięci mikrokontrolera obrazek i wyświetlić na tym ekranie. Kompilator nie pozwolił mi stworzyć jednej tak dużej tablicy. Zmieściłem w czterech. Efekt - jak widać zdj, w pewnym momencie grafika się psuje. Zauważyłem że moment kiedy pojawia się problem to dokładnie 65536 (czyli gdy bit 16 adresu pamięci zmienia się na 1).
I może ktoś pomyśleć po co mi system wyświetlania jednej grafiki. Oczywiście nie o to chodzi - posiadam parę projektów z tym mikrokontrolerem, a ten który teraz tworze niebezpiecznie zbliża się do tej granicy 65KB. Poza tym czysta ciekawość, nie podoba mi się, że to nie działa tak jak chce
Kod: (jest tu tylko część odpowiadająca za wysyłanie faktycznego obrazu bo kod jest długi i ciężko się od razu połapać)
PS: Na pewno nie chodzi o komunikację z wyświetlaczem bo gdy wyświetlam np. czarno-białą grafikę, aby zająć mniej niż 65KB pamięci to wszystko jest OK.
Z góry dziękuję za pomoc i pozdrawiam!
I może ktoś pomyśleć po co mi system wyświetlania jednej grafiki. Oczywiście nie o to chodzi - posiadam parę projektów z tym mikrokontrolerem, a ten który teraz tworze niebezpiecznie zbliża się do tej granicy 65KB. Poza tym czysta ciekawość, nie podoba mi się, że to nie działa tak jak chce

Kod: (jest tu tylko część odpowiadająca za wysyłanie faktycznego obrazu bo kod jest długi i ciężko się od razu połapać)
Kod:
for (byte j = 0; j < 60; j++) // linie od 1 do 60
{
// 1 HORIZONTAL LINE --------------
PORTB = 0b000001; // thsw
PORTB = 0b000101;
for (byte i = 0; i < 99; i++) // thbp-thsw
{
PORTB = 0b000011;
PORTB = 0b000111;
}
for (int i = 0; i < 480; i++) // thd
{
PORTB = 0b000011;
PORTC = pgm_read_byte(&img0[i + (j * 480)]);
PORTB = 0b000111;
}
for (byte i = 0; i < 37; i++) // thfp
{
PORTB = 0b000011;
PORTB = 0b000111;
}
// 1 HORIZONTAL LINE END ----------
}
for (byte j = 0; j < 60; j++) // linie od 61 do 120
{
// 1 HORIZONTAL LINE --------------
PORTB = 0b000001; // thsw
PORTB = 0b000101;
for (byte i = 0; i < 99; i++) // thbp-thsw
{
PORTB = 0b000011;
PORTB = 0b000111;
}
for (int i = 0; i < 480; i++) // thd
{
PORTB = 0b000011;
PORTC = pgm_read_byte(&img1[i + (j * 480)]);
PORTB = 0b000111;
}
for (byte i = 0; i < 37; i++) // thfp
{
PORTB = 0b000011;
PORTB = 0b000111;
}
// 1 HORIZONTAL LINE END ----------
}
for (byte j = 0; j < 60; j++) // linie od 121 do 180
{
// 1 HORIZONTAL LINE --------------
PORTB = 0b000001; // thsw
PORTB = 0b000101;
for (byte i = 0; i < 99; i++) // thbp-thsw
{
PORTB = 0b000011;
PORTB = 0b000111;
}
for (int i = 0; i < 480; i++) // thd
{
PORTB = 0b000011;
PORTC = pgm_read_byte(&img2[i + (j * 480)]);
PORTB = 0b000111;
}
for (byte i = 0; i < 37; i++) // thfp
{
PORTB = 0b000011;
PORTB = 0b000111;
}
// 1 HORIZONTAL LINE END ----------
}
for (byte j = 0; j < 60; j++) // linie od 181 do 240
{
// 1 HORIZONTAL LINE --------------
PORTB = 0b000001; // thsw
PORTB = 0b000101;
for (byte i = 0; i < 99; i++) // thbp-thsw
{
PORTB = 0b000011;
PORTB = 0b000111;
}
for (int i = 0; i < 480; i++) // thd
{
PORTB = 0b000011;
PORTC = pgm_read_byte(&img3[i + (j * 480)]);
PORTB = 0b000111;
}
for (byte i = 0; i < 37; i++) // thfp
{
PORTB = 0b000011;
PORTB = 0b000111;
}
// 1 HORIZONTAL LINE END ----------
}
PS: Na pewno nie chodzi o komunikację z wyświetlaczem bo gdy wyświetlam np. czarno-białą grafikę, aby zająć mniej niż 65KB pamięci to wszystko jest OK.
Z góry dziękuję za pomoc i pozdrawiam!