wie man einen Assembler-Code beendet

Ich versuche, einen Code für pic16f877 zu schreiben, indem ich einen einfachen Algorithmus in Assembler-Code übersetze.

Der Befehlssatz enthält keine solche Anweisung.

Geben Sie hier die Bildbeschreibung ein

Hier ist, was ich geschrieben habe:

MOVF 0X40,W
MOVWF 0X50
SUBWF 0X41,W
BTFSS Status,C
GOTO label
MOVF 0X41 ,W
MOVWF 0X50
label END

Meine Frage ist: Gibt es eine Möglichkeit, einen Algorithmus beim Programmieren eines Mikrocontrollers mit Assemblercode zu "beenden"?

Es gibt zu wenige Informationen. Was erwarten Sie vom µC am Ende des Codes? Endlosschleife?
Schreibst du eine Funktion? Wenn ja, verzweigen Sie dorthin zurück, wo Sie hergekommen sind?
Ich habe weitere Informationen hinzugefügt, ich hoffe, es ist jetzt klar
@A.Bukhari Es ist immer noch nicht ganz klar. Wie viel Erfahrung haben Sie in der Mikrocontroller-Programmierung? Wenn Sie nur eine Funktion haben, beenden Sie sie normalerweise nicht, sondern führen sie in einer Schleife aus. Bitte erklären Sie detailliert, was Sie versuchen zu tun, wie das Ding heißen soll, das Sie ausführen möchten, was Sie erwarten und so weiter.
Ich habe ein PS @AndrejaKo hinzugefügt
Wie wäre es mit GOTO END?
Ich denke, wir sollten ein Label hinter GOTO setzen
Sie scheinen bereits ein Label mit dem Namen zu habenEND
mein Etikett ist "Etikett" !!
END ist eine Assembler-Direktive, keine Anweisung. Das Wort ist reserviert. Es kann nicht als Teil einer Programmzeile verwendet werden.
Schalten Sie den Watchdog und andere Interrupt-Quellen aus und verwenden Sie dann die SLEEPAnweisung (siehe Abschnitt 14 des Datenblatts). Auf einem anderen Mikrocontroller wäre es anders, aber das stoppt den, den Sie verwenden.

Antworten (3)

Stoppen Sie und denken Sie wirklich darüber nach.

Was soll der Mikrocontroller tun, nachdem er mit dem bisschen Logik, das Sie zeigen, fertig ist? Sicher ist da was . Soll die Operation erneut durchgeführt werden? Sollte es zu einer größeren Aufgabe zurückkehren? Sollte es warten, bis etwas Äußeres passiert, und es dann erneut tun? Selbst wenn es "nichts" tun soll, bis der Strom abgeschaltet wird, müssen Sie ihm eigentlich sagen, was es tun soll.

Der Punkt ist, dass es kein "Ende" gibt. Es macht keinen Sinn. Alles erfordert etwas Aktion. Selbst das Herunterfahren über einen externen Schalter erfordert die Aktivierung dieses Schalters.

Zu einem anderen Thema sollten Flussdiagramme wirklich die Logik der nächsten Stufe anzeigen, nicht die Details, wie der Prozessor diese Logik ausführen wird. Sie geben Details zu Dingen wie dem W-Register in Ihrem Flussdiagramm an. Stattdessen sollte es so etwas wie einen Vergleichsblock zwischen A und B (oder was auch immer) zeigen, dann zwei oder mehr Auswahlmöglichkeiten, je nach Ergebnis. Wenn Sie dies in Assembler codieren, finden Sie die eigentlichen Anweisungen heraus, um die durch das Flussdiagramm beschriebene Logik auf höherer Ebene zu realisieren .

Es ist auch schlecht, auf Variablen über ihre Adressen zu verweisen. Verweisen Sie symbolisch auf die Variable und lassen Sie dann den Linker entscheiden, wo sie in den Speicher eingefügt werden sollen. Das geht Sie wirklich nichts an, abgesehen vielleicht von der Bank, in der sie sein sollten. Ihr Flussdiagramm bezieht sich auf drei verschiedene Variablen um 40 Uhr, 41 Uhr und 50 Uhr. Geben Sie ihnen Namen und verwenden Sie die Namen im Flussdiagramm. Gute Namen helfen auch, die Logik zu beleuchten. Selbst wenn Sie dies in Assembler codieren, geben Sie den Variablen immer noch Namen und verweisen auf sie im Code mit Namen.

Nur um es klar zu stellen: Im Mikrocontroller-Assembler-Code gibt es normalerweise kein Ende. Es gibt sicherlich keine Endanweisung. Es gibt kein Betriebssystem, an das man die Kontrolle zurückgeben kann, und es gibt keine Möglichkeit, einfach "anzuhalten".

Mikrocontroller-Code enthält fast immer eine Endlosschleife.

Wenn Sie mit einem µC arbeiten, müssen Sie am Ende Ihres Codes eine Endlosschleife erstellen. Andernfalls haben Sie keine Kontrolle darüber, was der µC tun wird. Wenn Sie eine solche Schleife vergessen, löst der µC sie aus und blockiert die Ausführung des Programms. (im MSP430 von TI ISR_TRAP genannt)

In C beenden Sie Ihren Code grundsätzlich mit etwas wie while(1)oder for(;;). Dadurch erledigt der Prozessor einige Leerlaufaufgaben, sodass er aktiv bleibt und sich der Unterbrechung immer noch bewusst ist.

Dasselbe gilt für die Assemblierung, Sie müssen Ihre Codeschleife so machen, dass sie aktiv bleibt.

loop:
     jmp loop