Forum: Mikrocontroller und Digitale Elektronik Programmschleife mit Assembler programmieren - Probleme


von Michael M. (msteinweber)


Lesenswert?

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!

von Maxx (Gast)


Lesenswert?

Michael Müller schrieb:

>          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

Welchen Wert hat dc1 nachdem Schleife Nr2 nach dly1 zurückspringt.

von Michael M. (msteinweber)


Lesenswert?

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?

von Carsten M. (ccp1con)


Lesenswert?

welcher PIC welcher Compiler und welches MPLAP (8 oder X)?

von Ottmar K. (wil1)


Lesenswert?

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

von Michael M. (msteinweber)


Lesenswert?

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?

von Michael M. (msteinweber)


Lesenswert?

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!

von Michael M. (msteinweber)


Lesenswert?

Assembler ist der MPASM 5.43

von amateur (Gast)


Lesenswert?

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".

von Michael M. (msteinweber)


Lesenswert?

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.

von Carsten M. (ccp1con)


Lesenswert?

Was genau heißt - "Die Variablen werden nicht angezeigt?"
Hast Du sie der Watchlist hinzugefügt?
Und wie sind die denn deklariert?

von Michael M. (msteinweber)


Lesenswert?

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

;-)

von Carsten M. (ccp1con)


Lesenswert?

versuch mal

UDATA 0x00
dc1 res 1
dc2 res 1


UND wechsle zu X!
Auch wenn es noch nicht perfekt ist, ist es um Klassen besser. Finde 
ich.

von Chris B. (dekatz)


Lesenswert?

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).

von Ottmar K. (wil1)


Angehängte Dateien:

Lesenswert?

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

von Ottmar K. (wil1)


Angehängte Dateien:

Lesenswert?

Hier noch das Assembler-File
mfG Ottmar

von Michael M. (msteinweber)


Lesenswert?

@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.

von Ottmar K. (wil1)


Lesenswert?

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

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.