![]() ![]() INFO - FAQ - CC2-Forum - CCPro-Forum |
|
' ---------------------------------------------------------------------------- ' Tastverhältnis eines Rechtecksignals an PORT[2] ermitteln. ' In OCBASIC 1.09a für Open-Macro von Dietmar Harlos am 22. September 2015. ' ---------------------------------------------------------------------------- ' Dieses Programm mißt die ON-Zeit eines an PORT[2] (genauer: TCH1) einer ' Open-Macro angeschlossenen Rechtecksignals in 312.5-ns-Einheiten. Es können ' Frequenzen größer 48.8 Hz und kleiner ca. 25 kHz erfaßt werden. Der interne ' Pull-Up-Widerstand an PORT[2] wird während der Messung (leider) deaktiviert. ' Bei Bedarf muß also ein externer verwendet werden. ' Die gemessende ON-Zeit ist: tastver_ergebnis * 312.5E-9 s. ' Tastverhältnis: Frequenz_des_Rechtecksignals * tastver_ergebnis / 3.2E6 ' Beispiel: Bei einer Frequenz von 50 Hz ergibt sich bei einem Tastverhältnis ' von 0.1 (10%) ein tastver_ergebnis von 6400. Bei 0.5 (50%): 32000. ' Das hier gezeigte Verfahren läßt sich ideal einsetzen, um das pulsweiten- ' modulierte Signal (PWM) einer Servo-Ansteuerung auszuwerten. Die Frequenz ' beträgt 50 Hz und der Puls hat eine Breite zwischen 1 und 2 ms. Das ent- ' spricht einem Tastverhältnis zwischen 5% und 10%. Das tastver_ergebnis ' liegt demnach zwischen 3200 und 6400. ' In diesem Demoprogramm können Störungen auftreten, weil die Ausgabe eines ' Zeichens über die an PORT[1] liegende Serielle Schnittstelle zu lange ' dauert. Der Controller 'verschläft' dann eine Flanke des Signals. Das ' gleiche kann bei hohen Frequenzen in Kombination mit niedrigem ' Tastverhältnis passieren. ' ---------------------------------------------------------------------------- INCLUDE "omac.def" 'Definitionen für die Open-Macro DEFINE taste PORT[4] 'eine Taste vom PE-Board DIM tastver_ergebnis WORD 'Ergebnis der Tastverhältnis-Messung DIM tastver_letzter WORD 'die letzte steigende Flanke merken ' --- Unsere eigene Assembler-Interruptroutine ------------------------------ ' Die folgende Assembler-Interruptroutine befindet sich im Timer-Channel-1- ' Interrupt und wird gestartet, wenn eine Flanke detektiert wird. ' Die folgenden Subroutinen sollten 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_tim1 INLASM ! cbeqa #iTIM1,iiar_tim1_1 'Falls kein Aufruf durch TIM1-Interrupt, ! jmp iiar_tim1_ende+2 'dann zur nächsten IIAR in der Kette. ' In input capture mode (MSxB:MSxA = 0:0), reading the high byte of the TIM channel ' x registers (TCHxH) inhibits input captures until the low byte (TCHxL) is read. #iiar_tim1_1 ! ldhx TCH1H ! brset bELS1A,TSC1,iiar_tim1_rising 'steigende oder fallende Flanke? ! txa 'tastver_ergebnis = TCH1 - tastver_letzter ! sub tastver_letzter+1 ! sta tastver_ergebnis+1 ! pushh ! popa ! sbc tastver_letzter ! sta tastver_ergebnis ! mov #&b01000100,TSC1 'Input capture, Capture on rising edge only ! clc ! rts 'Rücksprung ins Betriebssystem #iiar_tim1_rising ! sthx tastver_letzter ! mov #&b01001000,TSC1 'Input capture, Capture on falling edge only ! clc ! rts 'Rücksprung ins Betriebssystem END PROCEDURE ' Mit der folgenden Assemblerroutine wird das Timer Interface Module (TIM) ' passend umkonfiguriert. ' Der 20-ms-Interrupt ist durch die Veraenderungen am TIM jetzt genau- ' genommen ein 20.48-ms-Interrupt, deshalb arbeitet der PAUSE-Befehl ' 2.4% zu lang. PROCEDURE init_tim1 INLASM 'Before changing a channel function by writing to the MSxB or MSxA bit, 'set the TSTOP and TRST bits in the TIM status and control register (TSC). ! mov #&b00110000,TSC 'TSC: TOF TOIE TSTOP TRST 0 PS2 PS1 PS0 ! mov #&b01000100,TSC1 'Input capture, Capture on rising edge only ! ldhx #&hffff ! sthx TMODH 'Modulo-Register auf Standardwert $ffff 'After initially enabling a TIM channel register for input capture operation 'and selecting the edge sensitivity, clear CHxF to ignore any erroneous 'edge detection flags. ! bclr bCH1F,TSC1 ! mov #&b01000000,TSC 'Timer wieder starten ! rts END PROCEDURE ' Timer Interface Module (TIM) wieder so setzen, wie vom OS erwartet PROCEDURE reset_tim1 INLASM ! mov #&b00110000,TSC 'TSC: TOF TOIE TSTOP TRST 0 PS2 PS1 PS0 ! clr TSC1 'TIM Channel Status and Control Register ! ldhx #999 'Modulo-Register zurück auf OS-Wert ! sthx TMODH ! mov #&b01000110,TSC 'Timer wieder starten ! rts END PROCEDURE #iiar_tim1_ende 'hier hinter folgt die nächste IIAR '(sofern vorhanden) ' --- Das Hauptprogramm ----------------------------------------------------- #main 'Label für Hauptprogramm UIRTim1=ON 'User-Assemblerroutine für TIM1 aktivieren init_tim1 'Timer-Modul passend initialisieren PrintSpc=ON 'SPACE vor einem dezimalen PRINT WHILE taste 'Werte ausgeben bis Tastendruck PAUSE 5 PRINT tastver_ergebnis;tastver_letzter WEND reset_tim1 'Timer-Modul wieder auf Defaultkonfiguration End2Host=ON 'nach dem Programmende in den Host-Modus END 'Programmende Meine Homepage: http://ccintern.dharlos.de |
Antwort schreiben |