- LiFePO4 Speicher Test         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 16 von 16

Thema: Menü Creator

  1. #11
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    Anzeige

    Praxistest und DIY Projekte
    siehste, war doch garnicht so schwer

    die ASM-Geschichten machen den Code zwar nicht besonders
    übersichtlich aber "never change a running system" [-X

    mal nebenbei, auch mein system hat seine schwächen
    aber läuft
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  2. #12
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.03.2004
    Beiträge
    185
    es gibt noch gute Nachrichten:
    nachdem wir vor 2 Jahren das Thema diskutiert hatten:
    "State Machine: LOADLABEL in DATA einsetzen"https://www.roboternetz.de/phpBB2/ze...hlight=#191075
    wurde in Bascom in der Version 1.11.8.9 den Befehl ADR und ADR2 ergänzt

    Das gibt uns ganz neue Möglichkeiten die Datensätze anzulegen \/ und den Resourcenfresser "Select Case" zu beerdigen
    Codeschnipsel
    Code:
    S10:
             ADR2 Null : ADR2 S20 : ADR2 Null : ADR2 S11            'Key_plus|Key_minus|Key_prev|Key_next
             ADR2 Null                                           'Subroutine for current State
             Data "1 Butterfly Bascom"                          'Menue Display Text
    Anbei eine geänderte Fassung des Beispiel-Menüs. Die Codelänge schrumpfte von 3300Byte auf sagenhafte 2200 Byte und liegt damit mit der alten unübersichtlichen Fassung aus dem AVR Butterfly Evaluation Kit gleichauf

    Anbei wieder vollständig lauffähiger Code für den Bascom-Simulator (getestet 1.11.9.1)
    Code:
    'Beispiel für ein State Machine Menü
    'Das Beispiel ist für den BASCOM-Simulator angepasst worden
    '  getestet mit Bascom 1.11.9.1
    '  Codelänge 2242 Byte
    
    $regfile = "m32def.dat"
    $framesize = 32                                             'Stack
    $swstack = 32
    $hwstack = 64
    
    '
    'Hinweis: Im Simulator müssen die Eingaben in dem blauen "Terminal Emulator Window" erfolgen!
    'Auf der Tastatur ergeben sich für die VIER Joystick-Positionen folgende Umsetzungen
    '
    '              [Key_plus ]
    ' [Key_prev]   [         ]    [Key_next]
    '              [Key_minus]
    '
    '
    '              [ Taste_8 ]
    ' [Taste_4 ]   [         ]    [Taste_6 ]
    '              [ Taste_2 ]
    '
    'bzw. im ASCII-Code:
    
    Dim Keycode_string As String * 4
    'Key_plus|Key_minus|Key_prev|Key_next
    Keycode_string = "{056}{050}{052}{054}"
    Dim Keycode(4) As Byte At Keycode_string Overlay
    Const Key_null = 0                                          'keine Taste gedrückt
    
    'Pins des LCD-Modules setzen ggf. an eigene Anschlüsse anpassen
    Config Lcd = 16 * 1
    Initlcd
    Cls
    
    '******** Joystick/Key Settings ***********************************************
    Dim Key As Byte                                             'key in Mainloop
    
    '******** LCD *****************************************************************
    Dim Lcd_textbuffer As String * 25
    
    '******** allg Variablen ******************************************************
    Dim I As Byte , J As Byte
    Dim W As Word
    
    '********* State Variables ****************************************************
    Dim State As Word                                           'aktueller State
    Dim State_renew As Byte                                     'Flag
    Dim State_gosub As Word                                     'aktuelles Unterprogramm
    
    'Initial state variables
    State_renew = 1
    State = Loadlabel(s10)                                      'Startbildschirm
    Key = Key_null                                              'keine Taste gedrückt
    
    
    '********** MAIN-Loop *********************************************************
    Do
        'Menüeintrag und Tastencodes finden und ggf. State wechseln
        'hier nur Tastendruck auswerten
        Gosub Change_state
        'Pointer nach Statuswechsel neu setzen
        If State_renew = 1 Then Gosub Change_state
        'Unterprogramm des aktuellen State anspringen
        LDS R31, {State_gosub+1}                                'High see Bascom-Doc Mixing ASM and BASIC
        LDS R30, {State_gosub}                                  'Low
        LSR R31                                                 'Division durch 2 (Alternativ ADR verwenden)
        ROR R30
        'Call zum Sub
        ICALL
    
        'Displaytext auslesen
        Read Lcd_textbuffer
    
       '---------------------------------------------------------------
       'place for your own code in main loop
       '---------------------------------------------------------------
    
       'LCD refresh wenn Menü verändert
       If State_renew = 1 Then
          State_renew = 0
          Gosub Lcd_print
       End If
    
       'Tastaturabfrage mit Halt nur für Simulator, ansonsten Sleep+Timer_ISR verwenden!!
        Key = Waitkey()
    
     Loop
    End
    
    '********* State routines ***************************************************
    '---------------------------------------------------------------
    'Subroutine: Change_state
    'Call from:  main loop
    'Purpose:    Status der State Machine feststellen und ggf. Wechseln
    'Result:     Pointer auf State / Variable State_renew
    '---------------------------------------------------------------
    Change_state:
        lds R8, {State}
        lds R9, {State + 1}
        For I = 1 To 4
          Read W
          If Key = Keycode(i) Then
               If W <> Loadlabel(null) Then
                  State_renew = 1
                  Key = Key_null                                'reset key status after get a new state of state machine (prevent influence on GOSUBs)
                  State = W
               End If
          End If
        Next I
        Read State_gosub                                        'Adesse des akt. Unterprogramms einlesen
    Return
    
    '---------------------------------------------------------------
    'DATA:       State Machine
    'Result:     Pointers auf States , Unterprogramme
    '            Menütexte
    '---------------------------------------------------------------
    
    Null:
             'Null is a dummy flag for State and Gosub -> do nothing
             Return
    
    S10:
             ADR2 Null : ADR2 S20 : ADR2 Null : ADR2 S11            'Key_plus|Key_minus|Key_prev|Key_next
             ADR2 Null                                           'Subroutine for current State
             Data "1 Butterfly Bascom"                          'Menue Display Text
    S11:
                 ADR2 Null : ADR2 Null : ADR2 S10 : ADR2 Null       'Key_plus|Key_minus|Key_prev|Key_next
                 ADR2 Null
                 Data "11 Rev 2"
    S20:
             ADR2 S10 : ADR2 S30 : ADR2 Null : ADR2 S21
             ADR2 Null
             Data "2 Time"
    S21:
                 ADR2 Null : ADR2 S22 : ADR2 S20 : ADR2 S23
                 ADR2 Null
                 Data "21 Clock"
    S22:
                 ADR2 S21 : ADR2 Null : ADR2 S20 : ADR2 S24
                 ADR2 Null
                 Data "22 Date"
    S23:                                                        'Show HH:MM:SS
                       ADR2 Null : ADR2 S24 : ADR2 S21 : ADR2 S25
                       ADR2 Showclock
                       Data ""
    S24:                                                        'Show DD:MM:YY
                       ADR2 S23 : ADR2 Null : ADR2 S22 : ADR2 S26
                       ADR2 Showdate
                       Data ""
    S25:
                       ADR2 S27 : ADR2 Null : ADR2 S23 : ADR2 S65
                       ADR2 Null
                       Data "211 Adjust Clock"
    S26:
                       ADR2 Null : ADR2 S28 : ADR2 S24 : ADR2 S66
                       ADR2 Null
                       Data "221 Adjust Date"
    S27:
                       ADR2 Null : ADR2 S25 : ADR2 S23 : ADR2 S67
                       ADR2 Null
                       Data "212 Clock Format"
    S28:
                       ADR2 S26 : ADR2 Null : ADR2 S23 : ADR2 S68
                       ADR2 Null
                       Data "222 Date Format"
    S30:
             ADR2 S20 : ADR2 S40 : ADR2 Null : ADR2 S31
             ADR2 Null
             Data "3 DataLogger"
    S31:
                 ADR2 Null : ADR2 S32 : ADR2 S30 : ADR2 S35
                 ADR2 Null
                 Data "31 Log Cycle"
    S32:
                 ADR2 S31 : ADR2 S33 : ADR2 S30 : ADR2 S36
                 ADR2 Null
                 Data "32 Delete Flash"
    S33:
                 ADR2 S32 : ADR2 S34 : ADR2 S30 : ADR2 S37
                 ADR2 Null
                 Data "33 Show LogCount"
    S34:
                 ADR2 S33 : ADR2 Null : ADR2 S30 : ADR2 S38
                 ADR2 Null
                 Data "34 Print to RS232"
    S35:                                                        'HH:MM
                       ADR2 Null : ADR2 Null : ADR2 S31 : ADR2 Null
                       ADR2 Datalogger_setloginterval
                       Data ""
    S36:
                       ADR2 Null : ADR2 Null : ADR2 S32 : ADR2 S76
                       ADR2 Null
                       Data "321 RIGHT Delete DF"
    S37:                                                        '1234
                       ADR2 Null : ADR2 Null : ADR2 S33 : ADR2 Null
                       ADR2 Datalogger_logcount
                       Data ""
    S38:
                       ADR2 Null : ADR2 Null : ADR2 S34 : ADR2 S78
                       ADR2 Null
                       Data "341 RIGHT Print9600B"
    S40:
            ADR2 S30 : ADR2 S50 : ADR2 Null : ADR2 S41
            ADR2 Null
            Data "4 ADC"
    S41:
               ADR2 Null : ADR2 S42 : ADR2 S40 : ADR2 S45
               ADR2 Null
               Data "41 Temperature"
    S42:
               ADR2 S41 : ADR2 S43 : ADR2 S40 : ADR2 S46
               ADR2 Null
               Data "42 Voltage"
    S43:
               ADR2 S42 : ADR2 S44 : ADR2 S40 : ADR2 S47
               ADR2 Null
               Data "43 ADC Port RAW"
    S44:
               ADR2 S43 : ADR2 Null : ADR2 S40 : ADR2 S48
               ADR2 Null
               Data "44 Battery"
    S45:                                                        '+24°C
                       ADR2 Null : ADR2 Null : ADR2 S41 : ADR2 Null
                       ADR2 Temperaturefunc
                       Data ""
    S46:                                                        '0 mV
                       ADR2 Null : ADR2 Null : ADR2 S42 : ADR2 Null
                       ADR2 Voltagefunc
                       Data ""
    S47:                                                        'CH:RAW
                       ADR2 Null : ADR2 Null : ADR2 S43 : ADR2 Null
                       ADR2 Adc_raw_func
                       Data ""
    S48:                                                        '2900mV
                       ADR2 Null : ADR2 Null : ADR2 S44 : ADR2 Null
                       ADR2 Adc_batt_func
                       Data ""
    S50:
            ADR2 S40 : ADR2 Null : ADR2 Null : ADR2 S51
            ADR2 Null
            Data "5 Options"
    
    S51:
               ADR2 Null : ADR2 S52 : ADR2 S50 : ADR2 S56
               ADR2 Null
               Data "51 LCD contrast"
    S52:
               ADR2 S51 : ADR2 S53 : ADR2 S50 : ADR2 S57
               ADR2 Null
               Data "52 Bootloader"
    
    S53:
               ADR2 S52 : ADR2 S54 : ADR2 S50 : ADR2 S83
               ADR2 Null
               Data "53 LCD OFF"
    
    S54:
               ADR2 S53 : ADR2 S55 : ADR2 S50 : ADR2 S58
               ADR2 Null
               Data "54 LCD Auto Power"
    
    S55:
               ADR2 S54 : ADR2 Null : ADR2 S50 : ADR2 S59
               ADR2 Null
               Data "55 Key Click"
    S56:                                                        '0...15
                       ADR2 Null : ADR2 Null : ADR2 S51 : ADR2 Null
                       ADR2 Setcontrast
                       Data ""
    S57:
                       ADR2 Null : ADR2 Null : ADR2 S52 : ADR2 S87
                       ADR2 Null
                       Data "521 RIGHT bootloader"
    
    S58:                                                        'OFF/5..90min
                       ADR2 Null : ADR2 Null : ADR2 S54 : ADR2 Null
                       ADR2 Autopower
                       Data ""
    S59:                                                        'ON/OFF
                       ADR2 Null : ADR2 Null : ADR2 S55 : ADR2 Null
                       ADR2 Keyclick_set
                       Data ""
    'Untermenüs zu State 25 bis 28
    S65:                                                        'sub for "211 Adjust Clock"
                              ADR2 S67 : ADR2 Null : ADR2 S23 : ADR2 Null
                              ADR2 Setclock
                              Data ""
    S66:                                                        'sub for "221 Adjust Date"
                              ADR2 Null : ADR2 S68 : ADR2 S24 : ADR2 Null
                              ADR2 Setdate
                              Data ""
    S67:                                                        'sub for "212 Clock Format"
                              ADR2 Null : ADR2 S65 : ADR2 S23 : ADR2 Null
                              ADR2 Setclockformat
                              Data ""
    S68:                                                        'sub for  "222 Date Format"
                              ADR2 S66 : ADR2 Null : ADR2 S24 : ADR2 Null
                              ADR2 Setdateformat
                              Data ""
    'Untermenüs zu State 36 und 38
    S76:                                                        'sub for  "321 RIGHT Delete DF"
                              ADR2 Null : ADR2 Null : ADR2 S36 : ADR2 Null
                              ADR2 Datalogger_erase
                              Data ""
    S78:                                                        'sub for  "341 RIGHT Print9600B"
                              ADR2 Null : ADR2 Null : ADR2 S38 : ADR2 Null
                              ADR2 Datalogger_rs232
                              Data ""
    'Untermenü zu State 53 und 57
    S83:                                                        'sub for  "53 LCD OFF"
                              ADR2 Null : ADR2 Null : ADR2 S53 : ADR2 Null
                              ADR2 Power_off_func
                              Data ""
    S87:                                                        'sub for "521 RIGHT bootloader"
                              ADR2 Null : ADR2 Null : ADR2 S57 : ADR2 Null
                              ADR2 Bootfunc
                              Data ""
    
    
    '********* LCD SUB routines ***************************************************
    '---------------------------------------------------------------
    'Subroutine: Lcd_print
    'Call from:  anywhere
    'Purpose:    gibt Lcd_textbuffer auf dem LCD-Display aus
    'Result:     LCD
    '---------------------------------------------------------------
    Lcd_print:                                                  'Print lcd_textbuffer
        Cls
        Lcd Lcd_textbuffer
        State_renew = 0
    Return
    
    '********* SUB Clock routines**************************************************
    Showclock:
      'Show the clock on the LCD
      Lcd_textbuffer = "HH:MM:SS"
      Gosub Lcd_print
    Return
    
    Setclock:
      'Adjusts the Clock
      Lcd_textbuffer = "HH=11"
      Gosub Lcd_print
    Return
    
    Setclockformat:
      'Adjusts the Clockformat (12H or 24H)
      Lcd_textbuffer = "12H / 24H"
      Gosub Lcd_print
    Return
    
    '********* SUB date routines **************************************************
    Showdate:
       'Show the date on the LCD
       Lcd_textbuffer = "DD.MM.YY"
       Gosub Lcd_print
    Return
    
    Setdate:
       'Adjusts the Date
       Lcd_textbuffer = "Month=12"
       Gosub Lcd_print
    Return
    
    '---------------------------------------------------------------
    Setdateformat:
       'Adjusts the Dateformat "DDMMYY" , "MMDDYY" , "YYMMDD"
       Lcd_textbuffer = "DDMMYY/YYMMDD"
       Gosub Lcd_print
    Return
    
    '********* Datalogger routines ************************************************
    Datalogger_setloginterval:
       'set the datalog intervall HOUR:MINUTES
       Lcd_textbuffer = "HH:MM"
       Gosub Lcd_print
    Return
    
    Datalogger_erase:
      'erase the dataflash
      State = Loadlabel(s32)                                    'St_datalogger_erase
      State_renew = 1
      Gosub Change_state
    Return
    
    Datalogger_logcount:
      'Show DF_LogCount
       Lcd_textbuffer = "1234"
       Gosub Lcd_print
    Return
    
    Datalogger_rs232:
       'Print all DataLogs to RS232
       State = Loadlabel(s34)                                   'St_datalogger_rs232 as next status of state machine
       State_renew = 1
       Gosub Change_state
    Return
    
    Temperaturefunc:
       'temperature measurement in °C
       Lcd_textbuffer = "+24C"
       Gosub Lcd_print
    Return
    
    Voltagefunc:
     'voltage measurement mV
       Lcd_textbuffer = "0mV"
       Gosub Lcd_print
    Return
    
    Adc_raw_func:
      'ADC Temperature/Voltage/Light result as RAW
       Lcd_textbuffer = "CH:RAW"
       Gosub Lcd_print
    Return
    
    Adc_batt_func:
      'battery voltage measurement
       Lcd_textbuffer = "2900mV"
       Gosub Lcd_print
    Return
    
    '********* Sub MENU / OPTIONS  ********************************
    Setcontrast:
       'Adjust the LCD contrast
       Lcd_textbuffer = "0...15"
       Gosub Lcd_print
    Return
    
    Bootfunc:
       State = Loadlabel(s10)                                   'St_avrbf as next status of state machine
       State_renew = 1
       Gosub Change_state
    Return
    
    Power_off_func:
      'LCD OFF
      State = Loadlabel(s53)                                    'Return  State is St_options_power_off
    Return
    
    Autopower:
       'Enable/Disable auto power save
       Lcd_textbuffer = "ON/OFF"
       Gosub Lcd_print
    Return
    
    Keyclick_set:
        'Enable/Disable keyclick
       Lcd_textbuffer = "ON/OFF"
       Gosub Lcd_print
    Return
    Zur Info die Struktur des Testmenü:
    Bild hier  

  3. #13
    dl1akp
    Gast

    State Machine ?

    Hi Leute,

    Kann mir als Dummy mal einer sagen:

    Was zum Geier ist eine State Machine???

    Danke, schönes Wochenende
    dl1akp

  4. #14
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    Im Prinzip ist es ganz einfach.
    Programme werden ja immer komplett ausgeführt.
    Sprich, es wird im Flussdiagramm oben angefangen und sich
    nach unten durchgearbeitet.
    Bei großen komplexen Programmen kann das aber ärger geben.
    Z.B. Du hast eine Vorrichtung, die mit sagen wir mal CAN-Bus, Display,
    Tastenpanel, RS232, und diverse Sensoren dann kann z.B.
    Der Displayrefresh bei jedem Programmdurchlauf die ganze
    Geschichte mächtig ausbremsen. Kommt dann noch dazu
    Tastenabfrage kanns ganz finster werden.
    Dein Bus wird durch die tausende von PRogrammschritten
    fürs Userinterface arschlangsam.
    Geht man nun hin und fragt nur alle x Programmdurchläufe
    die Tasten ab gewinnt man schon Ausführungszeit.
    Tut man nun das Display nur bei bestimmten Events, z.B.
    Tastendruck aktualisieren gewinnt man nochmal ne Menge
    Ausführungszeit.
    Man speichert also die Zustände, die States, des Programmablaufs
    in eine selbst definierte Struktur. Die einzelnen Programmteile
    gehen dabei immer in die Hauptroutine zurück, wo dann
    geprüft wird ob nun ein Zustand ansteht ... z.B. ein Telegramm
    vom Bus. Von dort gehts dann in die entsprechende Subroutine
    und wieder zurück in die Mainloop.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  5. #15
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.08.2004
    Beiträge
    197

    Super Erklärung, für mich als Baumschüler

    Respekt !!!
    Ich habe selten soviel gute Information auf einmal in einem Forum gelesen.
    Ich habe wiedermal viel gelernt von euch.
    Danke !! =D>

  6. #16
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    Bei nem Menü fürs Display, also nem User Interface,
    wird die Sache etwas verzwickter.
    N Menü lässt sich eigentlich recht einfach
    zusammenschustern. Per Select - Case
    Menüpunkte auswählen und warten auf Tastenabfrage
    ist einfach, aber ne Struktur, die ständig rein und raus
    springt und dabei die Zustände festhält ist ne ganz
    andere Geschichte.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

Seite 2 von 2 ErsteErste 12

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests