Der Nachfolger des WDR-Computerclub mit Wolfgang Back und Wolfgang Rudolph - ...und immer ein Bit übrigbehalten!


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Periodendauer eines Rechtecksignals ermitteln Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 18.09.2015 1:21)
Dietmar nutzt:  Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi, Open-Mini M-Unit, Open-Mini Station
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

Bisherige Antworten: