PIC18 Inline Assembler verwenden

Gast #2482246
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.
#2482366
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
Gast #2483377
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
Gast #2483876
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
Gast #2484176
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?
Gast #2485652
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.