![]() ![]() INFO - FAQ - CC2-Forum - CCPro-Forum |
|
' ============================================================================ ' 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 |