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.
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"?
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
M.Ferru
Colin
A. Buchari
AndrejaKo
A. Buchari
Dmitri Grigorjew
GOTO END
?A. Buchari
Dmitri Grigorjew
END
A. Buchari
Chu
Böser Hundekuchen
SLEEP
Anweisung (siehe Abschnitt 14 des Datenblatts). Auf einem anderen Mikrocontroller wäre es anders, aber das stoppt den, den Sie verwenden.