mikrocontroller.net

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


Autor: Alex Pe (dynamo)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
def_menue myMenue[10]; //Jetzt hast Du 10*dein def_menue

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

und so weiter.

Autor: Alex Pe (dynamo)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Philipp Karbach (Gast)
Datum:

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

Autor: Philipp Karbach (Gast)
Datum:

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

Autor: Alex Pe (dynamo)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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;

}

Autor: Alex Pe (dynamo)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex Pe (dynamo)
Datum:

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

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Alex Pe (dynamo)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.