[PIC]Tabellen in C

Gast #2781348
Lesenswert?

Hi,
da ich nun ein größeres Projekt beginne, möchte ich mich bei C 
reinfitzen.
Allerdings scheitere ich da schon an so einer einfachen Sache wie dem 
auslesen einer Tabelle...
Ich möchte eine Grafik auf einem Display ausgeben und habe dafür ein 
Programm dass mir aus der Bitmap eine C Tabelle macht, das sieht dann so 
aus:
1
const unsigned char LCD_write_thor_logo [] = {
2
0xFF, 0xFF, 0xFF, 0xDF, 0x8F, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
3
0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
4
0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x8F, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
5
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
6
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
7
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F,
8
0x1F, 0x0F, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC,
9
0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
10
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
11
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
12
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB,
13
0xF9, 0xF8, 0xF8, 0x78, 0x38, 0x18, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0,
14
0xF8, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
15
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
16
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
17
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
18
0xFF, 0xDF, 0xCF, 0xC7, 0xC3, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xC3,
19
0x63, 0x73, 0x7B, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF,
20
0xFF, 0x7F, 0x3F, 0x3F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0xFF,
21
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x0F, 0x0F, 0xCF, 0xFF, 0xFF,
22
0xFF, 0xDF, 0x8F, 0x8F, 0x8F, 0x9F, 0x9F, 0x9F, 0x9F, 0x1F, 0x1F, 0x1F, 0x1F, 0x9F, 0xDF, 0xFF,
23
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, 0x07, 0x01, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC,
24
0xFE, 0xFF, 0x7F, 0x0F, 0x01, 0xC0, 0xCC, 0xCF, 0xCF, 0xCF, 0x0F, 0x0F, 0x81, 0xC0, 0xEC, 0x9F,
25
0x07, 0x07, 0xE3, 0xF1, 0xF8, 0xFC, 0xFE, 0xFE, 0x7C, 0x38, 0x01, 0x83, 0xC7, 0xFF, 0x03, 0x01,
26
0x80, 0x0C, 0x0C, 0xC0, 0xE0, 0xF1, 0xFB, 0xFF, 0xFF, 0xF9, 0xF8, 0x7C, 0x1E, 0x03, 0xC0, 0xF0,
27
0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x0F, 0x07, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0xFC, 0xFE,
28
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xCF, 0xC3, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF,
29
0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xE3, 0xE0, 0xE8, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xE3, 0xE0, 0xE8,
30
0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xF0, 0xF1, 0xF1, 0xF1, 0xF9, 0xF8, 0xFC, 0xFE, 0xFF, 0xFF,
31
0xFF, 0xF7, 0xF0, 0xF0, 0xF7, 0xFF, 0xFC, 0xF8, 0xF1, 0xF3, 0xFF, 0xFF, 0xEF, 0xE7, 0xE1, 0xE0,
32
0xE0, 0xE6, 0xEF, 0xFF, 0xEF, 0xE7, 0xE3, 0xE1, 0xE0, 0xE8, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF,
33
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
34
};


Ich habe mir schon verschiedene Anfänger Tutorials durchgelesen, 
allerdings ist keines näher auf Tabellen eingegangen.
Muss ich da jetzt mit Vektoren arbeiten?
#2781433
Lesenswert?

Wenn der PIC ein 8 Bitter ist, dann musst Du dem Compiler noch sagen, 
dass er Dein Array in den Programmadressraum, dh ins Flash lesen soll. 
Ansonsten ist Dein Ram im Nu voll. Der Microchip C18-Compiler hat dafür 
das Schlüsselwort rom. Schau in die Dokumentation zum Compiler rein.

fchk
#2781445
Lesenswert?

Also erstmal gibt es in C keine "Tabellen". Eine Tabelle ist 
mehrdimensional. In C gibt es nur (eindimensionale) Arrays. Ganz einfach 
weil der Speicher eindimensional ist. Es gibt zwar mehrdimensionale 
Gebilde, aber diese bestehen im Grunde nur wieder aus eindimensionalen 
Arrays welche Zeiger auf andere eindimensionale Arrays besitzen. 
Allerdings sind diese Daten da oben eindeutig eindimensional und somit 
nur eine Liste von Bytes.

Erstmal muss doch die Terminologie stimmen.

Dann kann man natürlich diese Liste als 2D-Daten für ein Display 
auffassen. Wenn man die Zeilenbreite festlegt. Mit einer einfachen 
Formel kann man so auf ein Element über 2D Koordinate x und y zugreifen.

Dann wird es doch erst spannend wenn der TE mal damit rausrückt was er 
nun mit den Daten machen will.

gruß cyblord
Gast #2781940
Lesenswert?

Er hat doch geschrieben was er machen will
> Ich möchte eine Grafik auf einem Display ausgeben ...

Du brauchst keine Vektoren (wie bereits erwähnt gibs sowas in C nicht) 
und auch keine Zeiger.
Ein einfaches

char data;

for (i = 0; i < groesse_des_arrays; i ++) {
    data = LCD_write_thor_logo[i];
    sende_byte_ans_lcd(data);
}

sollte einigermaßen deutlich machen, wie die Tabelle ausgelesen wird. Um 
das letztendlich zu implementieren braucht man Informationen wie das LCD 
angesprochen werden will.
Gast #2782214
Lesenswert?

Ich arbeite mit zwei Compiler...

#define MICROCHIP_C18 (0)  //Für SDCC
//#define MICROCHIP_C18 (1)  //Für MPLAB

#if    MICROCHIP_C18
   #define __code  rom
#else
#endif

const __code  unsigned short Log2Tab[] = 
{0,2909,5732,8473,11136,13727,16248,18704,21098,23432,25711,27936,30109, 
32234,34312,36346,38336,40286,42196,44068,
45904,47705,49472,51207,52911,54584,56229,57845,59434,60997,62534,64047, 
65535
                       };
#2795995
Lesenswert?

skorpionx schrieb:
> Es ist möglich dass die Länge einer Tabelle in einem Compiler begrenzt
> ist..

Die Länge eines Arrays, das im RAM abgelegt ist, wird durch das 
Linker-File begrenzt. Dort ist das RAM in einzelne Speicherbereiche 
aufgeteilt. Ist das Array grösser als ein Speicherbereich, so gibt der 
Compiler eine Fehlermeldung raus. Das Linker-File kann natürlich 
verändert werden. Google verrät dir, wie du grosse Arrays im PIC anlegen 
kannst.

Wenn das Array im Flash angelegt werden soll, muss du dies dem 
C18-Compiler folgendermassen mitteilen:
const rom unsigned char LCD_write_thor_logo [] = { ... };

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren