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 

 ONTIMER-Funktion auf den OM-Controllern Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 5.10.2018 21:15)
Dietmar nutzt:  Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi, Open-Mini M-Unit, Open-Mini Station
' ============================================================================
' ONTIMER-Funktion: Die BASIC-Interruptroutine jede Sekunde einmal starten
' In OCBASIC 1.12a_e1 für die Open-Maxi von Dietmar Harlos am 5. Oktober 2018
' ============================================================================

' Die BASIC-Interruptroutine startet normalerweise, wenn der Controller am
' IRQ-Pin eine negative Flanke detektiert. Aber in diesem Programm wird eine
' Assemblerroutine im Interrupt 50 mal pro Sekunde aufgerufen und setzt alle
' 50 Interrupts den Marker für den BASIC-Interrupt, wodurch die BASIC-
' Interruptroutine jede Sekunde einmal startet.

' Einen Code für die kleinen OM-Controller mit der gleichen Funktionalität
' befindet sich im ZIP-Archiv des OCBASIC-Compilers im Verzeichnis OM.

' --- Definitionen für das System --------------------------------------------

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

' --- Definitionen des Anwenders ---------------------------------------------

DIM a,b,c BYTE             'drei normale Variablen definieren

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

' Die folgende Assembler-Interruptroutine befindet sich im "20-ms-Interrupt"
' (genauer: "Timer/PWM-Module 1 - Channel 3 (TPM1CH3)") und wird auf der
' Open-Maxi alle 20 ms aufgerufen.

' Die folgende Subroutine 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.

DEFINE mIrqReq &b00000010  'Maske zum Starten der BASIC-IRQ-Routine

PROCEDURE iiar_TIM3 INLASM

! cbeqa #iTIM3,isiTIM3     'Falls kein Aufruf durch TIM3-Interrupt,
! jmp iiar_TIM3_ende+2     ' dann zur nächsten IIAR in der Kette.

#isiTIM3
! inc ,x                   'in x steht die Adresse von FREERAM
! lda ,x
! cmp #50
! blo isiTIM3_over
! clr ,x
! lda -3,x
! ora #mIrqReq
! sta -3,x
#isiTIM3_over

' Durch Setzen des Carry-Flags (SEC) kann der User signalisieren, daß die
' Betriebssystemroutinen des Interrupts nachfolgend nicht aufgerufen werden,
' sondern der Interrupt unmittelbar beendet wird. Andernfalls ist das Flag
' mit dem Befehl CLC zu löschen.

! clc                      'Betriebssystemfunktion soll aktiviert bleiben
! rts                      'Rücksprung zum Betriebssystem

END PROCEDURE

#iiar_TIM3_ende            'hier hinter folgt die nächste IIAR
                           '(sofern vorhanden)

' --- Das Hauptprogramm ------------------------------------------------------

#main

' Temporären Zwischenspeicher (FREERAM1) für die Assemblerroutine löschen

FREERAM1=0

' Wir hängen unsere eigene Assemblerroutine in den 20-ms-TIMER-Interrupt

UIRTim3=ON

' Die Assemblerroutine im Interrupt wird nun 50 mal pro Sekunde aufgerufen
' und setzt nun alle 50 Interrupts den Marker für den BASIC-Interrupt,
' wodurch die BASIC-Interruptroutine jede Sekunde einmal startet.

INTERRUPT irqrou           'Vereinbart die BASIC-Interruptroutine

PrintSpc=ON                'SPACE vor einem dezimalen PRINT ausgeben

' Zur Demonstration nur ein einfaches Hauptprogramm.

REPEAT
  PRINT HOUR;MINUTE;SECOND;TIMER
  FOR a=0 TO 24
    PAUSE 1                'Ein PAUSE 25 würde den Start der BASIC-Interrupt-
  NEXT a                   'routine um bis zu eine halbe Sekunde verzögern.
UNTIL SECOND>=30

INTERRUPT OFF              'BASIC-Interruptroutine deaktivieren

PRINT
PRINT "Programmende."

End2Host=ON                'Nach Programmende in den Host-Modus
END                        'Programmende, Neustart mit der Enter-Taste

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

' Die BASIC-Interruptroutine. Sie startet normalerweise, wenn am IRQ-Pin eine
' negative Flanke detektiert wird. Beendet wird die Routine mit dem Befehl
' RETURN INTERRUPT.

PROCEDURE irqrou
  PRINT
  PRINT "Hier ist die BASIC-Interrupt-Routine. TIMER ist";TIMER;"."
  RETURN INTERRUPT
END PROCEDURE

' --- Ende des Programms ----------------------------------------------------


Passender Link: Bedienungsanleitung zur Open-Macro und Open-Maxi

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

 Antwort schreiben

Bisherige Antworten:

Re: ONTIMER-Funktion auf den OM-Controllern (von Joe Fenk - 7.10.2018 11:51)
    Re: ONTIMER-Funktion auf den OM-Controllern (von Dietmar - 7.10.2018 20:39)
        Re: ONTIMER-Funktion auf den OM-Controllern (von Joe Fenk - 8.10.2018 18:56)