Servus,
bin ganz neu in der Assembler-Programmierung. Nun habe ich versucht,
eine Schleife in Assembler umzusetzen. Seht selber:
1
movlw .2 ; Schleife Nr. 2 hat 2 Durchläufe
2
movwf dc2
3
clrf dc1 ; Schleife Nr. 1 hat 256 Durchläufe
4
dly1 nop
5
decfsz dc1,f ; Schleife Nr. 1
6
goto dly1
7
8
decfsz dc2,f ; Schleife Nr. 2
9
goto dly1
Dazu habe ich zwei verschachtelte Schleifen benutzt. Die erste Schleife
(mit dem Zähler dc1) läuft 256 Mal. Das ganze geschachtelt in der
äußeren Schleife nochmal zwei Mal, bis beide Schleifen verlassen werden.
Allerdings produziert mir obiger Code eine Endlosschleife - so scheint
es zumindest, ich habe zwei Minuten gewartet, kein Ende. Was hab ich
falsch gemacht?
Danke im Voraus!
Ich denke mal 0, zumindest der Logik nach. Ehrlich gesagt weiß ich nicht
mal, wie ich mir den Inhalt von dc1 anzeigen lassen soll. Im Watch von
MPLAB wird das nicht angezeigt. Wo kann ich da nachsehen?
Hallo Michael,
Dein Code funktioniert doch! wenn ich diesen im Simulator durchlaufen
lasse bleibt er beim Befehl "sleep" (Prozessor im Schlafmodus) stehen.
movlw .2 ; Schleife Nr. 2 hat 2 Durchläufe
movwf dc2
clrf dc1 ; Schleife Nr. 1 hat 256 Durchläufe
dly1:
nop
decfsz dc1,f ; Schleife Nr. 1
goto dly1
decfsz dc2,f ; Schleife Nr. 2
goto dly1
SLEEP
Verwendest Du den Simultor von MPLAB? Dann kannst Du auch anstatt
"sleep" "nop" verwenden und bei diesem Befehl einen Haltepunkt setzen.
mfG Ottmar
Entschuldigt, habe die wichtigsten Angaben ganz vergessen - es handelt
sich um den 18F67J60 und MPLAB 8. Ich verwende den Debugger von MPLAB,
richtig. Merkwürdig nur, dass es dann bei Dir funktioniert, Ottmar.
Jedenfalls großes Dankeschön für Deine Mühe!
Hat noch jemand eine Idee wie ich mir den Inhalt der Variablen dc1 und
dc2 im MPLAB-Debugger anzeigen lassen kann?
Sodelle. Vielleicht liegt es ja an der Variablendeklaration von dc1 und
dc2... ich habe diese Variablen fast ganz oben in der Datei gleich nach
diversen Includes deklariert. Das sollte doch passen?
Es handelt sich um den UART-Bootloader von Microchip. Nicht dass ich da
irgendwas kompliziertes mit Speicherbänken etc. berücksichtigen muss...
komisch komisch!
Ich kenne MPLAB nicht, aber normalerweise setzt man, wenn man sich
Register oder Variablen ansehen will, Haltepunkte (Breakpoint oder so)
im Programm.
Manche Debugger können überhaupt keine Änderungen anzeigen, während das
Programm läuft.
Allzu sinnvoll dürfte auch eine Zahl, die ständig von 255 nach 0
herunter gezählt wird, auch nicht sein.
Oft arbeitet man auch mit einer Kombination aus Haltepunkt und
Einzelschritt (Single Step, ab Haltepunkt), oder mit Kombinationen aus
Haltepunkten und zwischenzeitlichem "Run".
Servus amateur,
danke für Deine Antwort. Ich programmiere mit MPLAB beruflich seit
längerer Zeit mit C, leider jedoch ist der Debugger bzw. die IDE so
schrottig, dass man sich nicht wie in Visual Studio über einen mouseover
den Inhalt der jeweiligen Variable anzeigen lassen kann. Das ganze
passiert dann entweder über einen vorher gesetzten Watch oder - in
Assembler - keine Ahnung wie.
Mit Singlesteps habe ich bereits durch die Schleife iteriert, da zeigt
sich auch ganz deutlich, dass die äußere Schleife öfter (also unendlich
oft) als zwei Mal durchläuft. Weiß nicht, was da nicht stimmt.
In der Symbolübersicht vom Watch tauchen die Variablen schlicht nicht
auf, deshalb kann ich diese auch nicht dem Watch hinzufügen. Deklariert
sind sie folgendermaßen:
dc1
dc2
;-)
Michael Müller schrieb:> In der Symbolübersicht vom Watch tauchen die Variablen schlicht> nicht> auf, deshalb kann ich diese auch nicht dem Watch hinzufügen. Deklariert> sind sie folgendermaßen:>> dc1> dc2>> ;-)
Das ist keine Deklaration für den Assembler.
Wie hast du sie genau deklariert???
NICHT angezeigt werden sie wenn du "relocatablen" Code erzeugst und den
Variablen fixe Adxressen zugeordnet hast (also mit <cblock 0x20> oder
eine EQU-Anweisung).
Wenn "relocatable" Code und Variablen mit UDATA angelegt, werden diese
zwar angezeigt, der Inhalt ist aber unbrauchbar weil alle auf der
gleichen Adressen liegen (im DEBUG u . RELEASE-Mode).
Michael Müller schrieb:> Assembler ist der MPASM 5.43
Hallo Michael,
Du solltest unbedingt auf MPLAB 8.92 updaten (falls Du nicht gleich auf
MPLABX umsteigen möchtest).
In MPLAB 8.92 kann mit "mouseover" der Wert einer Variablen angezeigt
werden.
Auch Deine Schleifen funktionieren problemlos.
Ich habe extra kurz mal MPASM 8.92 angeworfen um das zu checken und dazu
auch Deine Schleifen im DEBUG-Modus durchlaufen lassen - OK!.
mfG Ottmar
@Carsten M. und Chris B: Danke Jungs. Die "Variablendeklaration" habe
ich so aus einem Tutorial übernommen, offensichtlich scheint das wohl
tatsächlich falsch zu sein. Danke für die Korrektur.
[offtopic] Bei MPLABX habe ich schon seit der Beta-Version immer wieder
einen Blick drüber geworfen und unsere Projekte testweise in die neue
IDE importiert.
In der Version kurz nach der Beta reichte sogar schon ein Leerzeichen im
Projektpfad aus, um Probleme mit der IDE zu bekommen. Ganz generell ist
X schon um Welten zeitgemäßer als MPLAB, allerdings hatten wir bisher
leider nicht die Zeit, uns mit der IDE über mehrere Wochen vertraut zu
machen. Nach ein paar nervigen Fehlern in X haben wir es dann vorerst
wieder auf Glatteis gelegt. War erst wieder vor zwei Wochen. Aber wir
nehmen uns demnächst sicher wieder Zeit um das Ding längerfristig
auszutesten.[/offtopic]
Ottmar, danke für den Tipp mit MPLAB. Habe ich voll übersehen, dass
wieder eine neue Version veröffentlicht wurde. Deine
Variablendeklaration sieht übrigens genauso aus wie meine, nur dass ich
die nicht mit der CBLOCK-Direktive umschlossen habe. Ist diese Kapselung
generell nötig bei einer Deklaration?
Aufjedenfall ein großes DANKE für Deine Mühen, das ist ja der Wahnsinn.
Dann werde ich erstmal meine Tools auf den neuesten Stand bringen und es
dann nochmal probieren. Wahrscheinlich liegt's ja wirklich an der
Variablendeklaration. Kommende Woche dann.
Danke Jungs für die kompetenten Ratschläge! Wünsch Euch ein schönes WE.
Michael Müller schrieb:> Variablendeklaration sieht übrigens genauso aus wie meine, nur dass ich> die nicht mit der CBLOCK-Direktive umschlossen habe. Ist diese Kapselung> generell nötig bei einer Deklaration?
Nein, beide Möglichkeiten haben den gleichen Effekt.
Zur Variablendeklaration mit MPLAB-ASM hast Du die Möglichkeit explizit
die Adresse vorzugeben, z.B.
cntEuro equ 0x22
cntCent equ 0x23
oder Du gibst nur die erste Adresse zusammen mit der Direktive cblock
an:
cblock 0x22
cntEuro
cntCent
endc
Der Compiler ordnet dann jeder Variable die zugehörige Adresse,
aufsteigend ab Startadresse 0x22 zu.
mfG Ottmar