Assembler, PIC16F88

OP #1843162
Lesenswert?

Guten Tag

Ich bearbeite ein Assembler Programm, dass ich nicht selber geschrieben 
habe. Meine Kenntnisse halten sich bis jetzt in Grenzen und deshalb 
verstehe ich folgender Programmteil nicht und weshalb ich es nicht 
builden kann. Das Programm war schonmal genau so fehlerfrei in Betrieb.

Programmteil:


    fill  (nop),TaskError-$
    org    0x0F9
TaskError
    movlw  b'00000001'
    BANKSEL  WDTCON
    movwf  WDTCON
    banksel  PORTA
    goto  $



Ergibt folgender Error:

Error[151]   D:\WORK\MOTUSANTRIEBFRONTEGO\MOTUSANTRIEBFRONTEGO_MAB.ASM
333 : Operand contains unresolvable labels or is too complex


Vielen Dank schon mal und Gruss

drumstick
Gast #1843171
Lesenswert?

Die erste Zeile ist so wies aussieht ein Makro. Poste mal dessen 
Programmcode.

Der Rest des Programmauschnitts schreibt 0x01 in WDTCON und geht in eine 
Endlosschleife, bis der Watchdog-Reset eintritt.

Könnte sein dass der Assembler mit den beiden TaskError durcheinander 
kommt, da es einmal als Label und einmal als Variable vorkommt.
Gast #1843191
Lesenswert?

0x01 in WDTCON bewirkt, dass der WDT einen Vorteiler von 1:32 hat und 
der WDT eingeschaltet ist (sofern der WDT per Software einschaltbar ist; 
das steht dann im Bit WDTEN im CONFIG1 Word, dort kann man einstellen, 
ob der WDT immer aus ist oder ob er per WDTCON einschaltbar ist).

Der Fill-Befehl füllt hier ab der aktuellen Stelle bis zum Flag 
Taskerror (0x0F9) den Speicher mit NOPs
Gast #1843193
Lesenswert?

Sascha schrieb:
> Könnte sein dass der Assembler mit den beiden TaskError durcheinander
> kommt, da es einmal als Label und einmal als Variable vorkommt.

Definitiv nicht, der Ausdruck TaskError-$ aus der ersten Zeile bedeutet 
nichts anderes als die Subtraktion des ProgramCounter-Wertes von der 
Adresse des Labels TaskError. Resultat ist eine Konstante, keine 
Variable.

M. B. schrieb:
> 333 : Operand contains unresolvable labels or is too complex

Welches ist denn die Zeile 333, aus deinem Posting geht das nicht 
hervor?

Gruß,
Edson
Gast #1843214
Lesenswert?

M. B. schrieb:
> Zeile 333:
>
>     fill  (nop),TaskError-$

So, und jetzt fehlt nur noch die Auflösung des Makros fill...

Falls das Makro in deinem Projekt gar nicht vorhanden ist, haben wir die 
Ursache der Fehlermeldung. "fill" wird dann als Label interpretiert und 
MPASM ärgert sich über das Komma nach dem (nop), da nach einem Befehl 
ein Operand erwartet wird.

Gruß,
Edson
Gast #1843221
Lesenswert?

Der Fehler hier ist, daß er die Adresse vom Label TaskError
nicht kennt. Ich würde tippen, du versucht das Programm mittels Linker
zu assemblieren und der Code braucht aber eine absoluten Assembler code.
Aber, lass einfach die betreffende Zeile weg, denn dann wird der Code 
mit
"addwf 0xff" gefüllt, in deinem Source ist es dasselbe, da danach eine
Endlosschleife kommt (goto $) und das W-Register sowie die Statusbits 
(Carry/Zero)egal sind.

Bei gelinktem Code trifft man die Codewörter "code" sowie "cblock" im
Sourcefile
Gast #1843245
Lesenswert?

Nein, fill füllt den Bereich. Es ist eine Assembler Direktive und kein 
Macro.
Anstelle des Labels könntest du auch folgendes schreiben:

  fill 0,0x0f9-$ ; nop=0, ev könnte auch das das problem sein

Trotzdem, ob ein NOP = 0 oder ein ADDLW 0xFF = 3FFF verwendet wird, ist
in diesem Code egal, einfach die Zeile fill weglöschen.
Der einzige Unterschied ist, daß man bei 3FFF nachträglich noch code
reinpatchen kann, aber wenn du die codeprotection verwendest, ist das 
auch
nicht mehr möglich.
OP #1843264
Lesenswert?

Also die Zeile mit dem fill hab ich jetzt ausgeklammert. Folgender 
Fehler erhalte ich jetzt:

Programmteil:

    org  0x2100
    de  0x00,0x00,0x00
    de  0x00
    de  0xFF
    de  0xFF
    de  0x00,0x00,0x00
    de  0x00,0x00
    de  0x00
    de  0x00
    de  0xFF
    de  0x00
    de  0x00
;-----------------------------------------
  ;  fill 0x00,0x21D0-$
;------------------------------------------
    org  0x21D0
    dt  "HAWA AG Ver. 1.0"
    org  0x21E0
    dt  "Antrieb.asm     "
    org  0x21F0
    dt  "240120061200"
    de  0x00,0x00,0x00
;-----------------------------------------
    org  0x21FF
    de  0x00
    end


Fehlermeldung:

Error - section '.org_1' can not fit the absolute section.

Section '.org_1' start=0x00000004, length=0x0000010e


Was bedeutet das??

Danke und Gruss

M.
Gast #1843339
Lesenswert?

Hallo, pass auf, wenn du im EEprom Fill verwendest, dann ist das was
anderes als auf der von dir beschriebenen Codestelle.
Adressen ab 0x2100 sind EEprom. Ansonsten steht da FF drin und du 
erwartest
warscheinlich ein 0. Ob da ein "dt" = retlw zulässig ist, weiß ich auch
nicht recht, bzw was da dann effektiv in das EEprom landet.
Gast #1843342
Lesenswert?

ganz einfach, der Label kann nicht aufgelöst werden, warscheinlich da 
ein object File erstellt wird, welcher dann erst gelinkt wird, und 
deshalb
steht die Adresse für die Berechnung nicht fest, welche aber für die
Assemblerdirektive gebraucht wird. Der Label wird die Adresse 0x0f9 
haben.
Wenn du aber "fill 0,0x0f9-$" schreiben würdest, dann dürfte der 
Assembler kein problem damit haben.

fill  (nop),TaskError-$
    org    0x0F9
TaskError

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren