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 

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

im unten angeführten Programm versuche ich folgende Messung durchzuführen:
an Port 4 eine  Impuls Breitenmessung eines angelegten RC-Fernsteuersignals mit 1-2 msec Breite
an Port 3 eine Impuls Zaehlung eines angelegten Signalgenerators (derzeit als Ersatz eines Tacho Generators) mit der Frequenz 1kHz.

Lege ich mein Programm so aus, dass die Frequenzmessung an Port 3 entfällt, dann bekomme ich eine fehlerfrei Messung der Impulsbreite des Servosignals.
Sobald ich jedoch im Programm an Port 3 die Messung der Impulse aktiviert habe,  bekomme ich eine fehlerhafte Auswertung  entweder von der Impulsbreite oder der Impulszaehlung oder sogar von beiden Werten, je nachdem ob Freq=off im Programm enthalten ist oder nicht enthalten ist. Siehe dazu die Details unten im Programmlisting

' Wuerde alles einwandfrei laufen, dann wuerden folgenden richtigen Zahlenwerte
      ' ausgegeben   Zaehler=32 u. Imp_wert= 80 mit max. Fehlertoleranz +/- 1

      ' ohne FREQ=4; Imp_wert=FREQ; FREQ=off; Pin5 auf Masse=keine Impulse erfolgt eine Printausgabe: Zaehler=32; Imp_wert=0; FREQ=0;
      ' ohne FREQ=4; Imp_wert=FREQ aber  FREQ=off eingefuegt; Pin5 auf Masse=keine Impulse erfolgt eine Printausgabe:Zaehler=32; Imp_wert=0; FREQ=0, wie vorher
      ' FREQ=4; Imp_wert=FREQ eingefuegt, jedoch ohne FREQ=off u. Pin5 Masse, es folgt Printausgabe 1-mal: Zaehler=32; Imp_wert=0; FREQ=0
      ' FREQ=4; Imp_wert=FREQ eingefuegt, jedoch ohne FREQ=off u. Pin5 mit Signal, es folgt Printausgabe:Zaehler=4 bis 37; Imp_wert=78 bis 80; FREQ=78 bis 80
      ' FREQ=4; Imp_wert=FREQ; FREQ=off eingefuegt u. Pin5 ohne Signal, es folgt Printausgabe:Zaehler=32 bis 33; Imp_wert=33 bis 145; FREQ=33...145
      ' FREQ=4; Imp_wert=FREQ; FREQ=off eingefuegt u. Pin5 mit Signal, es folgt Printausgabe:Zaehler=34 bis 37; Imp_wert=100 bis 211; FREQ=100...211

Sowohl die Impulsbreitenmessung an Port4 als auch die Impuls Zaehler Messung an Port 3 verursachen einen Interrupt. Anscheinend stören sich diese und führen zu den Messfehlern.
Wie müsste das Programm ausgeführt werden, damit  beide Messungen fehlerfrei wären?

Freundliche Grüße und Dank im voraus

Joe
####  Programm Listing fuer Impulsbreitenmessung an Port4 und Impulszaehlung an Port 3
' P4P3_MSE.BAS   Port4 und Port3 Messung mit 3 sekunden Zeitschleife
' Status: vom Di. 31.08.2010
' Programm zaehlt sauber den Wert 32 oder 33, ist die 3 Sekunden Zeitschleife nicht im Programm, so liegen die Werte bei  31,32
' ---PPM Signalmessung 1 bis 2 msec eines RC-Fernsteuersignals
' Ausgabe des Pulsbreitenmess wertes an Port 1/Pin7
' Hardware an Port4/Pin4: Servo-Fernsteuersignal mit 1msec Breite wird Port [4] angelegt; Port 4 Interrupt gesteuert
' Die Wiederholrate des Fernsteuersignals betraegt ca. 50Hz'**
' Hardware an Port3/Pin5: Mittels Signalgenerator und Zusatztransistor wird 1 kHz Signal an Port3 angelegt. Zusatztransistor sorgt dafür, dass Port 3 im Einschaltmoment High ist.

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

' ---------------------------------------------------------------------------
' --- Definitionen Variable fuer das Hauptprogramm und die verwendeten Softwaremodule
' ----------------------------------------------
DEFINE zaehler  byte[01]           ' Messung des Zaehlwertes des Impuses an Port 4
DEFINE Sek_wert byte[02]           ' Zwischenspeicher fuer Sekundenwert
DEFINE Imp_wert byte[03]           ' Messung der Anzahl der Impulse an Port 3/Pin5
' ---- Definition der Bitvariablen
DEFINE Flag1    bit[249]  'von Byte 32; benoetigt zur Verzweigung bei Sekunde Abfragung

' *** Definition von Konstanten

DEFINE Re_Wert 34      ' ca. 750 Hz Ton
DEFINE Dauer    6      ' Beep Tonlaenge



' ----Definition Ports-----------------------------------------------------------------------
DEFINE port4 Port[4]  'PPM Eingangsignal invertiert an Port4; neg. Flanke triggert Pulszaehlfunktion

'******************
DEFINE mIrqReq &b00000010 'Maske zum Starten der BASIC-IRQ-Routine

PROCEDURE iiar_kyb INLASM

! 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
      Sek_Wert=second  
      If Flag1=on Then
         If Sek_Wert Mod 3=0 Then
            GOTO Weiter
         ELSE
            Flag1=off
         ENDIF
         GOTO Weiter  
      ELSE
         IF Sek_Wert MOD 3<>0 Then
            GOTO Weiter
         ELSE
            Flag1=ON
         ENDIF
      ENDIF
      FREQ=4
      Imp_wert=FREQ
      PRINT "Sekunde="; Sek_Wert;"  Zaehler= "; zaehler;"  Imp_wert= ";Imp_wert;"  FREQ= ";Freq  
      ' Wuerde alles einwandfrei laufen, dann wuerden folgenden richtigen Zahlenwerte
      ' ausgegeben   Zaehler=32 u. Imp_wert= 80 mit max. Fehlertoleranz +/- 1
      ' ohne FREQ=4; Imp_wert=FREQ; FREQ=off; Pin5 auf Masse=keine Impulse erfolgt eine Printausgabe: Zaehler=32; Imp_wert=0; FREQ=0;
      ' ohne FREQ=4; Imp_wert=FREQ aber  FREQ=off eingefuegt; Pin5 auf Masse=keine Impulse erfolgt eine Printausgabe:Zaehler=32; Imp_wert=0; FREQ=0, wie wie vorher
      ' FREQ=4; Imp_wert=FREQ eingefuegt, jedoch ohne FREQ=off u. Pin5 Masse, es folgt Printausgabe 1-mal:Zaehler=32; Imp_wert=0; FREQ=0
      ' FREQ=4; Imp_wert=FREQ eingefuegt, jedoch ohne FREQ=off u. Pin5 mit Signal, es folgt Printausgabe:Zaehler=4 bis 37; Imp_wert=78 bis 80; FREQ=78 bis 80
      ' FREQ=4; Imp_wert=FREQ; FREQ=off eingefuegt u. Pin5 ohne Signal, es folgt Printausgabe:Zaehler=32 bis 33; Imp_wert=33 bis 145; FREQ=33...145
      ' FREQ=4; Imp_wert=FREQ; FREQ=off eingefuegt u. Pin5 mit Signal, es folgt Printausgabe:Zaehler=34 bis 37; Imp_wert=100 bis 211; FREQ=100...211
           
      Print
      FREQ=off
   '  BEEP Re_wert,Dauer,BEEPER
      #Weiter
      zaehler=0
   END IF
WEND        

END

PROCEDURE basirq   COMPILE   'Interruptroutine an Port 4
     REPEAT
       ADD zaehler,1
     UNTIL port4
   RETURN INTERRUPT
END PROCEDURE

 Antwort schreiben

Bisherige Antworten:

Re: Port4 Impuls Breitenmessung, Port 3 Impuls Zaehlung (von Joe - 3.09.2010 19:26)