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 

 Periodendauer eines Rechtecksignals am FREQ1-Pin ermitteln Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 27.10.2018 20:00)
Dietmar nutzt:  Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi, Open-Mini M-Unit, Open-Mini Station
' ============================================================================
' Periodendauer eines Rechtecksignals am FREQ1-Pin ermitteln.
' In OCBASIC 1.12a_e1 für Open-Maxi von Dietmar Harlos am 27. Oktober 2018
' ============================================================================

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

' Für Signale niedriger Frequenz ist das FREQ-Meßverfahren nur schlecht
' geeignet. Aus diesem Grund hier eine Periodendauermessung. Bei jeder
' fallenden Flanke des Signals wird ein Interrupt ausgelöst. Es wird die
' verstrichene Zeit zwischen zwei Interrupts in der Einheit "TPM1CNT-Ticks"
' gemessen. Auf diese Weise erhält man die Periodendauer.

' Die Open-Maxi arbeitet mit einem "TPM Clock" von 625 kHz. Das heißt, alle
' 1.6 µs wird der interne Zähler TPM1CNT weitergezählt. Es wird demnach in
' 1.6-µs-Einheiten gemessen.

' Wenn ein externes Rechtecksignal mit einer Frequenz von 500 Hz an den
' FREQ1-Pin angelegt wird, ergibt sich eine Periodendauer von 1250, gemessen
' in TPM1CNT-Ticks. In Sekunden sind das:

' 1.6 µs * 1250 = 2 ms

' Das entspricht einer Frequenz von:

' 625e3 / 1250 = 500 Hz

' Mit dem hier demonstrierten Verfahren können Frequenzen bis hinunter von
' 625e3/65535 = 9.54 Hz gemessen werden. Für noch niedrigere Frequenzen muß
' der Anwender das TPM1-Timer-Modul anders konfigurieren.

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

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

DIM peridau_ergebnis WORD  'Ergebnis der Periodendauer-Messung
DIM peridau_letzter  WORD  'die letzte fallende Flanke merken

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

'DIM a,b,c BYTE             'einige Variablen

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

' Die folgende Assembler-Interruptroutine befindet sich im "FREQ1-Interrupt"
' (genauer: "Timer/PWM-Module 1 - Channel 4 (TPM1CH4)") und ist als
' "Input Capture" konfiguriert. Der Interrupt wird bei jeder fallenden
' Flanke 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.

PROCEDURE iiar_TIM4 INLASM

! cbeqa #iTIM4,isiTIM4     'Falls kein Aufruf durch TIM4-Interrupt,
! jmp iiar_TIM4_ende+2     ' dann zur nächsten IIAR in der Kette.

#isiTIM4
! ldhx TPM1CNTH            'TPM1CNT-Takt: BUSCLK/32 = 625 kHz

! txa                      'peridau_ergebnis = TPM1CNT - peridau_letzter
! sub peridau_letzter+1
! sta peridau_ergebnis+1
! pushh
! popa
! sbc peridau_letzter
! sta peridau_ergebnis

! sthx peridau_letzter     'letzten Aufrufzeitpunkt festhalten

' 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_TIM4_ende            'hier hinter folgt die nächste IIAR
                           '(sofern vorhanden)

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

#main

UIRTim4=ON                 'Userroutine für den "FREQ1"-Interrupt aktivieren

PrintSpc=ON                'SPACE vor einem dezimalen PRINT ausgeben

WHILE TRUE
  ?"FREQ1:"FREQ1
  ?"Periodendauer in TPM1CNT-Ticks:"peridau_ergebnis
  PAUSE 25
WEND

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

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


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

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

 Antwort schreiben

Bisherige Antworten:

Periodendauer eines sehr langsamen Rechtecksignals ermitteln (von Dietmar - 28.10.2018 14:37)
    Re: Periodendauer eines sehr langsamen Rechtecksignals ermitteln (von Joachim - 5.11.2018 19:57)
        Re: Periodendauer eines sehr langsamen Rechtecksignals ermitteln (von Dietmar - 5.11.2018 20:41)
            Re: Periodendauer eines sehr langsamen Rechtecksignals ermitteln (von Joachim - 7.11.2018 17:56)
                Re: Periodendauer eines sehr langsamen Rechtecksignals ermitteln (von Dietmar - 7.11.2018 18:48)
                    Grafische Lösung per MuPAD (von Dietmar - 8.11.2018 6:49)
                       Einfachere Schreibweise (von Dietmar - 10.11.2018 0:51)
                       Re: Grafische Lösung per MuPAD (von Joachim - 8.11.2018 18:05)