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: Frequenzmessung per FREQ2 in 32 Bit Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 12.07.2024 22:25)
Dietmar nutzt:  Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi, Open-Mini Station


' ===========================================================================
' Demoprogramm: Frequenzmessung per FREQ2 in 32 Bit
' In OCBASIC 1.12a_e1 für Open-Maxi von Dietmar Harlos am 12. Juli 2024
' ===========================================================================

' Mit Hilfe der internen Variablen FREQ1 und FREQ2 kann die Open-Maxi die
' Frequenz eines Rechtecksignals am FREQ1-, bzw. FREQ2-Pin ermitteln.
' Dabei wird in Hz ("Hertz") gemessen. Allerdings handelt es sich um Variablen
' in 16-Bit-Auflösung, so daß nur bis 32767 Hz gemessen werden kann. In diesem
' Beispielprogramm wird gezeigt, wie man FREQ2 auf 32 Bit erweitert und so
' Frequenzen bis 215 kHz messen kann.

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

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

OPTION 32BIT               '32-Bit freischalten (ab OCBASIC Version 1.12)

DIM myFREQ2 LONG           'neue FREQ2-Variable

DIM myFREQ2temp LONG       'zum Sammeln der Aufrufe über eine Sekunde

' --- Unsere eigenen Assembler-Interruptroutinen ----------------------------

' Die folgende Assembler-Interruptroutine befindet sich im "FREQ2-Interrupt"
' (genauer: "Timer/PWM-Module 1 - Channel 5 (TPM1CH5)") und ist als
' "Input Capture" konfiguriert. Der Interrupt wird bei jeder fallenden
' Flanke am FREQ2-Pin aufgerufen.

' Sobald der Interrupt auftritt, wird die Assemblerroutine aufgerufen, wobei
' im Akkumulator der Wert #iTIM5 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
' UIRTIM3_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.

PROCEDURE UIRTIM5_iiar INLASM

! cbeqa #iTIM5,isiTIM5     'Falls kein Aufruf durch TIM5-Interrupt,
! jmp UIRTIM5_iiar_next+2  ' dann zur nächsten IIAR in der Kette.

#isiTIM5
! ldhx myFREQ2temp+2
! aix #1
! sthx myFREQ2temp+2
! bne isiTIM5_over
! ldhx myFREQ2temp
! aix #1
! sthx myFREQ2temp
#isiTIM5_over

! stc                      'Betriebssystemfunktion soll inaktiviert sein
! rts                      'Rücksprung zum Betriebssystem

END PROCEDURE

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

' --- Eine weitere 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.

PROCEDURE UIRTIM3_iiar INLASM

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

#isiTIM3
! tst RTCTIMER             'RTCTIMER zählt immer von 0..49
! bne isiTIM3_over
! ldhx myFREQ2temp+2
! sthx myFREQ2+2
! ldhx myFREQ2temp
! sthx myFREQ2
! clrh
! clrx
! sthx myFREQ2temp+2
! sthx myFREQ2temp
#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

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

' --- Systemerweiterungen einbinden -----------------------------------------

INCLUDE "omax32.iia"       '32-Bit-Erweiterung einbinden (für Open-Maxi)

' --- 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

PRINT
PRINT "Demoprogramm: Frequenzmessung per FREQ2 in 32 Bit"
PRINT "================================================="
PRINT

IF NOT IiarFnd THEN ?"INLINE-Interrupt-Assemblerroutine nicht gefunden!" : END

RunOnErr=ON                'Fehler-Handling aktivieren

IF ERR THEN                'Fehler-Handling (siehe Doku)
  WHILE TRUE
    ?"Fehler Nr. ";err
    PrintHex=ON
    ?"Adresse: $";erradr-UPROGBASE
    PrintHex=OFF
    PAUSE 25
  WEND
END IF

UIRTim5=ON                 'FREQ2-Interrupt für IIAR aktivieren
UIRTim3=ON                 '20-ms-TIMER-Interrupt für IIAR aktivieren
URTok=ON                   '32-Bit-Erweiterung aktivieren

WHILE TRUE
  PAUSE 25

  ?FREQ2                   'das alte FREQ2 bleibt Null
  ?myFREQ2temp             'temporäre Variable
  ?myFREQ2                 'das neue FREQ2 liefert 214952 Hz
  ?
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: