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: "TPM1 Channel 0"-Interrupt (TPM1CH0) nutzen - Single Shot Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 11.06.2022 2:55)
 Als Antwort auf Demoprogramm: "TPM1 Channel 0"-Interrupt (TPM1CH0) nutzen von Dietmar - 11.06.2022 2:53
Dietmar nutzt:  Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi, Open-Mini Station
' ===========================================================================
' Demoprogramm: "TPM1 Channel 0"-Interrupt (TPM1CH0) nutzen - Single Shot
' In OCBASIC 1.12a_e1 fĂŒr Open-Maxi von Dietmar Harlos am 11. Juni 2022
' ===========================================================================

' In diesem Beispielprogramm wird demonstriert, wie eine Assemblerinterrupt-
' routine in den "TPM1 Channel 0"-Interrupt eingebunden werden kann. Die
' WORD-Variable "intervall" gibt vor, nach welcher Zeit die Interruptroutine
' gestartet werden soll. Im Gegensatz zum vorherigen Programm wird der
' Interrupt nur einmal ausgelöst ("Single Shot"). Der Timer TPM1 lÀuft
' standardmĂ€ĂŸig mit einer Frequenz von BUSCLK/32 = 625 kHz. Deshalb wird der
' Interrupt nach der Zeit "intervall/(20e6/32)" gestartet. Die Timer-Register
' haben eine Breite von 16 Bit. Deshalb ist im hier vorliegenden Fall die
' maximale Zeitverzögerung, nach der der Interrupt auftreten kann, auf
' "65536/(20e6/32)" gleich 0.1048576 Sekunden begrenzt.

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

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

DIM zaehler WORD                 'ZĂ€hler

DIM intervall WORD               'Aufruf-Zeitintervall festlegen

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

' Die folgende Assembler-Interruptroutine befindet sich im "TPM1 Channel 0"-
' Interrupt und wird gestartet, wenn ein Intervall vorĂŒber ist.

' Sobald der Interrupt auftritt, wird die Assemblerroutine aufgerufen, wobei
' im Akkumulator der Wert #iTIM0 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 zusammen mit den anderen Subroutinen bis inklusive
' UIRTim0_iiar_next 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 UIRTim0_iiar INLASM
! cbeqa #iTIM0,tim0_is      'Unterscheidung der Interruptquellen
! jmp UIRTim0_iiar_next+2   'zur nĂ€chsten IIAR in der Kette springen

#tim0_is
! ldhx zaehler              'Debugging-ZĂ€hler inkrementieren
! aix #1
! sthx zaehler

! mov #%00000000,TPM1C0SC   'Deaktivieren

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

' Den TPM1C0-Interrupt aktivieren und den nÀchsten Aufrufzeitpunkt festlegen

' Der TPM1C0 ist standardmĂ€ĂŸig deaktiviert. Hier wird er als "Output Compare -
' Software compare only" aktiviert.

PROCEDURE nextTPM1C0 INLASM
! mov #%00010000,TPM1C0SC   'Output Compare ("Software compare only")
! bclr bCH0F,TPM1C0SC       'Channel 0 Flag Bit (CH0F) im TPM1C0SC löschen

! lda TPM1CNTL              'nĂ€chsten Aufrufzeitpunkt festlegen
! add intervall+1
! sta TPM1C0VL
! lda TPM1CNTH
! adc intervall
! sta TPM1C0VH

! bset bCH0IE,TPM1C0SC      'Channel 0 Interrupt Enable (CH0IE)

! rts
END PROCEDURE

#UIRTim0_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 "TPM1CH0-Interrupt (Single Shot)"
PRINT "==============================="

' Initialisierungen:

UIRTim0=ON     'User-Assemblerroutine fĂŒr TIM0 (TPM1CH0) aktivieren

intervall=50000   '50000/(20e6/32)= 0.08 Sekunden (gleich 4 Timer-Ticks)

nextTPM1C0     'Interrupt aktivieren

' Hauptschleife des Programms:

WHILE TRUE
  IF zaehler THEN
    ?timer;zaehler

    zaehler=0         'ZĂ€hler resetten

    PAUSE 10          '10 Timer-Ticks warten vor Reaktivierung (Demo)

    intervall=50000   '50000/(20e6/32)= 0.08 Sekunden (gleich 4 Timer-Ticks)
    nextTPM1C0        'Interrupt reaktivieren
  END IF
WEND

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

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


Passender Link: Infosite zu den OM-Mikrocontrollern

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

 Antwort schreiben

Bisherige Antworten: