www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD Menue AvrButterfly


Autor: Oliver S. (eragon)
Datum:

Bewertung
0 lesenswert
nicht 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:
// menu.h

__flash typedef struct
{
    unsigned char state;
    unsigned char input;
    unsigned char nextstate;
} MENU_NEXTSTATE;


__flash typedef struct
{
    unsigned char state;
    char __flash *pText;
    char (*pFunc)(char input);
} MENU_STATE;


// Menu text
__flash char MT_AVRBF[]                     = "AVR Butterfly";
__flash char MT_TIME[]                      = "Time";
__flash char MT_TIME_CLOCK[]                = "Clock";
__flash char MT_TIME_CLOCK_ADJUST[]         = "Adjust Clock";
__flash char MT_TIME_CLOCKFORMAT_ADJUST[]   = "Change Clock Format";
__flash char MT_TIME_DATE[]                 = "Date";
__flash char MT_TIME_DATE_ADJUST[]          = "Adjust Date";
__flash char MT_TIME_DATEFORMAT_ADJUST[]    = "Change Date Format";
__flash char MT_MUSIC[]                     = "Music";
__flash char MT_VCARD[]                     = "Name";
__flash char MT_ENTERNAME[]                 = "Enter name";
__flash char MT_TEMPERATURE[]               = "Temperature";
__flash char MT_VOLTAGE[]                   = "Voltage";
__flash char MT_LIGHT[]                     = "Light";
__flash char MT_OPTIONS[]                   = "Options";
__flash char MT_OPTIONS_DISPLAY[]           = "Display";
__flash char MT_OPTIONS_DISPLAY_CONTRAST[]  = "Adjust contrast";
__flash char MT_OPTIONS_DISPLAY_SEG[]       = "Browse segments";
__flash char MT_VCARD_DOWNLOAD_NAME[]       = "Download Name";
__flash char MT_OPTIONS_BOOT[]              = "Bootloader";
__flash char MT_OPTIONS_POWER_SAVE[]        = "Power Save Mode";
__flash char MT_OPTIONS_AUTO_POWER_SAVE[]   = "Auto Power Save";



MENU_NEXTSTATE menu_nextstate[] = {
//  STATE                       INPUT       NEXT STATE
    {ST_AVRBF,                  KEY_PLUS,   ST_OPTIONS},
    {ST_AVRBF,                  KEY_NEXT,   ST_AVRBF_REV},
    {ST_AVRBF,                  KEY_MINUS,  ST_TIME},

    {ST_AVRBF_REV,              KEY_PREV,   ST_AVRBF},
    
    {ST_TIME,                   KEY_PLUS,   ST_AVRBF},
    {ST_TIME,                   KEY_NEXT,   ST_TIME_CLOCK},
    {ST_TIME,                   KEY_PREV,   ST_AVRBF},
    {ST_TIME,                   KEY_MINUS,  ST_MUSIC},
    
    {ST_TIME_CLOCK,             KEY_PLUS,   ST_TIME_DATE},
    {ST_TIME_CLOCK,             KEY_NEXT,   ST_TIME_CLOCK_FUNC},
    {ST_TIME_CLOCK,             KEY_PREV,   ST_TIME},
    {ST_TIME_CLOCK,             KEY_MINUS,  ST_TIME_DATE},

    {ST_TIME_CLOCK_ADJUST,      KEY_PLUS,   ST_TIME_CLOCKFORMAT_ADJUST}, 
    {ST_TIME_CLOCK_ADJUST,      KEY_ENTER,  ST_TIME_CLOCK_ADJUST_FUNC},
    {ST_TIME_CLOCK_ADJUST,      KEY_PREV,   ST_TIME_CLOCK_FUNC},    
    {ST_TIME_CLOCK_ADJUST,      KEY_MINUS,  ST_TIME_CLOCKFORMAT_ADJUST}, 

    {ST_TIME_CLOCKFORMAT_ADJUST, KEY_PLUS,  ST_TIME_CLOCK_ADJUST},
    {ST_TIME_CLOCKFORMAT_ADJUST, KEY_ENTER, ST_TIME_CLOCKFORMAT_ADJUST_FUNC},
    {ST_TIME_CLOCKFORMAT_ADJUST, KEY_PREV,  ST_TIME_CLOCK_FUNC},
    {ST_TIME_CLOCKFORMAT_ADJUST, KEY_MINUS, ST_TIME_CLOCK_ADJUST},

    {ST_TIME_DATE,              KEY_PLUS,   ST_TIME_CLOCK},
    {ST_TIME_DATE,              KEY_NEXT,   ST_TIME_DATE_FUNC},
    {ST_TIME_DATE,              KEY_PREV,   ST_TIME},
    {ST_TIME_DATE,              KEY_MINUS,  ST_TIME_CLOCK},

    {ST_TIME_DATE_ADJUST,       KEY_PLUS,   ST_TIME_DATEFORMAT_ADJUST},
    {ST_TIME_DATE_ADJUST,       KEY_ENTER,  ST_TIME_DATE_ADJUST_FUNC},
    {ST_TIME_DATE_ADJUST,       KEY_PREV,   ST_TIME_DATE_FUNC},
    {ST_TIME_DATE_ADJUST,       KEY_MINUS,  ST_TIME_DATEFORMAT_ADJUST},
        
    {ST_TIME_DATEFORMAT_ADJUST, KEY_PLUS,   ST_TIME_DATE_ADJUST},
    {ST_TIME_DATEFORMAT_ADJUST, KEY_ENTER,  ST_TIME_DATEFORMAT_ADJUST_FUNC},
    {ST_TIME_DATEFORMAT_ADJUST, KEY_PREV,   ST_TIME_DATE_FUNC},
    {ST_TIME_DATEFORMAT_ADJUST, KEY_MINUS,  ST_TIME_DATE_ADJUST},

    {ST_MUSIC,                  KEY_PLUS,   ST_TIME},
    {ST_MUSIC,                  KEY_NEXT,   ST_MUSIC_SELECT},
    {ST_MUSIC,                  KEY_PREV,   ST_AVRBF},
    {ST_MUSIC,                  KEY_MINUS,  ST_VCARD},

    {ST_SOUND_MUSIC,            KEY_NEXT,   ST_MUSIC_SELECT},
    {ST_SOUND_MUSIC,            KEY_PREV,   ST_MUSIC},

    {ST_VCARD,                  KEY_PLUS,   ST_MUSIC},
    {ST_VCARD,                  KEY_NEXT,   ST_VCARD_FUNC},
    {ST_VCARD,                  KEY_PREV,   ST_AVRBF},
    {ST_VCARD,                  KEY_MINUS,  ST_TEMPERATURE},
       
    {ST_VCARD_ENTER_NAME,       KEY_PLUS,     ST_VCARD_DOWNLOAD_NAME},
    {ST_VCARD_ENTER_NAME,       KEY_ENTER,    ST_VCARD_ENTER_NAME_FUNC},
    {ST_VCARD_ENTER_NAME,       KEY_PREV,     ST_VCARD_FUNC},    
    {ST_VCARD_ENTER_NAME,       KEY_MINUS,    ST_VCARD_DOWNLOAD_NAME},
    
    {ST_VCARD_DOWNLOAD_NAME,    KEY_PLUS,     ST_VCARD_ENTER_NAME},
    {ST_VCARD_DOWNLOAD_NAME,    KEY_ENTER,    ST_VCARD_DOWNLOAD_NAME_FUNC},
    {ST_VCARD_DOWNLOAD_NAME,    KEY_PREV,     ST_VCARD_FUNC},    
    {ST_VCARD_DOWNLOAD_NAME,    KEY_MINUS,    ST_VCARD_ENTER_NAME},    
    
    {ST_TEMPERATURE,            KEY_PLUS,   ST_VCARD},
    {ST_TEMPERATURE,            KEY_NEXT,   ST_TEMPERATURE_FUNC},
    {ST_TEMPERATURE,            KEY_PREV,   ST_AVRBF},
    {ST_TEMPERATURE,            KEY_MINUS,  ST_VOLTAGE},
    
    {ST_VOLTAGE,                KEY_PLUS,   ST_TEMPERATURE},
    {ST_VOLTAGE,                KEY_NEXT,   ST_VOLTAGE_FUNC},
    {ST_VOLTAGE,                KEY_PREV,   ST_AVRBF},
    {ST_VOLTAGE,                KEY_MINUS,  ST_LIGHT},
    
    {ST_LIGHT,                  KEY_PLUS,   ST_VOLTAGE},
    {ST_LIGHT,                  KEY_NEXT,   ST_LIGHT_FUNC},
    {ST_LIGHT,                  KEY_PREV,   ST_AVRBF},
    {ST_LIGHT,                  KEY_MINUS,  ST_OPTIONS},
    
    {ST_OPTIONS,                KEY_PLUS,   ST_LIGHT},
    {ST_OPTIONS,                KEY_NEXT,   ST_OPTIONS_DISPLAY},
    {ST_OPTIONS,                KEY_PREV,   ST_AVRBF},
    {ST_OPTIONS,                KEY_MINUS,  ST_AVRBF},
    
    {ST_OPTIONS_DISPLAY,        KEY_PLUS,   ST_OPTIONS_AUTO_POWER_SAVE},
    {ST_OPTIONS_DISPLAY,        KEY_NEXT,   ST_OPTIONS_DISPLAY_CONTRAST},
    {ST_OPTIONS_DISPLAY,        KEY_PREV,   ST_OPTIONS},
    {ST_OPTIONS_DISPLAY,        KEY_MINUS,  ST_OPTIONS_BOOT},
    
    {ST_OPTIONS_DISPLAY_CONTRAST, KEY_ENTER,    ST_OPTIONS_DISPLAY_CONTRAST_FUNC},
    {ST_OPTIONS_DISPLAY_CONTRAST, KEY_PREV,     ST_OPTIONS_DISPLAY},

    {ST_OPTIONS_BOOT,             KEY_PLUS,     ST_OPTIONS_DISPLAY},
    {ST_OPTIONS_BOOT,             KEY_NEXT,     ST_OPTIONS_BOOT_FUNC},
    {ST_OPTIONS_BOOT,             KEY_PREV,     ST_OPTIONS},
    {ST_OPTIONS_BOOT,             KEY_MINUS,    ST_OPTIONS_POWER_SAVE},

    {ST_OPTIONS_POWER_SAVE,       KEY_PLUS,     ST_OPTIONS_BOOT},
    {ST_OPTIONS_POWER_SAVE,       KEY_NEXT,     ST_OPTIONS_POWER_SAVE_FUNC},
    {ST_OPTIONS_POWER_SAVE,       KEY_PREV,     ST_OPTIONS},
    {ST_OPTIONS_POWER_SAVE,       KEY_MINUS,    ST_OPTIONS_AUTO_POWER_SAVE},
        
    {ST_OPTIONS_AUTO_POWER_SAVE,  KEY_PLUS,     ST_OPTIONS_POWER_SAVE},
    {ST_OPTIONS_AUTO_POWER_SAVE,  KEY_NEXT,     ST_OPTIONS_AUTO_POWER_SAVE_FUNC},
    {ST_OPTIONS_AUTO_POWER_SAVE,  KEY_PREV,     ST_OPTIONS},
    {ST_OPTIONS_AUTO_POWER_SAVE,  KEY_MINUS,    ST_OPTIONS_DISPLAY},
        
    {0,                         0,          0}
};


MENU_STATE menu_state[] = {
//  STATE                               STATE TEXT                  STATE_FUNC
    {ST_AVRBF,                          MT_AVRBF,                   NULL},
    {ST_AVRBF_REV,                      NULL,                       Revision},
    {ST_TIME,                           MT_TIME,                    NULL},
    {ST_TIME_CLOCK,                     MT_TIME_CLOCK,              NULL},
    {ST_TIME_CLOCK_FUNC,                NULL,                       ShowClock},
    {ST_TIME_CLOCK_ADJUST,              MT_TIME_CLOCK_ADJUST,       NULL},
    {ST_TIME_CLOCK_ADJUST_FUNC,         NULL,                       SetClock},
    {ST_TIME_CLOCKFORMAT_ADJUST,        MT_TIME_CLOCKFORMAT_ADJUST, NULL},
    {ST_TIME_CLOCKFORMAT_ADJUST_FUNC,   NULL,                       SetClockFormat},
    {ST_TIME_DATE,                      MT_TIME_DATE,               NULL},
    {ST_TIME_DATE_FUNC,                 NULL,                       ShowDate},
    {ST_TIME_DATE_ADJUST,               MT_TIME_DATE_ADJUST,        NULL},
    {ST_TIME_DATE_ADJUST_FUNC,          NULL,                       SetDate},    
    {ST_TIME_DATEFORMAT_ADJUST,         MT_TIME_DATEFORMAT_ADJUST,  NULL},
    {ST_TIME_DATEFORMAT_ADJUST_FUNC,    NULL,                       SetDateFormat},     
    {ST_MUSIC,                          MT_MUSIC,                   NULL},
    {ST_MUSIC_SELECT,                   NULL,                       SelectSound},
    {ST_MUSIC_PLAY,                     NULL,                       Sound},
    {ST_VCARD,                          MT_VCARD,                   NULL},
    {ST_VCARD_FUNC,                     NULL,                       vCard},
    {ST_VCARD_ENTER_NAME,               MT_ENTERNAME,               NULL},
    {ST_VCARD_DOWNLOAD_NAME,            MT_VCARD_DOWNLOAD_NAME,     NULL},
    {ST_VCARD_ENTER_NAME_FUNC,          NULL,                       EnterName},
    {ST_VCARD_DOWNLOAD_NAME_FUNC,       NULL,                       RS232},
    {ST_TEMPERATURE,                    MT_TEMPERATURE,             NULL},
    {ST_TEMPERATURE_FUNC,               NULL,                       TemperatureFunc},
    {ST_VOLTAGE,                        MT_VOLTAGE,                 NULL},
    {ST_VOLTAGE_FUNC,                   NULL,                       VoltageFunc},
    {ST_LIGHT,                          MT_LIGHT,                   NULL},
    {ST_LIGHT_FUNC,                     NULL,                       LightFunc},
    {ST_OPTIONS,                        MT_OPTIONS,                 NULL},
    {ST_OPTIONS_DISPLAY,                MT_OPTIONS_DISPLAY,         NULL},
    {ST_OPTIONS_DISPLAY_CONTRAST,       MT_OPTIONS_DISPLAY_CONTRAST,NULL},
    {ST_OPTIONS_DISPLAY_CONTRAST_FUNC,  NULL,                       SetContrast},
    {ST_OPTIONS_BOOT,                   MT_OPTIONS_BOOT,            NULL},
    {ST_OPTIONS_BOOT_FUNC,              NULL,                       BootFunc},    
    {ST_OPTIONS_POWER_SAVE,             MT_OPTIONS_POWER_SAVE,      NULL},
    {ST_OPTIONS_POWER_SAVE_FUNC,        NULL,                       PowerSaveFunc},
    {ST_OPTIONS_AUTO_POWER_SAVE,        MT_OPTIONS_AUTO_POWER_SAVE, NULL},
    {ST_OPTIONS_AUTO_POWER_SAVE_FUNC,   NULL,                       AutoPower},

    {0,                                 NULL,                       NULL},
    
};

Danke für eure Hilfe

Gruss oli

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Oliver S. (eragon)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Oliver S. (eragon)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Oliver S. (eragon)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Oliver S. (eragon)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Oliver S. (eragon)
Datum:

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

Autor: dsPicler (Gast)
Datum:

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

Autor: spess53 (Gast)
Datum:

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

MfG Spess

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.