![]() ![]() INFO - FAQ - CC2-Forum - CCPro-Forum |
|
Hallo zusammen! Ich habe wieder ein wenig getüftelt und ein neues Demoprogramm für die Open-Macro erstellt. Da ich stolzer Besitzer eines Velleman PCSGU250 bin, einem preiswerten 2-Kanal-USB-PC-Oszilloskop mit integriertem Funktionsgenerator, habe ich mit dem Funktionsgenerator ein Rechtecksignal erzeugt, dessen Periodendauer ich mit der Open-Macro ermittle. ' ---------------------------------------------------------------------------- ' Periodendauer eines Rechtecksignals an PORT[2] ermitteln. ' In OCBASIC 1.09a für Open-Macro von Dietmar Harlos am 17. September 2015. ' ---------------------------------------------------------------------------- ' Dieses Programm mißt die Periodendauer eines an PORT[2] (genauer: TCH1) einer ' Open-Macro angeschlossenen Rechtecksignals in 20-µs-Einheiten. Es können ' Frequenzen größer 50 Hz und kleiner 50 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 Periodendauer ist: peridau_ergebnis * 20E-6 s. ' Die gemessende Frequenz ist: 1/(peridau_ergebnis * 20E-6) Hz. ' In diesem Demoprogramm treten ab circa 850 Hz Störungen auf, weil die ' Ausgabe eines Zeichens über die an PORT[1] liegende Serielle Schnittstelle ' zu lange dauert. Der Controller "verschläft" die fallende Flanke des Signals. ' ---------------------------------------------------------------------------- INCLUDE "omac.def" 'Definitionen für die Open-Macro DEFINE taste PORT[4] 'eine Taste vom PE-Board DIM peridau_ergebnis WORD 'Ergebnis der Periodendauer-Messung DIM peridau_letzter WORD 'die letzte fallende Flanke merken ' --- Unsere eigene Assembler-Interruptroutine ------------------------------ ' Die folgende Assembler-Interruptroutine befindet sich im Timer-Channel-1- ' Interrupt und wird gestartet, wenn eine fallende 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 ! pushh ! pushx ! txa 'peridau_ergebnis = TCH1 - peridau_letzter ! sub peridau_letzter+1 ! sta peridau_ergebnis+1 ! pushh ! popa ! sbc peridau_letzter ! sta peridau_ergebnis ! bcc iiar_tim1_2 'wenn Überlauf: ! lda peridau_ergebnis+1 'peridau_ergebnis = peridau_ergebnis + #1000 ! add #$e8 ! sta peridau_ergebnis+1 ! lda peridau_ergebnis ! adc #$03 ! sta peridau_ergebnis #iiar_tim1_2 ! popx ! poph ! sthx peridau_letzter ! clc ! rts 'Rücksprung ins Betriebssystem END PROCEDURE ' Mit der folgenden Assemblerroutine wird das Timer Interface Module (TIM) ' passend umkonfiguriert. 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 #&b01110110,TSC 'TSC: TOF TOIE TSTOP TRST 0 PS2 PS1 PS0 ! mov #&b01001000,TSC1 'Input capture, Capture on falling edge only '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 #&b01000110,TSC 'Timer wieder starten ! rts END PROCEDURE ' Timer Interface Module (TIM) wieder so setzen, wie vom OS erwartet PROCEDURE reset_tim1 INLASM ! mov #&b01110110,TSC 'TSC: TOF TOIE TSTOP TRST 0 PS2 PS1 PS0 ! clr TSC1 'TIM Channel Status and Control Register ! 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 WHILE taste PRINT peridau_ergebnis;peridau_letzter WEND reset_tim1 'Timer-Modul wieder auf Defaultkonfiguration End2Host=ON 'nach dem Programmende in den Host-Modus END 'Programmende Viel Spaß und Erfolg mit den OM-Mikrocontrollern! Dietmar Meine Homepage: http://ccintern.dharlos.de |
Antwort schreiben |