![]() ![]() INFO - FAQ - CC2-Forum - CCPro-Forum |
|
' ---------------------------------------------------------------------------- ' Assemblerkurs für die OM-Mikrocontroller - Teil 1 ' In OCBASIC 1.11a für die Open-Macro von Dietmar Harlos am 7. Februar 2018 ' ---------------------------------------------------------------------------- ' Auf der offiziellen OM-Infosite gibt es bei den Downloads eine Assemblerbeschreibung in deutscher Sprache: ' http://om.dharlos.de ' Für Assemblerprogrammierer besonders interessant ist das Central Processor Unit Reference Manual CPU08RM ' von Freescale, in dem alle Befehle der 6808-CPU detailliert erläutert werden: ' https://cache.nxp.com/docs/en/reference-manual/CPU08RM.pdf ' Um die verschiedenen Hardwaremodule der OM-Mikrocontroller zu verstehen, gibt es Data Sheets. Zum Beispiel: ' https://cache.nxp.com/docs/en/data-sheet/MC68HC908QB8.pdf ' Im ZIP-Archiv des OCBASIC-Compilers befinden sich im Verzeichnis OM jede Menge kleine Beispielprogramme, ' die gut für den Einstieg geeignet sind. Einige behandeln auch die Assemblerprogrammierung. ' Es gibt eine kostenlose Entwicklungsumgebung namens "CodeWarrior for Microcontrollers Classic v6.3 Special ' Edition", die einen guten Simulator enthält. Damit lassen sich sowohl C- als auch Assemblerprogramme erstellen ' und debuggen. Sie läßt sich bis Windows 7 32-Bit nutzen. ' ---------------------------------------------------------------------------- INCLUDE "OMAC.DEF" 'Definitionen fuer die Open-Macro ' ---------------------------------------------------------------------------- PRINT asm 'Assemblerroutine aufrufen und zurückgegebenen Wert auf ' der Seriellen Schnittstelle ausgeben. End2Host=ON 'Nach Programmende in den Host-Modus END 'Programmende ' ---------------------------------------------------------------------------- FUNCTION asm INLASM 'Assemblerroutinen müssen durch das Schlüsselwort INLASM gekennzeichnet werden ' ---------------------------------------------------------------------------- ' 1. Beispiel: Port auf Ausgang schalten und auf HIGH und LOW setzen ' Die Ports sind nach einem Reset auf Eingang geschaltet. ' Die Portregister sind wie alle Register bei den 68HC908-Mikrocontrollern "memory mapped", das heißt sie ' können wie ganz normale RAM-Speicherstellen angesprochen werden. Es gibt also keine speziellen Befehle ' wie etwa bei den AVR-Controllern. ' Zu beachten ist, daß immer zuerst das Datenregister (Data Register) der Ports beschrieben werden muß und ' erst danach das Richtungsregister (Data Direction Register) auf HIGH. Ansonsten können Glitches auftreten. ' Zur Visualisierung sollte an PORT[4] eine LED angeschlossen werden. DEFINE bitdataport bPTA3 ' Definition des Ports, entspricht PORT[4] in BASIC DEFINE bytedataport PTA ' (bPTA3, PTA, usw. wurden in OMAC.DEF definiert, siehe dort) DEFINE bitdirectionport bDDRA3 ' Möglich sind PORT[1] = Bits bPTA0 und bDDRA0 vom Byteport A DEFINE bytedirectionport DDRA ' bis PORT[16] = Bits bPTB7 und bDDRB7 vom Byteport B. ! bclr bitdataport,bytedataport ' Port soll LOW sein ! bset bitdirectionport,bytedirectionport ' Mittels Richtungsregister auf Ausgang schalten ! lda #15 ' Akkumulator (A) auf den Wert 15 setzen #asm1 ! bclr bitdataport,bytedataport ' Port auf LOW (0 Volt) setzen ! bsr warteschleife ' Aufruf der Routine namens warteschleife. (Kurzer Sprung) ! bset bitdataport,bytedataport ' Port auf HIGH (5 Volt) setzen ! bsr warteschleife ! dbnza asm1 ' Subtrahiere eins von A und springe, wenn A nicht null ist. ' ---------------------------------------------------------------------------- ' 2. Beispiel: Port abfragen ! bclr bitdirectionport,bytedirectionport ' Mittels Richtungsregister auf Eingang schalten ! bsr warteschleife ' Vor dem Abfragen etwas warten ! brset bitdataport,bytedataport,label1 ' Springe nach label1, wenn der Port gesetzt (HIGH, 5 Volt) ist #label1 ! brclr bitdataport,bytedataport,label2 ' Springe nach label2, wenn der Port nicht gesetzt (LOW, 0 Volt) ist #label2 ' Die beiden Befehle BRSET und BRCLR setzen zusätzlich das C-Bit (Carry-Flag) in Abhängigkeit des Portzustands. ' Das kann man sich zunutze machen: ! clrx ' 8-Bit-Indexregister X auf Null setzen ! rolx ' Nach links rotieren durch das C-Flag. ' Das heißt, auf Bit Nummer 0 von X liegt jetzt das alte C. ' ---------------------------------------------------------------------------- ' 3. Beispiel: Firmwareroutinen aufrufen ' Wir liefern den Wert von X auf dem Rechenstack des Betriebssystems zurück. ! txa ' Kopiere X nach A ! jsr FwPush ' Firmwareroutinen müssen immer mit den langen Sprungbefehlen (JSR und JMP) aufgerufen werden. ' Nicht mit den kurzen Befehlen (BSR, BRA, usw.) ! rts ' Rücksprung zum Betriebssystem ' ---------------------------------------------------------------------------- #warteschleife ' Unterprogramm "warteschleife" ! ldhx #32000 ' 16-Bit-Indexregister H:X auf Wert setzen #ws1 ! aix #-1 ' Von H:X eins abziehen ! cmphx #0 ' Vergleiche H:X mit dem Wert Null. ! bne ws1 ' Springe, wenn nicht gleich. ! rts ' Rücksprung zum Aufrufer END FUNCTION ' ---------------------------------------------------------------------------- INCLUDE "OM_FW.PRO" 'INCLUDE-Datei für Firmwareroutinen ' --------------------------------------------------------------------------- Passender Link: Assemblerkurs für die OM-Mikrocontroller (Teil 1) als ZIP-Archiv Meine Homepage: http://ccintern.dharlos.de |
Antwort schreiben |