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