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 

 Re: Port4 Impuls Breitenmessung, Port 3 Impuls Zaehlung Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Joe - 3.09.2010 19:26)
 Als Antwort auf Port4 Impuls Breitenmessung, Port 3 Impuls Zaehlung von Joe - 31.08.2010 22:04
Joe nutzt:  CC1-M-Unit V1.1, CC1-Station V2.0, Micro, Open-Micro
Hallo OMICRO Experten,

folgende Lösung habe ich gefunden, um an Port 3 ein Tongeneratorsignal und an Port 4 die Impulsbreite eines RC Servo Fernsteuerkanals zu messen.
Am vorhandenen Transistor zur Ansteuerung des Ports 3, wurde der Emitter nicht auf Masse gelegt, sondern über 220 Ohm mit Port 5 verbunden. An der Basis des Transistors liegt über 47kohm ein Ton-Signalgenerator. Der Kollektor liegt an Port 3 u. ist mit einem Widerstand von 22kohm mit +5V verbunden. Port5 sorgt dabei im Einschaltmoment dafuer, daß Port 3 = high ist und im Betrieb periodisch ein/ausgeschaltet wird, um damit das Signal des Tongenerators ebenfalls ein/Aus zuschalten.
Port 4 erhält sein Servosignal mittels eines Transistors, der das Signal invertiert.
Mit dieser Anordnung kann ich nun beide Signale messen, wobei die Tongeneratorsignal-Messung etwas beeinflußt wird durch die Servosignalmessung, siehe dazu auch das Listing unten.
Fall jemand eine bessere Idee hat, ohne die zusätzliche Nutzung eines Ports 5 oder eines anderen Ports, die Signale an Port 3 u. Port 4 zu messen, so wäre ich um Feedback dankbar.

Freundliche Grüße und Dank im voraus

Joe

############# Listing  ##########
'P3P4P_ME1.BAS
'Status: vom Fr.03.08.2010

' ---PPM Signalmessung 1 bis 2 msec eines RC-Fernsteuersignals
' Ausgabe des Pulsbreitenmess wertes an Port 1/Pin7
' Hardware Pin4: Fernsteuersignal wird invertiert an Port[4]/Pin4 angelegt; Port 4 Interrupt gesteuert
' Die Wiederholrate des Fernsteuersignals betraegt ca. 50Hz'**
' Hardware Pin5: Tongeneratorsignal wird ber Transistor an Port3/Pin5 angelegt; der Transistor wird ein/ausgeschaltet mittels Port5/Pin3

' --- Betriebssystem konfigurieren ------------------------------------------
INCLUDE "OM.DEF"           'Include-Datei mit Definitionen

' ---------------------------------------------------------------------------
' --- Definitionen Variable fuer das Hauptprogramm und die verwendeten Softwaremodule
' ----------------------------------------------
DEFINE zaehler  byte[01]           ' Hilfsvariable
DEFINE P3_Wert  byte[02]           ' Zahlenwert an Port 3
DEFINE P4_Wert  byte[03]           ' Zahlenwert an Port 4

' ----Definition Ports-----------------------------------------------------------------------
DEFINE port4 Port[4]  'PPM Eingangsignal invertiert an Port4; neg. Flanke triggert Pulszaehlfunktion
DEFINE PORT5 Port[5]  ' Schaltport schaltet Emitter von Transistor dessen Kollektor an Port 5 ist u. dessen Basis von Signalsgenerator angesteuert wird
'******************
DEFINE mIrqReq &b00000010 'Maske zum Starten der BASIC-IRQ-Routine

PROCEDURE iiar_kyb INLASM      'erfordert im Hauptprogramm das Label Main; Programm springt nach Procedure Ende sofort nach Main

! cbeqa #iKYB,iiar_kyb_1  'Falls kein Aufruf durch KYB-Interrupt,
! jmp iiar_kyb_ende+2     'dann zur naechsten IIAR in der Kette.

#iiar_kyb_1
! lda -3,x                'Das Bit "IrqReq" im OSSTAT-Register setzen.
! ora #mIrqReq            'Bei der naechsten Gelegenheit startet die
! sta -3,x                'BASIC-IRQ-Routine.

! clc                     'Ruecksprung ins Betriebssystem
! rts

END PROCEDURE

#iiar_kyb_ende            'hier hinter folgt die naechste IIAR
                          '(sofern vorhanden)
' --- Das Hauptprogramm -----------------------------------------------------
#main

INTERRUPT basirq          'BASIC-Interruptroutine vereinbaren
UIRKyb=ON                 'User-Assemblerroutine fuer KEYB aktivieren
KBIER=&b1001000           'Keyboard-Interrupt fuer PORT[4] aktivieren
WHILE TRUE
      IF zaehler THEN
         P4_Wert=Zaehler
         INTERRUPT OFF
         UIRKyb=OFF
         Port5=OFF
         Pause 50      ' seit hier Pause eingefuegt ist zaehlt er richtig
         FREQ=4
         P3_Wert=FREQ
         Port5=ON
         PRINT "P3_Wert= ";P3_Wert,"P4_Wert= ";P4_Wert
         ' P3 Messwert streut von 74 bis 82 u. wird beeinflusst von P4 Wert
         ' P4 Messung ist recht genau
         Pause 50
         zaehler=0
         INTERRUPT basirq       'User-Assemblerroutine fuer KEYB muss aktiviert werden sonst bleibt Prog stehen
         UIRKyb=ON              'User-Assemblerroutine fuer KEYB muss aktiviert werden sonst bleibt Prog stehen
     
      END IF
WEND        
END
PROCEDURE basirq   COMPILE   'Interruptroutine an Port 4 zum messen der Impulsbreite
     REPEAT
       ADD zaehler,1
     UNTIL port4
   RETURN INTERRUPT
END PROCEDURE

 Antwort schreiben

Bisherige Antworten: