Forum: Mikrocontroller und Digitale Elektronik menü fürs display


von Alex P. (dynamo)


Lesenswert?

Hallo,

ich steuere über einen Atmega32 ein Display an. Der Atmega soll später
verschiedene Routinen ausführen und dazu brauch ich ein Menü. Habe hier
im Forum mehrere Ansätze zu struct-Aufbauten gesehen, habe auch
verschiedenes probiert. Doch bis jetzt hab ich es nicht geschaft, in
eine struct zu schreiben, noch sie auszulesen. Wenn ich also
meinetwegen eine struct wie folgt habe:

typedef struct def_menue
{
  const unsigned char text;
  int8_t previous;
  int8_t next;
  int8_t now;
} menue;

wie kann ich jetzt z.B. den ersten Eintrag mit meinetwegen "Uhrzeit"
erstellen? Und dann z.B. Uhrzeit.next einen Wert zuweisen?

Das allein reicht ja anscheinend nicht:

const menue Uhrzeit PROGMEM={"hallo",1,2,3};

Kann mir das vielleicht einer erklären? Wäre sehr nett!

dnm

von Thomas P. (Gast)


Lesenswert?

def_menue myMenue[10]; //Jetzt hast Du 10*dein def_menue

myMenue[0].text = "Hallo Welt";
myMenue[0].next = 1;

und so weiter.

von Alex P. (dynamo)


Lesenswert?

so funktioniert es nicht. Wenn dort def_menu dortsteht, kommt der fehler
"def_menue" undeclared, aber auch "menue" führt nicht zum erfolg. so
hab ichs jetzt:

#include <inttypes.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/delay.h>
#ifndef F_CPU
#define F_CPU 8000000UL     /* Quarz mit 8Mhz  */
#endif

typedef struct def_menue
{
  const unsigned char text;
  int8_t previous;
  int8_t next;
  int8_t now;
} menue;

int main(void)
{
menue myMenue[10]; //Jetzt hast Du 10*dein def_menue

myMenue[0].text = "Hallo Welt";
myMenue[0].next = 1;

}

beim compilieren:
-------- begin --------
avr-gcc (GCC) 3.4.6
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is
NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE.


Linking: test.elf
avr-gcc -mmcu=atmega32 -I. -gstabs   -Os -funsigned-char
-funsigned-bitfields -f
pack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=
-std=gnu99 -Wp
,-M,-MP,-MT,test.o,-MF,.dep/test.elf.d    --output test.elf
-Wl,-Map=test.map,--
cref    -lm
C:/Programme/WinAVR/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/cr 
tm32.o:
In function `__vectors':
../../../../../avr-libc-1.4.4/crt1/gcrt1.S:51: undefined reference to
`main'
make: *** [test.elf] Error 1

von Philipp Karbach (Gast)


Lesenswert?

Es muss "struct menue myMenue[10];" heißen, standard C brauch das
struct noch. viel spaß ;)

von Philipp Karbach (Gast)


Lesenswert?

und den struct kannst du auch so aufbauen:
struct cmd
{
// alle members
};

von Alex P. (dynamo)


Angehängte Dateien:

Lesenswert?

also es muß wirklich ein Fehler sein, der mir im Moment nicht auffällt.
Es lässt sich nicht compilieren?!

stimmen die includes?
das makefile? (im anhang)
hab den avr-gcc 3.4.6
was könnt das sein?

Programm leicht abgeändert/vereinfacht:

#include <inttypes.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/delay.h>
#ifndef F_CPU
#define F_CPU 8000000UL     /* Quarz mit 8Mhz  */
#endif

struct menue
{
  const unsigned char text;
  int8_t previous;
  int8_t next;
  int8_t now;
} ;

int main(void)
{
struct menue myMenue[10]; //Jetzt hast Du 10*dein def_menue

myMenue[0].text = "Hallo Welt";
myMenue[0].next = 1;

}

von Alex P. (dynamo)


Lesenswert?

ok. im makefile stimmte der SCR= nicht
hier jetzt ein "anständiger" Fehler:

Compiling: test.c
avr-gcc -c -mmcu=atmega32 -I. -gstabs   -Os -funsigned-char
-funsigned-bitfields
 -fpack-struct -fshort-enums -Wall -Wstrict-prototypes
-Wa,-adhlns=test.lst  -st
d=gnu99 -Wp,-M,-MP,-MT,test.o,-MF,.dep/test.o.d test.c -o test.o
test.c: In function `main':
test.c:21: error: assignment of read-only member `text'
test.c:21: warning: assignment makes integer from pointer without a
cast
make: *** [test.o] Error 1

von Alex P. (dynamo)


Lesenswert?

und ich mein statt SCR natürlich SRC, sry
(SRC=test.c hat gefehlt)

von Christian (Gast)


Lesenswert?

Also, Du deklarierst text als "const" (und somit als "read-only")
und änderst es dann doch. Erklärt den ersten Fehler. Außerdem
deklarierst Du text als "char" (also als einzelnen Buchstaben) und
nicht als "char *" (Zeiger auf Buchstaben / String). Erklärt die
zweite Warnung.

Sicher, dass Du nicht ein C-Buch lesen möchtest?

von Alex P. (dynamo)


Lesenswert?

"Sicher, dass Du nicht ein C-Buch lesen möchtest?"

Hallo Christian, du hast recht, in solchen Dingen hab ich noch
Nachholbedarf, nur bin ich so lange vor dem PC gesessen, dass ich die
einfache Lösung nich mehr gesehen hatte. Die PROGMEM option hat mich
dann völlig aus dem Konzept geworfen. Jetzt klappt alles und ich dank
euch nochmal! Hab ja auch wieder was dazu gelernt!

Schönen Tag noch!

dnm

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.