Das Open-Control-Projekt - Die Alternative zur C-Control-I


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 

 Demoprogramm: Assembler-Interruptroutine im BEEP-Interrupt in 32 Bit Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 11.06.2022 2:52)
 Als Antwort auf Demoprogramm: Assembler-Interruptroutine im BEEP-Interrupt von Dietmar - 11.06.2022 2:50
Dietmar nutzt:  Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi, Open-Mini Station
' ===========================================================================
' Demoprogramm: Assembler-Interruptroutine im BEEP-Interrupt in 32 Bit
' In OCBASIC 1.12a_e1 fĂŒr Open-Maxi von Dietmar Harlos am 08. Juni 2022
' ===========================================================================

' Manchmal möchte man auf der Open-Maxi eine Assemblerroutine in zeitlichen
' AbstĂ€nden aufrufen lassen. Wenn dafĂŒr kein anderer Interrupt mehr frei ist,
' kann man den BEEP-Interrupt fĂŒr diese Aufgabe verwenden. Der zeitliche
' Abstand ist dann mit dem BASIC-Befehl "BEEP" konfigurierbar. Mittels
' "BEEP wert,0,0" kann die AufrufhÀufigkeit eingestellt werden; wobei
' wert=625000/Aufrufe_pro_Sekunde ist.

' In diesem Programm wurde der ZĂ€hler auf 32 Bit erweitert. Dabei werden die
' Softwareroutinen aus "Grundrechenarten in 32 Bit fĂŒr Open-Macro und
' Open-Maxi" verwendet.

' --- Definitionen ----------------------------------------------------------

INCLUDE "omax.def"               'Definitionen fĂŒr die Open-Maxi

DEFINE a  AS LONG   'Erster  32-Bit-Akkumulator (1. Operand & Rechenergebnis)
DEFINE b  AS LONG   'Zweiter 32-Bit-Akkumulator (2. Operand)
DEFINE c  AS LONG   'Dritter 32-Bit-Akkumulator (temp. fuer DIV und PRINT32)

DEFINE a1 AS BYTE[1] OF a   'LSB    'fuer den Zugriff in BASIC
DEFINE a2 AS BYTE[2] OF a
DEFINE a3 AS BYTE[3] OF a
DEFINE a4 AS BYTE[4] OF a   'MSB

DEFINE alw AS WORD[1] OF a  'LSW    'fuer den Zugriff in BASIC
DEFINE ahw AS WORD[2] OF a  'MSW

DEFINE b1 AS BYTE[1] OF b   'LSB    'fuer den Zugriff in BASIC
DEFINE b2 AS BYTE[2] OF b
DEFINE b3 AS BYTE[3] OF b
DEFINE b4 AS BYTE[4] OF b   'MSB

DEFINE blw AS WORD[1] OF b  'LSW    'fuer den Zugriff in BASIC
DEFINE bhw AS WORD[2] OF b  'MSW

DIM zaehler LONG            'ZĂ€hler
DIM zlw WORD[1] OF zaehler  'LSW
DIM zhw WORD[2] OF zaehler  'MSW

' --- Unsere eigene Assembler-Interruptroutine ------------------------------

' Die folgende Assembler-Interruptroutine befindet sich im "BEEP-Interrupt"
' und wird gestartet, wenn eine halbe Periode des Signals vorĂŒber ist.

' Sobald der Interrupt auftritt, wird die Assemblerroutine aufgerufen, wobei
' im Akkumulator der Wert #iTIM2 und im X-Register die Adresse von FREERAM
' ĂŒbergeben wird. Beendet werden muß die Routine mit RTS. Falls mit
' gelöschtem Carry-Bit ("CLC") beendet wird, fĂŒhrt das Betriebssystem
' die Systemfunktionen zum Interrupt weiter aus. Wird dagegen mit gesetztem
' Carry-Bit ("SEC", bzw. "STC") beendet, ignoriert das System den Interrupt.

' Die folgende Subroutine muß am Anfang des Programms, vor dem ersten Befehl
' stehen und sollte sinnvollerweise in einer INCLUDE-Datei untergebracht werden.

' Das SchlĂŒsselwort INLASM kennzeichnet die folgende PROCEDURE als
' Assemblerroutine (IAR). Dadurch, und daß sie unmittelbar am Anfang
' des Programms steht, wird sie zu einer IIAR, also zu einer Assembler-
' Interruptroutine, die bei einem aktivierten User-Interrupt gestartet wird.

' Der OCBASIC-Compiler setzt automatisch ein "GOTO main" vor diese Routine.

PROCEDURE UIRTim2_iiar INLASM
! cbeqa #iTIM2,tim2_is      'Unterscheidung der Interruptquellen
! jmp UIRTim2_iiar_next+2   'zur nĂ€chsten IIAR in der Kette springen

#tim2_is
! ldhx zaehler+2
! aix #1
! sthx zaehler+2
! bne tim2_keinueberlauf
! ldhx zaehler
! aix #1
! sthx zaehler
#tim2_keinueberlauf

! clc          'Carry-Flag löschen (Betriebssystem verarbeitet den Interrupt)
! rts          'RĂŒcksprung zum Betriebssystem
END PROCEDURE

#UIRTim2_iiar_next          'hier hinter folgt die nĂ€chste IIAR
                            '(sofern vorhanden)

' --- Hauptprogramm ---------------------------------------------------------

#main

PrintSpc=ON    'Bei PRINT dezimale Zahlen mit fĂŒhrendem Leerzeichen ausgeben
End2Host=ON    'Bei Programmende (siehe END) gleich in den Host-Modus wechseln

' Titel:

PRINT
PRINT "BEEP-Interrupt"
PRINT "=============="

' Initialisierungen:

UIRTim2=ON     'User-Assemblerroutine fĂŒr TIM2 (BEEP-Interrupt) aktivieren

BEEP 6,0,0     ' wert = 625000 / f

' Hauptschleife des Programms:

WHILE TRUE
  ?timer;" ";
  'disable     'eigentlich mĂŒssen die Interrupts deaktiviert werden
  alw=zlw
  ahw=zhw
  'enable
  print32
  ?
'  PAUSE 10
WEND

?:?"Programmende."
END            'ZurĂŒck in den Hostmodus. Neustart mit RETURN-Taste.

' --- Subroutinen und Funktionen --------------------------------------------

PROC disable INLASM
! sei                 ' die Interrupts deaktivieren
! rts
END PROC

PROC enable INLASM
! cli                 ' die Interrupts wieder aktivieren
! rts
END PROC

' --- INCLUDE-Dateien -------------------------------------------------------

INCLUDE "32BITASM.PRO"    'INCLUDE-Datei fĂŒr 32-Bit-Arithmetik auf Open-Maxi
INCLUDE "OM_FW.PRO"       'INCLUDE-Datei fĂŒr Firmwareroutinen

' --- Programmende ---------------------------------------------------------


Passender Link: Infosite zu den OM-Mikrocontrollern

Meine Homepage: http://ccintern.dharlos.de

 Antwort schreiben

Bisherige Antworten: