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 sehr langsamen Rechtecksignals ermitteln Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 28.10.2018 14:37)
 Als Antwort auf Periodendauer eines Rechtecksignals am FREQ1-Pin ermitteln von Dietmar - 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 sehr langsamen Rechtecksignals am FREQ1-Pin ermitteln.
' In OCBASIC 1.12a_e1 für Open-Maxi von Dietmar Harlos am 28. Oktober 2018
' ============================================================================

' Bekanntlich kann die Open-Maxi mit Hilfe der internen Variablen FREQ1 und
' FREQ2 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 für Signale sehr
' niedriger Frequenz. Bei jeder fallenden Flanke des Signals wird ein
' Interrupt ausgelöst. Es wird die verstrichene Zeit zwischen zwei Interrupts
' in der Einheit "TIMER-Ticks" gemessen. Auf diese Weise erhält man die
' Periodendauer.

' Die Open-Maxi arbeitet mit einem TIMER-Takt von 50 Hz. Das heißt, alle
' 20 ms wird der interne Zähler TIMER weitergezählt. Es wird demnach in
' 20-ms-Einheiten gemessen.

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

' 20 ms * 10 = 200 ms

' Das entspricht einer Frequenz von:

' 50 Hz / 10 = 5 Hz

' Mit dem hier demonstrierten Verfahren können Frequenzen bis hinunter von
' 50/65535 = 0.763 mHz gemessen werden.

' --- 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)"). Der Interrupt ist als
' "Input Capture" konfiguriert und 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 TIMER               'TIMER-Takt: 50 Hz (20 ms)

! txa                      'peridau_ergebnis = TIMER - 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 TIMER-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:

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)