- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 8 von 8

Thema: Tabelle über Variable aufrufen bzw. lesen

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    30.12.2006
    Beiträge
    57

    Tabelle über Variable aufrufen bzw. lesen

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,
    um mein Problem zu schildern, hol ich etwas weit aus:

    in Bascom gibt es die Funktion LOOKUP. Damit besteht die Möglichkeit eine Variable aus einer bestimmten Position einer sog. Tabelle zu lesen.
    ich verwende diese Funktion eigentlich sehr gern, um mehrere aufeinander folgende Byte aufzurufen und z.B. zu einem Videocontroller zu schicken.

    Die Bascom Syntax sieht so aus: var = LOOKUP ( value, label ).
    in var "steht" der code von der Position (value) der Tabelle (label).

    Um jetzt die Funktion für mehrere Tabellen nutzen zu können, muss ich diese über CASE oder IF auswählen:

    if font = 0 then par = Lookup(G,Font_8x
    if font = 2 then par = Lookup(G,Font_11x11)
    if font = 3 then par = Lookup(G,Font_32x32)
    if font = 4 then par = Lookup(G,Font_48x47)

    bei 5 zeichensätzen ist das ja noch ok, aber nicht wirklich elegant.
    Nun meine Frage: gibt es eine Möglichkeit LABEL irgendwie als Variable zu definieren?
    Its not a bug its a feature

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Ich kann's jetzt nicht kontrollieren, aber ich glaube nicht, dass das geht.
    Du kannst aber die Berechnung auch recht einfach selbst machen und dann mit CPEEK(adr) das Byte dort lesen
    Code:
    DIM Font AS WORD
    DIM Charadr  AS WORD
    DIM Pattern as Byte
        Font = LOADLABEL ( font_8x8)      ' address aktueller Font
        charadr = Font + Offset               ' row * column
        pattern = CPEEK(charadr)     '
    Das sind zwar mehr Bascom-Zeilen, aber im Code entspricht das in etwa dem Lookup

    Ich würde es so machen, denn da kann man auch ev. gleich die aktuelle Row (oder Column) als zusätzliches Offset dazunehmen und es geht dann sogar schneller.
    Da kommt's aber auf dein Konzept an.

    Hilft das ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    30.12.2006
    Beiträge
    57
    Danke für die Antwort,
    aber das ist wie du schon selber schreibst nur eine andere form von LOOKUP.
    Das Problem, das ich diesen Programmteil für JEDEN Font bzw. jede Bitmap oder JEDES Pictogram usw. schreiben muss, hab ich damit nicht gelöst, oder?

    aber trotzdem danke
    tschüß SZ
    Its not a bug its a feature

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Moment. Wieso mehrfach schreiben ?
    LOADLABEL mußt du nur machen, wenn du den Font wechselst. Is ja logisch.
    SUmme Font + Offset und den Cpeek mußt du natürlich bei jedem Zeichen machen. Aber nur einmal (als subroutine für alle fonts und Maps)
    Aber, je nach struktur, läßt der Cpeek auch lesen in der Schleife mit wählbarem Adress-Inkrement zu.
    Das alles macht der Lookup in keiner Version
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    30.12.2006
    Beiträge
    57
    kapier ich jetzt nicht. ich häng mal ein bsp. an.
    Evt. hilft das um mein Problem zu verdeutlichen. Das ist jetzt nur für 2 Bitmap
    Code:
    '-------------------- bitmap die 2te -------------------------------------------
    bmp:
    x = x1: y = y1                                                                  ' pos für set cursor
    
    select case bmp
    
    case 1
       HH = lookup(0,logoavr)                                                      ' byte horz.
       VV = lookup(1,logoavr)                                                      ' byte vert.
    case 2
       HH = lookup(0,rahmen)
       VV = lookup(1,rahmen)
    end select
    
    G = 2
    for V = 1 to VV
          gosub S1D_CSR_RW                                                          ' mit x, y startpos setzen
          cmd = &H42                                                                ' comando speicher schreiben
          gosub s1d_send_cmd
       for H = 1 to HH                                                             ' eine zeile schreiben
    
    if bmp = 1 then par = lookup(G,logoavr)
    if bmp = 2 then par = lookup(G,rahmen)
         gosub  S1D_SEND_PAR                                                       ' das G raus zum s1d
    incr G                                                                          ' nächstes G
       next H                                                                    '
     x = x1
     incr y
    next V
    
    return
    Its not a bug its a feature

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Ok, denk' ich mir durch.
    ich muß jetzt nur grad einen Standortwechsel vornehmen und rühr mich dann.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    30.12.2006
    Beiträge
    57
    keine hektik...
    ging heute sowiso schon zz. mir langt es für heute -> ich mach mal schluss.
    tschüss sz
    Its not a bug its a feature

  8. #8
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    So etwa würde das mit CPEEK aussehen.
    Statt "g" ist nun ein WORD-Zeiger "posit".
    Ich weiss nicht, ob du in der ausgaberoutine das "G" brauchst ?


    Code:
    Dim Fontadr As Word                                         'current font base
    Dim Posit As Word                                           'sendout pointer
    
    '-------------------- bitmap die 2te -------------------------------------------
    bmp:
       X = X1 : Y = Y1                                          ' pos für set cursor
    
    
    ' ---------- Set Font (nur, wenn geändert)  -------------------
       Select Case Bmp
       Case 1
          Fontadr = Loadlabel(logoavr)
       Case 2
          Fontadr = Loadlabel(rahmen)
       End Select
    
    
    
    
    ' ---------- Sendout -------------------
       Posit = Fontadr
       Hh = Cpeek(posit)                                        ' dimension horiz
       Incr Posit
       Vv = Cpeek(posit)                                        ' dimension vertik
       Incr Posit                                               '
       For V = 1 To Vv
          Gosub S1d_csr_rw                                      ' mit x, y startpos setzen
          Cmd = &H42                                            ' comando speicher schreiben
          gosub s1d_send_cmd
          For H = 1 To Hh                                       ' eine zeile schreiben
             Par = Cpeek(posit)                                 ' FlashMem lesen
             Gosub S1d_send_par                                 ' das G raus zum s1d
             Incr Posit                                         ' nächste position
          Next H                                                '
          X = X1
          Incr Y
       Next V
    return

    Ich weiss nicht, wie du die Zeigenauswahl machst. Eigentlich wär besser, statt bmp = "0" oder "1" gleich direkt die fontadresse zu verwenden

    also :
    Code:
    Dim Fontadr As Word                                         'current font base
    Dim Posit As Word                                           'sendout pointer
    
    
    '-------------------------------------------
          Fontadr = Loadlabel(logoavr)  
          gosub send_bmp
    '------------------ ODER EBEN ----------
          Fontadr = Loadlabel(rahmen)   ' oder "Rahmen"
          gosub send_bmp
    
    
    '-------------------- bitmap die 2te -------------------------------------------
    send_bmp:
       X = X1 : Y = Y1                                          ' pos für set cursor
    
    ' ---------- Sendout -------------------
       Posit = Fontadr
       Hh = Cpeek(posit)                         ' dimension horiz
       Incr Posit                                      ' next
       Vv = Cpeek(posit)                         ' dimension vertik
       Incr Posit                                      ' next
       For V = 1 To Vv
          Gosub S1d_csr_rw                       ' mit x, y startpos setzen
          Cmd = &H42                               ' comando speicher schreiben
          gosub s1d_send_cmd
          For H = 1 To Hh                          ' eine zeile schreiben
             Par = Cpeek(posit)                           ' FlashMem lesen
             Gosub S1d_send_par                        ' das G raus zum s1d
             Incr Posit                                 ' nächste position
          Next H                                        ' schleife
          X = X1
          Incr Y
       Next V
    return
    Was im Einzelnen besser ist, hängt vom Programm-konzept ab, logo


    Die Schleifen schreien eigentlich nach Inline-Assembler, aber das kannst du immer noch machen.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

Berechtigungen

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

Solar Speicher und Akkus Tests