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