Forum: Mikrocontroller und Digitale Elektronik LCD Menue AvrButterfly


von Oliver S. (eragon)


Lesenswert?

Hallo zusammen

Bin gerade dabei mir eine "schöne" Menue Struktur zu zimmern. Nun hab 
ich mir den AVRButterfly als vorlage genommen.
DIeser wird in vielen LCD Threads hier als vorlage verwendet. Nun hab 
ich da noch eine frage:

Was bedeutet dieses __flash?

Quelltext AVR Butterfly:
1
// menu.h
2
3
__flash typedef struct
4
{
5
    unsigned char state;
6
    unsigned char input;
7
    unsigned char nextstate;
8
} MENU_NEXTSTATE;
9
10
11
__flash typedef struct
12
{
13
    unsigned char state;
14
    char __flash *pText;
15
    char (*pFunc)(char input);
16
} MENU_STATE;
17
18
19
// Menu text
20
__flash char MT_AVRBF[]                     = "AVR Butterfly";
21
__flash char MT_TIME[]                      = "Time";
22
__flash char MT_TIME_CLOCK[]                = "Clock";
23
__flash char MT_TIME_CLOCK_ADJUST[]         = "Adjust Clock";
24
__flash char MT_TIME_CLOCKFORMAT_ADJUST[]   = "Change Clock Format";
25
__flash char MT_TIME_DATE[]                 = "Date";
26
__flash char MT_TIME_DATE_ADJUST[]          = "Adjust Date";
27
__flash char MT_TIME_DATEFORMAT_ADJUST[]    = "Change Date Format";
28
__flash char MT_MUSIC[]                     = "Music";
29
__flash char MT_VCARD[]                     = "Name";
30
__flash char MT_ENTERNAME[]                 = "Enter name";
31
__flash char MT_TEMPERATURE[]               = "Temperature";
32
__flash char MT_VOLTAGE[]                   = "Voltage";
33
__flash char MT_LIGHT[]                     = "Light";
34
__flash char MT_OPTIONS[]                   = "Options";
35
__flash char MT_OPTIONS_DISPLAY[]           = "Display";
36
__flash char MT_OPTIONS_DISPLAY_CONTRAST[]  = "Adjust contrast";
37
__flash char MT_OPTIONS_DISPLAY_SEG[]       = "Browse segments";
38
__flash char MT_VCARD_DOWNLOAD_NAME[]       = "Download Name";
39
__flash char MT_OPTIONS_BOOT[]              = "Bootloader";
40
__flash char MT_OPTIONS_POWER_SAVE[]        = "Power Save Mode";
41
__flash char MT_OPTIONS_AUTO_POWER_SAVE[]   = "Auto Power Save";
42
43
44
45
MENU_NEXTSTATE menu_nextstate[] = {
46
//  STATE                       INPUT       NEXT STATE
47
    {ST_AVRBF,                  KEY_PLUS,   ST_OPTIONS},
48
    {ST_AVRBF,                  KEY_NEXT,   ST_AVRBF_REV},
49
    {ST_AVRBF,                  KEY_MINUS,  ST_TIME},
50
51
    {ST_AVRBF_REV,              KEY_PREV,   ST_AVRBF},
52
    
53
    {ST_TIME,                   KEY_PLUS,   ST_AVRBF},
54
    {ST_TIME,                   KEY_NEXT,   ST_TIME_CLOCK},
55
    {ST_TIME,                   KEY_PREV,   ST_AVRBF},
56
    {ST_TIME,                   KEY_MINUS,  ST_MUSIC},
57
    
58
    {ST_TIME_CLOCK,             KEY_PLUS,   ST_TIME_DATE},
59
    {ST_TIME_CLOCK,             KEY_NEXT,   ST_TIME_CLOCK_FUNC},
60
    {ST_TIME_CLOCK,             KEY_PREV,   ST_TIME},
61
    {ST_TIME_CLOCK,             KEY_MINUS,  ST_TIME_DATE},
62
63
    {ST_TIME_CLOCK_ADJUST,      KEY_PLUS,   ST_TIME_CLOCKFORMAT_ADJUST}, 
64
    {ST_TIME_CLOCK_ADJUST,      KEY_ENTER,  ST_TIME_CLOCK_ADJUST_FUNC},
65
    {ST_TIME_CLOCK_ADJUST,      KEY_PREV,   ST_TIME_CLOCK_FUNC},    
66
    {ST_TIME_CLOCK_ADJUST,      KEY_MINUS,  ST_TIME_CLOCKFORMAT_ADJUST}, 
67
68
    {ST_TIME_CLOCKFORMAT_ADJUST, KEY_PLUS,  ST_TIME_CLOCK_ADJUST},
69
    {ST_TIME_CLOCKFORMAT_ADJUST, KEY_ENTER, ST_TIME_CLOCKFORMAT_ADJUST_FUNC},
70
    {ST_TIME_CLOCKFORMAT_ADJUST, KEY_PREV,  ST_TIME_CLOCK_FUNC},
71
    {ST_TIME_CLOCKFORMAT_ADJUST, KEY_MINUS, ST_TIME_CLOCK_ADJUST},
72
73
    {ST_TIME_DATE,              KEY_PLUS,   ST_TIME_CLOCK},
74
    {ST_TIME_DATE,              KEY_NEXT,   ST_TIME_DATE_FUNC},
75
    {ST_TIME_DATE,              KEY_PREV,   ST_TIME},
76
    {ST_TIME_DATE,              KEY_MINUS,  ST_TIME_CLOCK},
77
78
    {ST_TIME_DATE_ADJUST,       KEY_PLUS,   ST_TIME_DATEFORMAT_ADJUST},
79
    {ST_TIME_DATE_ADJUST,       KEY_ENTER,  ST_TIME_DATE_ADJUST_FUNC},
80
    {ST_TIME_DATE_ADJUST,       KEY_PREV,   ST_TIME_DATE_FUNC},
81
    {ST_TIME_DATE_ADJUST,       KEY_MINUS,  ST_TIME_DATEFORMAT_ADJUST},
82
        
83
    {ST_TIME_DATEFORMAT_ADJUST, KEY_PLUS,   ST_TIME_DATE_ADJUST},
84
    {ST_TIME_DATEFORMAT_ADJUST, KEY_ENTER,  ST_TIME_DATEFORMAT_ADJUST_FUNC},
85
    {ST_TIME_DATEFORMAT_ADJUST, KEY_PREV,   ST_TIME_DATE_FUNC},
86
    {ST_TIME_DATEFORMAT_ADJUST, KEY_MINUS,  ST_TIME_DATE_ADJUST},
87
88
    {ST_MUSIC,                  KEY_PLUS,   ST_TIME},
89
    {ST_MUSIC,                  KEY_NEXT,   ST_MUSIC_SELECT},
90
    {ST_MUSIC,                  KEY_PREV,   ST_AVRBF},
91
    {ST_MUSIC,                  KEY_MINUS,  ST_VCARD},
92
93
    {ST_SOUND_MUSIC,            KEY_NEXT,   ST_MUSIC_SELECT},
94
    {ST_SOUND_MUSIC,            KEY_PREV,   ST_MUSIC},
95
96
    {ST_VCARD,                  KEY_PLUS,   ST_MUSIC},
97
    {ST_VCARD,                  KEY_NEXT,   ST_VCARD_FUNC},
98
    {ST_VCARD,                  KEY_PREV,   ST_AVRBF},
99
    {ST_VCARD,                  KEY_MINUS,  ST_TEMPERATURE},
100
       
101
    {ST_VCARD_ENTER_NAME,       KEY_PLUS,     ST_VCARD_DOWNLOAD_NAME},
102
    {ST_VCARD_ENTER_NAME,       KEY_ENTER,    ST_VCARD_ENTER_NAME_FUNC},
103
    {ST_VCARD_ENTER_NAME,       KEY_PREV,     ST_VCARD_FUNC},    
104
    {ST_VCARD_ENTER_NAME,       KEY_MINUS,    ST_VCARD_DOWNLOAD_NAME},
105
    
106
    {ST_VCARD_DOWNLOAD_NAME,    KEY_PLUS,     ST_VCARD_ENTER_NAME},
107
    {ST_VCARD_DOWNLOAD_NAME,    KEY_ENTER,    ST_VCARD_DOWNLOAD_NAME_FUNC},
108
    {ST_VCARD_DOWNLOAD_NAME,    KEY_PREV,     ST_VCARD_FUNC},    
109
    {ST_VCARD_DOWNLOAD_NAME,    KEY_MINUS,    ST_VCARD_ENTER_NAME},    
110
    
111
    {ST_TEMPERATURE,            KEY_PLUS,   ST_VCARD},
112
    {ST_TEMPERATURE,            KEY_NEXT,   ST_TEMPERATURE_FUNC},
113
    {ST_TEMPERATURE,            KEY_PREV,   ST_AVRBF},
114
    {ST_TEMPERATURE,            KEY_MINUS,  ST_VOLTAGE},
115
    
116
    {ST_VOLTAGE,                KEY_PLUS,   ST_TEMPERATURE},
117
    {ST_VOLTAGE,                KEY_NEXT,   ST_VOLTAGE_FUNC},
118
    {ST_VOLTAGE,                KEY_PREV,   ST_AVRBF},
119
    {ST_VOLTAGE,                KEY_MINUS,  ST_LIGHT},
120
    
121
    {ST_LIGHT,                  KEY_PLUS,   ST_VOLTAGE},
122
    {ST_LIGHT,                  KEY_NEXT,   ST_LIGHT_FUNC},
123
    {ST_LIGHT,                  KEY_PREV,   ST_AVRBF},
124
    {ST_LIGHT,                  KEY_MINUS,  ST_OPTIONS},
125
    
126
    {ST_OPTIONS,                KEY_PLUS,   ST_LIGHT},
127
    {ST_OPTIONS,                KEY_NEXT,   ST_OPTIONS_DISPLAY},
128
    {ST_OPTIONS,                KEY_PREV,   ST_AVRBF},
129
    {ST_OPTIONS,                KEY_MINUS,  ST_AVRBF},
130
    
131
    {ST_OPTIONS_DISPLAY,        KEY_PLUS,   ST_OPTIONS_AUTO_POWER_SAVE},
132
    {ST_OPTIONS_DISPLAY,        KEY_NEXT,   ST_OPTIONS_DISPLAY_CONTRAST},
133
    {ST_OPTIONS_DISPLAY,        KEY_PREV,   ST_OPTIONS},
134
    {ST_OPTIONS_DISPLAY,        KEY_MINUS,  ST_OPTIONS_BOOT},
135
    
136
    {ST_OPTIONS_DISPLAY_CONTRAST, KEY_ENTER,    ST_OPTIONS_DISPLAY_CONTRAST_FUNC},
137
    {ST_OPTIONS_DISPLAY_CONTRAST, KEY_PREV,     ST_OPTIONS_DISPLAY},
138
139
    {ST_OPTIONS_BOOT,             KEY_PLUS,     ST_OPTIONS_DISPLAY},
140
    {ST_OPTIONS_BOOT,             KEY_NEXT,     ST_OPTIONS_BOOT_FUNC},
141
    {ST_OPTIONS_BOOT,             KEY_PREV,     ST_OPTIONS},
142
    {ST_OPTIONS_BOOT,             KEY_MINUS,    ST_OPTIONS_POWER_SAVE},
143
144
    {ST_OPTIONS_POWER_SAVE,       KEY_PLUS,     ST_OPTIONS_BOOT},
145
    {ST_OPTIONS_POWER_SAVE,       KEY_NEXT,     ST_OPTIONS_POWER_SAVE_FUNC},
146
    {ST_OPTIONS_POWER_SAVE,       KEY_PREV,     ST_OPTIONS},
147
    {ST_OPTIONS_POWER_SAVE,       KEY_MINUS,    ST_OPTIONS_AUTO_POWER_SAVE},
148
        
149
    {ST_OPTIONS_AUTO_POWER_SAVE,  KEY_PLUS,     ST_OPTIONS_POWER_SAVE},
150
    {ST_OPTIONS_AUTO_POWER_SAVE,  KEY_NEXT,     ST_OPTIONS_AUTO_POWER_SAVE_FUNC},
151
    {ST_OPTIONS_AUTO_POWER_SAVE,  KEY_PREV,     ST_OPTIONS},
152
    {ST_OPTIONS_AUTO_POWER_SAVE,  KEY_MINUS,    ST_OPTIONS_DISPLAY},
153
        
154
    {0,                         0,          0}
155
};
156
157
158
MENU_STATE menu_state[] = {
159
//  STATE                               STATE TEXT                  STATE_FUNC
160
    {ST_AVRBF,                          MT_AVRBF,                   NULL},
161
    {ST_AVRBF_REV,                      NULL,                       Revision},
162
    {ST_TIME,                           MT_TIME,                    NULL},
163
    {ST_TIME_CLOCK,                     MT_TIME_CLOCK,              NULL},
164
    {ST_TIME_CLOCK_FUNC,                NULL,                       ShowClock},
165
    {ST_TIME_CLOCK_ADJUST,              MT_TIME_CLOCK_ADJUST,       NULL},
166
    {ST_TIME_CLOCK_ADJUST_FUNC,         NULL,                       SetClock},
167
    {ST_TIME_CLOCKFORMAT_ADJUST,        MT_TIME_CLOCKFORMAT_ADJUST, NULL},
168
    {ST_TIME_CLOCKFORMAT_ADJUST_FUNC,   NULL,                       SetClockFormat},
169
    {ST_TIME_DATE,                      MT_TIME_DATE,               NULL},
170
    {ST_TIME_DATE_FUNC,                 NULL,                       ShowDate},
171
    {ST_TIME_DATE_ADJUST,               MT_TIME_DATE_ADJUST,        NULL},
172
    {ST_TIME_DATE_ADJUST_FUNC,          NULL,                       SetDate},    
173
    {ST_TIME_DATEFORMAT_ADJUST,         MT_TIME_DATEFORMAT_ADJUST,  NULL},
174
    {ST_TIME_DATEFORMAT_ADJUST_FUNC,    NULL,                       SetDateFormat},     
175
    {ST_MUSIC,                          MT_MUSIC,                   NULL},
176
    {ST_MUSIC_SELECT,                   NULL,                       SelectSound},
177
    {ST_MUSIC_PLAY,                     NULL,                       Sound},
178
    {ST_VCARD,                          MT_VCARD,                   NULL},
179
    {ST_VCARD_FUNC,                     NULL,                       vCard},
180
    {ST_VCARD_ENTER_NAME,               MT_ENTERNAME,               NULL},
181
    {ST_VCARD_DOWNLOAD_NAME,            MT_VCARD_DOWNLOAD_NAME,     NULL},
182
    {ST_VCARD_ENTER_NAME_FUNC,          NULL,                       EnterName},
183
    {ST_VCARD_DOWNLOAD_NAME_FUNC,       NULL,                       RS232},
184
    {ST_TEMPERATURE,                    MT_TEMPERATURE,             NULL},
185
    {ST_TEMPERATURE_FUNC,               NULL,                       TemperatureFunc},
186
    {ST_VOLTAGE,                        MT_VOLTAGE,                 NULL},
187
    {ST_VOLTAGE_FUNC,                   NULL,                       VoltageFunc},
188
    {ST_LIGHT,                          MT_LIGHT,                   NULL},
189
    {ST_LIGHT_FUNC,                     NULL,                       LightFunc},
190
    {ST_OPTIONS,                        MT_OPTIONS,                 NULL},
191
    {ST_OPTIONS_DISPLAY,                MT_OPTIONS_DISPLAY,         NULL},
192
    {ST_OPTIONS_DISPLAY_CONTRAST,       MT_OPTIONS_DISPLAY_CONTRAST,NULL},
193
    {ST_OPTIONS_DISPLAY_CONTRAST_FUNC,  NULL,                       SetContrast},
194
    {ST_OPTIONS_BOOT,                   MT_OPTIONS_BOOT,            NULL},
195
    {ST_OPTIONS_BOOT_FUNC,              NULL,                       BootFunc},    
196
    {ST_OPTIONS_POWER_SAVE,             MT_OPTIONS_POWER_SAVE,      NULL},
197
    {ST_OPTIONS_POWER_SAVE_FUNC,        NULL,                       PowerSaveFunc},
198
    {ST_OPTIONS_AUTO_POWER_SAVE,        MT_OPTIONS_AUTO_POWER_SAVE, NULL},
199
    {ST_OPTIONS_AUTO_POWER_SAVE_FUNC,   NULL,                       AutoPower},
200
201
    {0,                                 NULL,                       NULL},
202
    
203
};

Danke für eure Hilfe

Gruss oli

von Karl H. (kbuchegg)


Lesenswert?

Oliver Schmutz schrieb:

> DIeser wird in vielen LCD Threads hier als vorlage verwendet. Nun hab
> ich da noch eine frage:
>
> Was bedeutet dieses __flash?

Dein AVR hat 3 Typen von Speicher eingebaut

   EEPROM         vom Programm aus beschreibbar, vom Programm aus
                  lesbar. Behält seinen Inhalt auch nach dem
                  Stromabschalten. Langsam im Zugriff.

   SRAM           beschreibbar, lesbar, schnell, aber leider: nach dem
                  Stromabschalten ist der Inhalt weg

   FLASH          nur lesbar. zum Beschreiben braucht man einen
                  externen Programmer oder einen Bootlader im AVR
                  selber.
                  Dort wird normalerweise das Programm abgespeichert
                  man kann aber auch natürlich konstante Daten dorthin
                  verfrachten. Der Zugriff ist zwar etwas aufwändiger
                  verglichen mit dem SRAM, aber wenn das keine Rolle
                  spielt ...
                  Geht auch nicht beim Stromabschalten verloren, und
                  der AVR hat, im Gegensatz zu den anderen beiden
                  Speicherarten jede Menge davon.



Was also denkst du, wird wohl das __flash in deinem C-Programm bedeuten?

von Oliver S. (eragon)


Lesenswert?

naja....Sinn ergibt das für mich noch nicht ganz. Warum sollte er das 
Struct explizit ins flash schreiben?..mache ich ja sowieso beim 
Programmiervorgang. Und isn eeprom erscheint mir auch nicht besonders 
sinnvoll.

Wo liegt da bei mir der Denkfehler?

Danke für die schnelle Antwort.

Gruss Oli

von Karl H. (kbuchegg)


Lesenswert?

Oliver Schmutz schrieb:
> naja....Sinn ergibt das für mich noch nicht ganz. Warum sollte er das
> Struct explizit ins flash schreiben?

Weil dein AVR zb 16kByte Flash hat, aber nur 2kByte SRAM

von Oliver S. (eragon)


Lesenswert?

Also zur kontrolle: Wenn ich die Texte nicht mit __flash speichere dan 
schreibt er die ins SRAM? Dan wären die nach Power on/off nicht mehr da?
Irgendwie blick ich da noch nicht durch.

Hab auch schon LCD menue mit switch case erstellt. Da hab ich noch nie 
was exlizit ins flash laden müssen. Und nach power on/off wars noch da.

Sorry für die schwierigkeiten.

Gruss Oli

von Karl H. (kbuchegg)


Lesenswert?

Oliver Schmutz schrieb:
> Also zur kontrolle: Wenn ich die Texte nicht mit __flash speichere dan
> schreibt er die ins SRAM?

Beides :-)

Denn irgendwie müssen die Texte ja nach dem Einschalten ja erst mal ins 
SRAM kommen.

> Dan wären die nach Power on/off nicht mehr da?
> Irgendwie blick ich da noch nicht durch.

Wenn dein Programm hochfährt sorgt die System-Initialisierung dafür, 
dass das SRAM seine von dir vordefinierten Werte bekommt. Im Falle von 
Texten bleibt aber nichts anderes übrig, als die vom Flash ins SRAM zu 
kopieren, damit sie das Programm dann auch dort vorfindet.

> Da hab ich noch nie
> was exlizit ins flash laden müssen.
> Und nach power on/off wars noch da.

Das ist eine Spezialität des IAR COmpilers. Der legt alles was mit const 
definiert wurde, automatisch ins Flash. Hat seine Vorteile, hat aber 
auch seine Nachteile.

von Oliver S. (eragon)


Lesenswert?

Also das heisst wen ich die die Struct mit __flash angebe kopiert er 
diese nicht ins SRAM? Köennte man das so sagen? Oder wo liegt den jetzt 
hier der Vorteil?

Die Texte würde er ja sowieso ins SRAM schreiben. Also wäre das __flash 
in dieser Zeile eigentlich hinfällig?
__flash char MT_AVRBF[]                     = "AVR Butterfly";

Oder nicht?

Gruss Oli

von Karl H. (kbuchegg)


Lesenswert?

Oliver Schmutz schrieb:
> Also das heisst wen ich die die Struct mit __flash angebe kopiert er
> diese nicht ins SRAM? Köennte man das so sagen?

An dieser Stelle:
Das steht mit Sicherheit alles mehr oder weniger ausführlich in deiner 
Compilerdoku.

> Die Texte würde er ja sowieso ins SRAM schreiben.

Sagt wer?

> Also wäre das __flash
> in dieser Zeile eigentlich hinfällig?
> __flash char MT_AVRBF[]                     = "AVR Butterfly";
>

Warum soll das hinfällig sein?
Wenn ich weiß, dass sich dieser Text sowieso nie unter Prgorammkontrolle 
ändern wird, brauch ich ihn auch nicht im SRAM haben. Und schon sind 
wieder 14 Bytes eingespart, die ich für Berechnungsvariablen sinnvoller 
verwenden kann.

Aber: Details dazu stehen in deiner Compilerdoku, wie das wirklich 
gehandhabt wird.

von Oliver S. (eragon)


Lesenswert?

Karl heinz Buchegger schrieb:
> Oliver Schmutz schrieb:
>> Also das heisst wen ich die die Struct mit __flash angebe kopiert er
>> diese nicht ins SRAM? Köennte man das so sagen?
>
> An dieser Stelle:
> Das steht mit Sicherheit alles mehr oder weniger ausführlich in deiner
> Compilerdoku.

okey. Werde ich mir anschauen.

>> Die Texte würde er ja sowieso ins SRAM schreiben.
>
> Sagt wer?

hab ich irgendwie aus deiner aussage oben so interpretiert:

>Wenn dein Programm hochfährt sorgt die System-Initialisierung dafür,
>dass das SRAM seine von dir vordefinierten Werte bekommt. Im Falle von
>Texten bleibt aber nichts anderes übrig, als die vom Flash ins SRAM zu
>kopieren, damit sie das Programm dann auch dort vorfindet.


>> Also wäre das __flash
>> in dieser Zeile eigentlich hinfällig?
>> __flash char MT_AVRBF[]                     = "AVR Butterfly";
>>
>
> Warum soll das hinfällig sein.
> Wenn ich weiß, dass sich dieser Text sowieso nie unter Prgorammkontrolle
> ändern wird, brauch ich ihn auch nicht im Flash haben.

du meinst nicht ins RAM? oder wie jetzt?
> Und schon sind
> wieder 14 Bytes eingespart, die ich für Berechnungsvariablen sinnvoller
> verwenden kann.

Danke für deine Hilfe. Gruss Oli

von Karl H. (kbuchegg)


Lesenswert?

Oliver Schmutz schrieb:
>> Wenn ich weiß, dass sich dieser Text sowieso nie unter Prgorammkontrolle
>> ändern wird, brauch ich ihn auch nicht im Flash haben.
>
> du meinst nicht ins RAM? oder wie jetzt?

War ein Tippfehler von mir, den ich in der Zwischenzeit korrigiert 
hatte.
Aber du hast mitgedacht. Ja, ich meinte SRAM

von Oliver S. (eragon)


Lesenswert?

oke...super Sache...das bringt mich wieder ein Stück weiter. Danke dir 
für deine Hilfe. Bzw dein durchhaltewille. :D

Greez aus der Schweiz

von dsPicler (Gast)


Lesenswert?

Ich weiß dass der Artikel schon älter is, aber ich hol ihn trotzdem mal 
aus der Versenkung.

Wo findet sich den der gesamte Quellcode zu obigem Codelisting? Hab da 
jetzt online nix (mehr?) gefunden...

Danke^^

von spess53 (Gast)


Lesenswert?

Hi

>Wo findet sich den der gesamte Quellcode zu obigem Codelisting? Hab da
>jetzt online nix (mehr?) gefunden...

Bei Atmel?

http://www.atmel.com/dyn/resources/prod_documents/AVRButterfly_application_rev07.zip

MfG Spess

von Zukunft (Gast)


Lesenswert?


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.