Forum: Mikrocontroller und Digitale Elektronik [PIC]Tabellen in C


von Yves E. (Gast)


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?

von Peter II (Gast)


Lesenswert?

Was ist jetzt die genau Frage?

In welcher form braucht denn das Display die Daten?

von Ingo (Gast)


Lesenswert?

Wieso Vektoren. Die liest einfach das Array aus:

Variable = deineTabelle[Wert Nr], liefert z.B. Bei deineTabelle[3] ein 
0xdf an die Variable.


Ingo

von Frank K. (fchk)


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

von Frank K. (fchk)


Lesenswert?

Ps: Vektoren sind C++. C kennt nur Arrays, und Du hast erfolreich eines 
angelegt. Also alles ok, bis aufs rom Keyword. Wenn Du Hitech oder 
MicroE nimmst, heißt das anders -> Manual.

fchk

von EGS_TI (Gast)


Lesenswert?

Wasn fürn "rom Keyword"?

Also bei den neuen Microchip Compilern landen const-Variablen 
automatisch im Flash.

von Cyblord -. (cyblord)


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

von Martin (Gast)


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.

von skorpionx (Gast)


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
                       };

von EGS_TI (Gast)


Lesenswert?

Schön für dich, was hat das mit dem Thema zu tun?

von skorpionx (Gast)


Lesenswert?

EGS_TI schrieb:
> Schön für dich, was hat das mit dem Thema zu tun?

Ich habe keine Probleme meine Tabelle einzulesen.
Es ist möglich dass die Länge einer Tabelle in einem Compiler begrenzt 
ist..

von Frank K. (fchk)


Lesenswert?

EGS_TI schrieb:
> Wasn fürn "rom Keyword"?
>
> Also bei den neuen Microchip Compilern landen const-Variablen
> automatisch im Flash.

Du meinst den XC8? Mag sein. Dem C18 muss man das manchmal auf die Nase 
binden. Und HiTech ist wieder eine andere Sache.

fchk

von B. S. (bestucki)


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 [] = { ... };

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.