- Labornetzteil AliExpress         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Tabellen in MPasm & Fehlermeldung bei Page-überschreitun

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    27.01.2006
    Beiträge
    44

    Tabellen in MPasm & Fehlermeldung bei Page-überschreitun

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,

    ich würde eure Hilfe brauchen. Ich habe im Programmspeicher eine "retlw" Tabelle angelegt.
    Code:
    #define        TABLELENGTH     D'25'
    
       ....
       movwf   offset
       call       char_table
       ....
    
    char_table
       pageselw   char_table
       movf         offset,w
       addwf        PLCATH,f
       retlw         B'01001011'
       retlw         B'11000011'
       retlw         B'01011001'
       ....
    Dabei dard der addwf-Befehl aber keinen Überlauf produzieren. Ich möchte nun eine Fehlermeldung beim Assemblieren ausgeben lassen, falls das der Fall ist. Meine bisherige Lösung schluckt der Assembler nicht, meint das Label kann er nicht finden, oder der Ausdruck sei Ihm zu komplex (Da hilft auch nix den Ausdruck aufzutröseln, etc.).

    if ((char_table+TABLELENGTH) % 0x100) < low(char_table)
    error "Table crosses 256-Byte boundary"
    endif

    Wie kann ich das machen?

    Danke für Eure Hilfe
    Mario

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.12.2005
    Ort
    Euskirchen-Großbüllesheim
    Alter
    74
    Beiträge
    2.063
    Warum verwendest Du nicht PCLATH, dann spielt es keine Rolle, wo die Tabelle steht und / oder wie lang die ist ?
    http://www.domnick-elektronik.de/picasm.htm#CompGoto
    MfG Karl-Heinz
    HobbyElektronik hier klicken ....

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    27.01.2006
    Beiträge
    44
    Hallo kalledom,

    danke für den Tipp. Der code selber ist (meines erachtens) aber falsch, d.h. leidet auch an dem Überlaufproblem. Hat mich allerdings auf die Lösung geführt!
    Hier ist der "relocatable" code:

    Code:
    AnzTage
                    pageselw    TblTage        ; PCLATH setzen
                    decf        zMon,W         ; Monat - 1 nach W-Register
                    addwf       PCL,w          ; PCL + Monat
                    btfsc       STATUS,C
                    incf        PCLATH,f
                    decf        zMon,W         ; Monat - 1 nach W-Register
    TblTage         addwf       PCL,f
    
    		retlw	31
    Korrigiert mich wenn ich falsch liege!

    Grüße
    Mario

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.12.2005
    Ort
    Euskirchen-Großbüllesheim
    Alter
    74
    Beiträge
    2.063
    Hallo Mario,
    Du hast mich zum Nachdenken gebracht
    Lese doch mal die AN556 'Implementing a Table Read' von Microchip, bei mir ist jetzt der 'Groschen' gefallen. Mein Beispiel funktioniert nur, wenn die 256 Byte-Grenze nicht innerhalb der Tabelle liegt !
    Dein Vorschlag hat einen Haken: es ist unklar, was in PCLATH zum Zeitpunkt des evtl. Increment drin steht ! PCLATH ist ein Latch !
    MfG Karl-Heinz
    HobbyElektronik hier klicken ....

  5. #5
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    72
    Beiträge
    11.077
    Hallo!

    Ich bin leider kein Programmierer und deswegen mache ich es einfach.

    Vor jeder 256 Byte langen "retlw" Tabelle (look-up table) schreibe ich "ORG 0x(HH00-2)" und lade den Wert HH in PCLATH direkt vor dem Sprung in die gewähle Tabelle. Zum Beispiel für HH=7F ist ORG 0x(7F00-2), also ORG 0x7EFE.

    MfG

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    27.01.2006
    Beiträge
    44
    Hallo PICTure, kalledom,

    also ich habe mir nun die AN556 angesehen. Example 5 dort drinnen kommt dem schon recht nahe. Der Inhalt des PCLATH registers ist beim Ausführen des Table-Jump schon bekannt, d.h. 'pageselw Tbl' wird in 'movlw high(Tbl) & movwf PCLATH' umgesetzt. Oder hast Du damit was anderes gemeint?
    Die Lösung über die ORG-Anweisung ist zwar einfach, entbindet dem Programmierer aber nicht die Hausaufgaben des Assemblers mitzudenken. Ich muss dann immer aufpassen, dass der Code davor noch reinpasst. Wenn ich den ändere, muss ich wieder an der ORG-Anweisung drehen. Das ist mir einfach zu mühsam .

    Grüße
    Mario

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.12.2005
    Ort
    Euskirchen-Großbüllesheim
    Alter
    74
    Beiträge
    2.063
    Hallo Mario,
    Dein Beispiel ist richtig.
    Die Assembler-Directive 'pagesel' bzw. 'pageselw' war mir unbekannt, und was die eigentlich so macht.
    Im MPASM User's Guide habe ich 'pagesel' gefunden, jedoch nichts über 'pageselw'.
    Kennst Du den Unterschied ?

    PS: In Deinem Beispiel darf die Tabelle maximal 250 Befehle lang sein, sonst ist, wenn die 256-er Grenze nach dem 250-ten Befehl kommt, das Problem wieder da ....
    MfG Karl-Heinz
    HobbyElektronik hier klicken ....

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.02.2006
    Alter
    60
    Beiträge
    114
    pageselw benutzt das W-Register. Es wird dadurch verändert. Das muss im umgebenden Code beachtet werden.
    pagesel benutzt statt dessen bit-set Befehle (bsf). W wird nicht verändert.

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    27.01.2006
    Beiträge
    44
    Hallo Kalledom,

    phaidos hat den Unterschied zwischen pagesel und pageselw bereits erklärt, da kann ich nicht mehr zufügen. Sollte in der Hilfe zum Assembler unter den "Direktiven" zu finden sein.

    Tabelle kann doch 255 bytes lang sein oder? Für längere Tabellen muss dann halt eine 16-bit Addition vorgeschoben werden. Wenn Bedarf besteht, überleg ich mir dazu eine effiziente Lösung und stells hier rein.

    Grüße
    Mario

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.12.2005
    Ort
    Euskirchen-Großbüllesheim
    Alter
    74
    Beiträge
    2.063
    Hallo Mario,
    ich denke, Du darfst die Addition des Tabellen-Offset mit dem Programm-Counter-Low nur 1 mal durchführen, weil sonst je nach Programm- oder Tabellen-Adresse die erste Addition keinen Übertrag ergibt, die zweite Addition 4 Befehle / Adressen weiter jedoch einen Übertrag ergeben würde, der nicht in PCLATH berücksichtigt wird.
    Deshalb darf die Tabelle auch nur 256 Adressen minus 3 Befehle lang sein.

    PS: in meinem MPASM User Guide aus dem PICStart-Paket ist nur 'pagesel' beschrieben.
    MfG Karl-Heinz
    HobbyElektronik hier klicken ....

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests