PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : S/W-Bitmap im AVR hardcoden



Trabukh
17.10.2008, 20:39
Moin,

Für mein Projekt brauche ich ein Bild mit einer Größe von über 2 KByte hardgecodet in einem ATmega32. Da ich momentan versuche, von Bascom auf C umzusteigen, bin ich noch ein vergleichsweise unbeschriebens Blatt in der Hinsicht und bräuchte etwas Hilfe. In den 1 KBybte großen EEPROM passt die Grafik natürlich nicht, daher müsste es direkt im Quelltext stehen...

Das Format dürfte relativ irrelevant sein, es handelt sich um eine umkodierte 1-Bit Bitmap in binärer Form, also von 0 bis 255 sind alle Zeichen enthalten. Die Daten werden dann per RS232 an einen speziellen Grafik-IC weitergeschickt, der ein Grafik-LCD ansteuert.

Wie könnte man dieses Bild speichern (und eventuell blockweise über RS232 übertragen)?

Gruß und ein schönes Wochenende
Trabukh

geronet
17.10.2008, 21:31
1-Bit Bitmap? Schwarz-Weiss oder Graustufen?
Graustufen geht so:

uint8_t bitmap[400][300] PROGMEM = {{255, 0, 134, 30..}, {242, 4...} ...}

Zu beachten: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmspeicher_.28Flash.29

Grüsse, Stefan

Trabukh
17.10.2008, 23:53
Hmm, danke schonmal für die schnelle Antwort. :)
Allerdings ist es nocht nicht ganz das, was ich suche, kommt dem aber schon recht nahe.

Es handelt sich um ein Schwarz-Weiß-Bild (-> 1 Bit), allerdings ist hierbei anzumerken, dass ich schon eine spezielle Kodierung dafür habe und somit das Format in Bezug auf das Problem unwichtig wird. ;)

Deinem Link folgend habe ich mal ein C-Programm mehr "zusammenkopiert" als wirklich geschrieben:


#include <avr/io.h>
#include <stdint.h>
#include <avr/pgmspace.h>

// Das Bild (Array-Größe: 2864 Bytes)
const uint8_t picLogo[] PROGMEM = {
220, 100, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 252, 1, 255, 255, 255, 255, 255, 240,
..., ..., ..., ..., ..., ..., ..., ..., ..., ...,
..., ..., ..., ..., ..., ..., ..., ..., ..., ...,
}

int main(void)
{
// UART TX einschalten, Asynchron 8N1
UCSRB |= (1<<TXEN);
UCSRC |= (1<<URSEL)|(3<<UCSZ0);

//Baudrate einstellen, 9600
UBRRH = UBRR_VAL >> 8;
UBRRL = UBRR_VAL & 0xFF;

// Initialisierung des Display-ICs
uart_send('U');
uart_send(9);
uart_send(14);

// Ausgabe des Bildes
for(int i=1; i<2864; i++){
uart_send(pgm_read_byte(&picLogo[i]));
}
}

// Einfache Funktion zum Senden einzelner Bytes
int uart_send(unsigned char c) {
while (!(UCSRA & (1<<UDRE))) {}
UDR = c;
return 0;
}
Wäre mein Vorhaben so in etwa möglich? Die passende Schaltung habe ich leider nicht zur Hand und muss mich auch noch ein paar mehr Tage gedulden, aber es schadet sicherlich nicht, sich schonmal mit der Theorie zu befassen...

geronet
18.10.2008, 10:57
So in etwa wär's möglich, ja.
Solltest aber bei der Schleife
for(int i=1; i<2864; i++)
eher bei 0 anfangen ;-)

Grüsse, Stefan

Trabukh
19.10.2008, 13:32
Super, danke dir :)
Die 1 ist mir schon fast peinlich... ;)