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: