Das Problem ist, dass du den Kram erst einmal aus dem Flash rauslesen musst ... dafür gibt es in in "pgmspace.h" entsprechende Methoden.
mfG
Markus
Druckbare Version
Das Problem ist, dass du den Kram erst einmal aus dem Flash rauslesen musst ... dafür gibt es in in "pgmspace.h" entsprechende Methoden.
mfG
Markus
Du solltest dir mal ein Tutorial zu Progmem durchlesen. Ich glaube unter mikrokontroller.net oder avrfreaks gibts da was ganz brauchbares.
sast
ich schau mal, besser wär en link, aber trotzdem Danke.
Hi,
hab es nun endlich hinbekommen.
die #include <avr/pgmspace.h>
hält alle Lösungen parat.
Da ich meine Informationen in einer Strukturen im PROGMEM Speicher abgelegt hab, kopiere ich mir beim Zugriff darauf die Struktur in eine lokale Struktur im .data Bereich.
Bin froh, dass es jetzt endlich hingehauen hat.Code:norm_t Norm_tmp; // local Norm structure element
PGM_VOID_P p_Norm_tmp; // local pointer to PROGMEM Norm structure
p_Norm_tmp = (U32*) pgm_read_word_far( (U16) &NormArray[i] );
memcpy_P(&Norm_tmp, p_Norm_tmp, sizeof(norm_t));
// einfacher Zugriff
... = (S8*) Norm_tmp.normName;
... = (S8*) Norm_tmp.normUnit;
\:D/
Danke, für die Hilfe und Beschleunigung in die richtige Richtung.
Hi,
so jetzt hab ich noch ein Problem von früher.
.c Ausschnitt
und die .hCode:
#include <avr/io.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <avr/pgmspace.h>
#include "main.h"
void initio(void);
void delay_ms(unsigned int ms);
norm_t NormArray[] PROGMEM =
{ // Faktor Decimal Unit Name
{1, 0, { "V"}, {"VOLTAGE 1"}}, // 0
{1, 3, { "mV"}, {"VOLTAGE 2"}}, // 1
{1, 0, { "A"}, {"CURRENT 1"}}, // 2
};
int main( void )
{
int i;
unsigned char normAmound;
normAmound = sizeof (NormArray);
initio();
...
der Compiler frisst das Zwar aber das ist leider nur die halbe Miete.Code:
...
#define NORM_UNIT_MAXLEN 4
#define NORM_NAME_MAXLEN 12
typedef char PROGMEM prog_S8;
typedef unsigned char PROGMEM prog_U8;
typedef struct Norm
{
prog_U8 factor;
prog_U8 decimal;
const prog_S8 sNormUnit[NORM_UNIT_MAXLEN];
const prog_S8 sNormName[NORM_NAME_MAXLEN];
}norm_t;
das sizeof() ergibt immer entweder die größe eines Elements oder die Pointergröße 2.
egal in welcher Konstellation:
normAmound = sizeof (NormArray);
normAmound = sizeof ( (norm_t*) NormArray);
normAmound = sizeof ( (norm_t**) NormArray);
normAmound = sizeof ( (PGM_P) NormArray);
normAmound = sizeof ( (PGM_P*) NormArray);
normAmound = sizeof ( (PGM_VOID_P) NormArray);
normAmound = sizeof ( (PGM_VOID_P*) NormArray);
gibt es eine Möglichkeit die größe des Arrays zu ermitteln?
Sorry,
hab da was verwechselt das
normAmound = sizeof (NormArray);
passt.
:)
Manchmal hilft es, wenn man einfach mal mit jemandem darüber gesprochen hat. Dann kommt man bereits alleine auf die Lösung.
Geht mir auch oft so.
sast
Hi,
mal ne andere Frage:
wird das sizeof (NormArray); eigendlich zur laufzeit gebildet oder macht das der Preprozessor?
mit anderen Worten geht das auch (ich habs nicht hinbekommen :-k ) ?
#define NORMAMOUND (sizeof (NormArray))
Weder noch. Das macht der Compiler.Zitat:
Zitat von chientech
Preprozessor Defines sind immer nur reine Textersetzungen. Wenn du irgendwo im Source "NORMAMOUND" schreibst, ersetzt er das stumpf durch "(sizeof (NormArray))". Das Ganze funktioniert also nur dort, wo NormArray für den Compiler vollständig bekannt ist.Zitat:
mit anderen Worten geht das auch (ich habs nicht hinbekommen :-k ) ?
#define NORMAMOUND (sizeof (NormArray))