PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wohin mit grosen const-Tabellen?



Goldfinger
23.06.2005, 23:29
Hallo,
ich hab hier ein 256 Felder grosses unsigned char Array, welches als const deklariert ist.
const unsigned char adresse[256] = { ... };
Diese Tabelle benötige ich nur in einer Funktion, die ungefähr alle 5ms aufgerufen wird und nur einen Wert daraus ausliest.
Wie bringe ich diese Tabelle in meinem Mega8 möglichst Platz- und Ressourcenschonend unter?
Gruss,
Philip

pebisoft
23.06.2005, 23:30
ins eprom vom avr.
mfg pebisoft

Goldfinger
23.06.2005, 23:40
Dauert das Auslesen des EPROMS nicht zu lange? (Wie lange überhaupt?) Ich hab noch nie etwas mit dem EPROM im AVR gemacht.
Gruß,
Philip

pebisoft
23.06.2005, 23:53
schau im datenblatt vom avr nach. sind verschieden. wenn du den wert von 5ms angibst und dann in die tabelle vom avr schaust, wirst du erkennen, das du mit der zeit massig hinkommst.
mfg pebisoft

linux_80
23.06.2005, 23:53
Wenn ich das richtig interpretiere, läuft das EEprom immer mit 1MHz,
das schreiben soll dann 8.5 ms dauern,
vom lesen steht da:

When the EEPROM is read, the CPU is
halted for four cycles before the next instruction is executed.

Goldfinger
24.06.2005, 00:00
Also, 4 Cycles bei 16MHz wären ja gerade mal 0,25ms, richtig?

linux_80
24.06.2005, 00:17
Wie rechnet man da ?
1 / 16 000 000 * 4 ?

da sagt mein calculator 0,00000025 s ?

aber egal, sollte doch noch schnell genug sein !?

Goldfinger
24.06.2005, 00:22
Srimmt, vielen Dank.!

Bloß wie kriege ich die Tabelle ins ERPOM? Zu Programmlaufzeit schreiben ist ja nicht so kompliziert, aber dann benötige ich die Tabelle ja auch wieder im Flash, und das ist ja nicht Sinn der Sache...

lekro
24.06.2005, 00:36
Ein vorweg: AFAIK verfügt kein AVR über EPROM. Wenn dann EEPROM. EPROM ist das mit Quarzfenster im Chip.

Aber wofür sollte so eine Tabelle ins EEPROM, wo doch lesen und schreiben so aufwändig und langsam sind? Meiner Meinung nach sollte so eine Tabelle einfach in den Flash, also den Programmspeicher.

Das geht bei AVR-gcc mit "PROGMEM const unsigned char[256]" (evtl. PROGMEM auch nach hinten), siehe Doku (http://www.nongnu.org/avr-libc/user-manual/index.html).

linux_80
24.06.2005, 01:25
@Goldfinger
gedanken zur EEprom version: :-k
geschrieben werden muss die Tabelle ja nur einmal, entweder am Programmanfang einmal eine function aufrufen die das macht, oder evtl. sogar von einem anderen, denn die Daten bleiben ja drin.
Zum auslesen benötigst Du jetzt auch einen Index um an einen bestimmten Wert zu kommen, diesen nachher einfach verwenden um die Speicheradresse des EEprom zu berechnen.

weiter zu bedenken ist, das es 512 Bytes im EEprom gibt, (die Du jetzt garnicht nutzt),
das SRam hat 1KB das dann 1/4 belegt wäre,
also würde ich hier versuchen das EEProm zu verwenden, jenachdem was das Programm sonst machen muss.
:-k

recycle
24.06.2005, 01:37
Bloß wie kriege ich die Tabelle ins ERPOM? Zu Programmlaufzeit schreiben ist ja nicht so kompliziert, aber dann benötige ich die Tabelle ja auch wieder im Flash, und das ist ja nicht Sinn der Sache...


In Bascom gibt es eine Funktion "Write Buffer to Eeprom". Bin mir nicht 100%, aber doch ziemlich sicher, dass ich die in Ponyprog und Yaap auch gesehen habe.

Wenn deine Software zum Programmieren des µC das nicht kann, müsstest du deine Daten eigentlich auch mit einem anderen Programm direkt in den EEPROM schreiben können.

Goldfinger
24.06.2005, 08:44
gedanken zur EEprom version: :-k
geschrieben werden muss die Tabelle ja nur einmal, entweder am Programmanfang einmal eine function aufrufen die das macht, oder evtl. sogar von einem anderen, denn die Daten bleiben ja drin.
Stimmt. Bloß wenn ich die Tabelle von dem Programm selber in EEPROM schreiben lasse, hab ich die Daten ja wieder im Flash :-(
Wie erzeuge ich eine Datei mit meiner Tabelle, die dann von Ponyprog etc. ins EEPROM geschieben wird?
Zum auslesen benötigst Du jetzt auch einen Index um an einen bestimmten Wert zu kommen, diesen nachher einfach verwenden um die Speicheradresse des EEprom zu berechnen.
Das ist klar.
weiter zu bedenken ist, das es 512 Bytes im EEprom gibt, (die Du jetzt garnicht nutzt),
das SRam hat 1KB das dann 1/4 belegt wäre,
also würde ich hier versuchen das EEProm zu verwenden, jenachdem was das Programm sonst machen muss.
:-kSo sehe ich das auch. Im Moment liegt mein EEPROM brach und die Tabelle verstopft meinen Flash und SRAM.

Kann mit jemand sagen, wie ich eine Datei mit meiner Tabelle erzeuge, die dann von Ponyprog etc. ins EEPROM geschieben wird?

Gruss,
Philip

Minifriese
24.06.2005, 11:47
Kann mit jemand sagen, wie ich eine Datei mit meiner Tabelle erzeuge, die dann von Ponyprog etc. ins EEPROM geschieben wird?

Moin!

Die Daten im EEPROM sind eigentlich nicht gross formatiert, es ist nur eine Ansammlung von Bytes. Wenn ein Wert aus mehreren Bytes besteht, muss das die Auslese-Funktion beruecksichtigen und entsprechend mehrere Bytes auslesen, um z.B. ein INT zu bekommen. Dazu gibt's aber fertige Bibliotheken, die z.B. eine Funktion "eprom_read_word" oder so aehnlich haben.

Du kannst die Bytes ganz schlicht mit dem Editor in eine Datei schreiben, als .eep (kommt auf's System an) speichern und mit deiner Programmiersoftware in den Chip schiessen. Bei AVR-Studio gibt's dafuer einen schoen grossen Button, bei PonyProg findet sich bestimmt auch sowas aehnliches. Vielleicht isses hilfreich, erstmal ein Testprogramm fuer den AVR zu schreiben, das eine Reihe von Werten ins EEPROM schreibt. Wenn das im AVR gelaufen ist, kannst du das EEPROM-File per PonyProg oder AVR-Studio auslesen und gucken, wie es aussieht...
Nils

Goldfinger
26.06.2005, 23:34
So, ich habe jetzt mit einem anderen Programm die Tabelle ins EEPROM geschrieben, lade dann das richtige Programm rein, welches das EEPROM ausliest - funktioniert wohl erstmal, aber ich konnte es noch nicht komplett testen.

Um mein EEPROM-Write Programm überflüssig zu machen, muss ich also eine .EEP-Datei erstellen. Ist das eine ganz normale Binär- oder HEX-Datei? Stehen da einfach nur meine Werte Byte für Byte drinnen, oder gibt es noch Header etc.?
Welchen Editor benötoge ich dazu, oder kann ich mein EEPROM in eine Datei auslesen? Die Infos stehen da ja schon drin, was mit ordentlich Tipparbeit ersparen würde =D>
Gruß,
Philip

OldBug
27.06.2005, 11:11
Schau mal hier rein:

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#EEPROM

Goldfinger
28.06.2005, 00:24
Schau mal hier rein:

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#EEPROMDas ist genau das was ich suchte! Jetzt wird die Tabelle einfach so deklariert, das sie gleich in EEPROM geladen wird.
#include <avr/eeprom.h>

const unsigned char adresse[] __attribute__ ((section (".eeprom"))) = {,,,};

Damit ist mein Problem gelößt! Vielen Dank!
Gruß,
Philip