Das Open-Control-Projekt - Die Alternative zur C-Control-I


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 

 Tastverhältnis eines Rechtecksignals ermitteln Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 22.09.2015 22:01)
Dietmar nutzt:  Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi, Open-Mini M-Unit, Open-Mini Station
' ----------------------------------------------------------------------------
' 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

Bisherige Antworten: