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.
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
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
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
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?
Das wurde doch in dem anderen Thread schon aufgezeigt. Ich weiss nicht was du vor hast, aber wenn es schon dabei Probleme gibt ? Holger
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.