
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
||
![]() ' =========================================================================== ' 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 "Demoprogramm: Frequenzmessung per FREQ2 in 32 Bit" 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 |