Forum: Mikrocontroller und Digitale Elektronik PIC18 Inline Assembler verwenden


von Klatec (Gast)


Lesenswert?

Hallo Zusammen

Ich habe ein Problem mit der Verwendung des Inline Assembler.

_asm
      lfsr  FSR0,256
      movlw  0
      movff  WREG,zaehl
      movlw  0
loop1:
      movff  WREG,POSTINC0
      incf  WREG,f
      decfsz  zaehl,f
      bra    loop1
_endasm

Dieses Programm habe ich aus einem Buch und soll den interenen RAM 
beschreiben. Leider kommt es zu einigen Fehlermeldungen.

Error [1250] 'lfsr' operand one must be a literal
Error [1250] 'incf' operand two must be a literal
Error [1251] 'incf' operand count mismatch
Error [1250] 'decfsz' operand two must be a literal
Error [1251] 'decfsz' operand count mismatch

Kann mir jemand helfen?
Danke.
von Holger W. (holgerw)


Lesenswert?

So kompiliert er es bei mir.
Hast du zaehl deklariert/definiert ?
lfsr will nur die Angabe welches der FSR
die anderen Befehle brauchen den 3.Parameter ob Access oder Banked
1
_asm
2
      lfsr  0,255
3
      movlw  0
4
      movff  WREG,zaehl
5
      movlw  0
6
loop1:
7
      movff  WREG,POSTINC0
8
      incf  WREG,f,0
9
      decfsz  zaehl,f,0
10
      bra    loop1
11
_endasm
Holger
von Klatec (Gast)


Lesenswert?

Hallo Holger

Jetzt habe ich nur mehr zwei Fehler

'incf' operand two must be a literal
'decfsz' operand two must be a literal

incf  WREG,f,0
decfsz  zaehl,f,0

Wie hast du 'f' deklariert?

Ich habe einfach die Speicherstelle 0 im SFR Bank 0 verwendet.
#define f    TXB2CON
von HolgerW (Gast)


Lesenswert?

Hallo, statt f 1 verwenden, oder so definieren:

#define f 1
#define w 0

Blick ins Datenblatt des PIC könnte nicht schaden ;-)
f heisst, er speichert das Ergebnis ins Register (file) ab,
w ins WREG.

incf  WREG,f,0 ist quasi ein Sonderfall das Register WREG ist ja w

Generell solltest du es vermeiden inline Assembler zu verwenden.
Mit C lässt sich das auch lösen.
Zumal du ja gar nicht weisst, ob du einfach so in den RAM schreiben 
darfst, kann ja sein dass C dort was wichtiges abgelegt hat.

Holger
von Klatec (Gast)


Lesenswert?

Danke Holger für deine Mühe.
Jetzt entstehen keine Fehler mehr.

Ich möchte beim Hochlauf des MC, also bevor irgend welche Variablen 
beschrieben werden, den Ram durch beschreiben und lesen jedes Bytes auf 
Korrektheit überprüfen. Ich möchte dies natürlich übergeordnet machen 
und nicht über die einzelnen Variablen. Wie könnte ich dies deiner 
Meinung nach in C machen?
von Holger W. (holgerw)


Lesenswert?

Das wurde doch in dem anderen Thread schon aufgezeigt.
Ich weiss nicht was du vor hast, aber wenn es schon dabei Probleme gibt 
?
Holger
von HolgerW (Gast)


Lesenswert?

Ich hab mir das mal angesehen, du müsstest die Startup modifizieren, die 
stehen im Compilerverzeichnis  \src\traditional\startup als c018.c
Nur dort hast du noch Zugriff auf alle RAM Variablen bevor die 
Initialisierung greift.
Warum willst du den RAM testen ? Ich hab noch nie eine defekte Zelle 
gehabt.
Wenn du es richtig machen willst musst du auch verschiedene Bitmuster 
testen.
Das halte ich für zu großen Aufwand oder hast du ein so wichtiges 
Projekt ?

HolgerW
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.