Der Nachfolger des WDR-Computerclub mit Wolfgang Back und Wolfgang Rudolph - ...und immer ein Bit übrigbehalten!


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Assemblerkurs für die OM-Mikrocontroller - Teil 1 Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 8.02.2018 19:47)
Dietmar nutzt:  Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi, Open-Mini M-Unit, Open-Mini Station
' ----------------------------------------------------------------------------
' 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

Bisherige Antworten: