Forum: Mikrocontroller und Digitale Elektronik PIC18: Tabellen in C


von DirkF (Gast)


Lesenswert?

Hallo, ich möchte in C eine Tabelle im Programmspeicher ablegen, ummit 
Ihr einen DA-Wandler zu steuern.
Es werden ca. 1000 INT benötigt, um eine Wellenform darzustellen.
Das Problem:
Bie diesem Beispiel werden auch RAM verbraucht, ich möchte aber nur ROM 
Speicherplatz benutzen.


const int in_table[] = {
8,8,2,3,4,5,7,
8,8,2,3,4,5,7,
8,8,2,3,4,5,7,
8,8,2,3,4,5,7,
8,8,2,3,4,5,7,
8,8,2,3,4,5,7,
8,8,2,3,4,5,7,
8,8,2,3,4,5,7};

zahl = in_table[2];

Also Frage: Wie kann man im C eine Tabelle mit vielen Werten im ROM 
ablegen, die man dann ähnlich wie in Assebbler mit TBLRD auslesen kann?

Danke für Eure Hilfe.

von holger (Gast)


Lesenswert?

const rom int in_table[] = {

von DirkF (Gast)


Lesenswert?

Hallo Holger, danke für die schnelle Antwort.
Aber mein PICC18 compiler verweigert die Arbeit.


const int in_table[] = {  .... geht, aber mit RAM Verbrauch.

const rom int in_table[] = {.....Fehlermeldung

Error   [314] Z:\HVT-Tester\Board18C\Untitled006.c; 100.11 ";" expected
Error   [285] Z:\HVT-Tester\Board18C\Untitled006.c; 120.1 no identifier 
in declaration
Warning [374] Z:\HVT-Tester\Board18C\Untitled006.c; 120.1 missing basic 
type; int assumed
Error   [314] Z:\HVT-Tester\Board18C\Untitled006.c; 120.1 ";" expected

von AkkiSan (Gast)


Lesenswert?

DirkF schrieb:
> const int in_table[] = {  .... geht, aber mit RAM Verbrauch.

Wie kommst Du darauf?
Das PICC18 Handbuch, das man mitunter ja auch mal aufschlagen könnte
(wink ;-), ist da anderer Meinung. Ich auch...

DirkF schrieb:
> const rom int in_table[] = {.....Fehlermeldung

MPLAB C18, SourceBoost oder SDCC benutzen "ROM".
Der Hi-Tech PICC18 kennt das nicht.

von DirkF (Gast)


Lesenswert?

Hallo,
Handbuch vom PICC18 habe ich schon rauf und runter gelesen.
Zu Anzeige des Verbrauchten RAM / ROM benutze ich in MPLAB den Memory 
usage gauge.

Fakt ist folgendes:

const unsigned char USB_CD_Ptr[]={1,2,3,4,5,6,7,8,9};
Memory usage gauge: 154 ROM /  12 RAM benutzt.

const unsigned char USB_CD_Ptr[]={1,2,3,4,5,6,7,8,9,11,22,33,44};
Memory usage gauge:  156 ROM /  16 RAM benutzt.

Also für 4 zusätzliche Bytes in der Tabelle werden auch 4 Bytes RAM mehr 
verbraucht.

Da ich eine große Tabelle anlegen möchte, kann ich mir diese RAM 
Verschwendung leider nicht leisten.

Also nochmal die Frage an die Experten: Wie kann man in C (HI-TECH C18) 
eine große Tabelle im ROM anlegen, die ich dann auslesen kann.

Bin für jeden Tipp dankbar.
Gruß Dirk

von Frank K. (fchk)


Lesenswert?

Lass mal beim Compilieren ein Assemblerlisting erstellen und schau dann 
nach, was der Compiler aus den Arrayzugriffen macht und wo die Arrays 
tatsächlich landen.

fchk

von DirkF (Gast)


Lesenswert?

Hallo an alle,
habe den Fehler (meinen) gefunden.

Hatte die Deklaration

const unsigned char  Daten[]={1,2,3,4,5,6,7,8,9,11,22,33};

im Hauptprogramm Main gemacht.

Jetzt habe ich die Deklaration ganz an den Anfang verschoben. jetzt 
gehts.
Schön, daß man hier im Forum viele hilfsbereite Leute findet.
Werde in Zukunft wohl noch mehr auf Probleme stoßen und mich hier 
nochmal melden.
Gruß Dirk

von AkkiSan (Gast)


Lesenswert?

Kann es nicht doch vielleicht sein, daß Du den C18 und
nicht den PICC18 benutzt?

Beim PICC18 ist ein "const" ausreichend (es sei denn, Du hast
an den Linker-Einstellungen herumgefummelt...).
Und wenn es tatsächlich der PICC18 ist, benutzt Du davon
vielleicht nur die evaluation version?

Meine Pro Version macht das nicht, aber ich erinnere mich dunkel
an die ersten Compiler-Tests.

Schau mal hier:

"Automatically allocates objects into optimal locations"

http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en542861

Lite: Nö...

von AkkiSan (Gast)


Lesenswert?

Ups. Zu spät ;-)

von Frank K. (fchk)


Lesenswert?

Ein static const hätte es vielleicht auch getan.

fchk

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.