
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
||
|
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 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 |