
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
||
|
Hallo OMICRO Experten, nutze z.Zt die OMICRO um an Port 3 u. 4 ext. Impulse von einem Ferraris-Stromzaehlern und einem modernen elektronischen Str.-Zaehler einzulesen; Port 4 hat rel langen Low Impuls 0.1 bis 10 waehrend Port 3 einen rel kurzen Low Impulse von 0.040sec hat. Die Wiederholrate ist sehr verschieden da der Ferraris-Zaehler 75 Impuls/kWh u. der elektr. Zaehler 1000 Impulse/kWh ausgibt s.u., sodass es vorkommen kann, dass vom letzteren mehrere Impulse ankommen als vom Ferraris Zaehler. Die an Port 3 u. 4 angelegten Impulse wollten ich mittels Interrupt auszaehlen. Leider schaffe ich es nicht Port 3 und auch Port 4 zum Impuls zaehlen zu benutzen. Wenn ich Port4 mit einer Verriegelung analog z.B hier IF (Eingang = Low) AND (Verriegelung = 0) THEN Verriegelung = 1 Zähler = Zähler + 1 ENDIF IF (Eingang = High) AND (Verriegelung = 1) THEN Verriegelung = 0 Zähler = Zähler + 1 ENDIF abfrage, dann kann ich Port3 ohne Problem mittels Interrupt abfragen. Wenn ich es aber wie im folgenden Listing mache, dann liefert mir nur Port 3 oder Port 4 Zaehlwerte ab. Gibt es eine Lösung, dass man beide Ports mittels Interrupt abfragen kann? freundliche Grüße Joe ######## ausschnitt aus dem Listing des Testprogramms ##### ' P4P3Intr.BAS P4P3 Interrupt ' Status: vom Sa. 18.02.2017 ' Testprogramm zur Messung der Anzahl von Low-Impulse mit Wiederholtate 0.5 bis 500sec u. Im-Laenge 0.01 bis 10 an Port 4/Pin4 und ' der Anzahl von Low-Impulsen mit Wiederholrate 0.04 bis 40sec u. Impulslaenge 0.001sec an Port 3/Pin5 ' Hardware Port4: signal wird invertiert an Port [4] angelegt; Port 4 Interrupt gesteuert ' Hardware Port3: 0/5V Impulse werden angelegt an Port3 mittels Zusatzschaltung damit nicht HOST Mode auftritt ' so dass Port 3 im Einschaltmoment sauber an Betriebsspannung=5V liegt ' Die Programmuebertragung muss mit OCBASR.EXE in OPTION/TOOLS/BASIC Compiler erfolgen ' hier ohne compile benutzt, da Impulse nicht extrem schnell sind ' --- Betriebssystem konfigurieren ------------------------------------------ INCLUDE "OM.DEF" 'Include-Datei mit Definitionen ' --------------------------------------------------------------------------- ' --- Definition der Byte Variablen fuer das Hauptprogramm und die verwendeten Softwaremodule ' ---------------------------------------------- DEFINE Im_P4 byte 'Impulse zaehlen an PortP4/Pin4 DEFINE Im_P3 byte 'Impulse zaehlen an Port P3/Pin5 ' ---- Definition der Bitvariablen ' ----Definition Ports----------------------------------------------------------------------- DEFINE port4 port[4] 'Eingangsignal mit neg. Flanke ausgwertet DEFINE port3 port[3] ' " " '******** Interrupt Einstellung von Pin4/Port4 ' der folgende Code-Teil basiert auf ' aus ccintern.dharlos.de/forum/lesen.php?eintrag=11676 DEFINE mIrqReq &b00000010 'Maske zum Starten der BASIC-IRQ-Routine; warum wir da dieses Bit gesetzt u kein anderes? 'mIrqReq ist Konstante mit dem Wert #3 ==&b0000 0010 PROCEDURE iiar_kyb INLASM ! cbeqa #iKYB,iiar_kyb_1 'Falls kein Aufruf durch KYB-Interrupt;cbeqa=compare and branch if equal 'iKYB &b0001 0000 siehe OM.DEF ist konstante==keyboard interrupt module ! jmp iiar_kyb_ende+2 'dann zur naechsten IIAR in der Kette; jmp=jump zu iiar_kyb_ende+2 #iiar_kyb_1 ! lda -3,x 'Wert -3 "IrqReq" im OSSTAT-Register setzen; lade accu mit Wert -3 an adresse x ! ora #mIrqReq 'Bei der naechsten Gelegenheit startet die; ora=inclusive-OR accumulator and memory ! sta -3,x 'BASIC-IRQ-Routine.store -3 an adresse in x-index register ! clc 'Ruecksprung ins Betriebssystem; clc=clear carry bit ! rts 'rts=return from subroutine END PROCEDURE #iiar_kyb_ende 'hier hinter folgt die naechste IIAR '(sofern vorhanden)! Koennte hier ev. eine weitere Interrupt routine fuer Port 3 folgen? ' --- Das Hauptprogramm ----------------------------------------------------- #main CONFIG2=&b01000000 'IRQEN = Bit 6 im CONFIG2-Register des Kontrollers setzen 'INTERRUPT basirq_3 'BASIC-Interruptroutine vereinbaren 'KBIER=&b01000100 'Bit6=bit 6;Bit3=KBIE3=Pin4/Port4;Bit2=KBIE2=Pin5/Port3 'INTERRUPT basirq_4 'BASIC-Interruptroutine vereinbaren 'UIRKyb=ON 'User-Assemblerroutine fuer KEYB aktivieren 'KBIER=&b01001000 'Keyboard-Interrupt fuer PORT[4] aktivieren; ' zaehlt jeden tastendruck an Port 4 und 3 u. zaehlt nur Im_P4 hoch WHILE TRUE 'TRUE, funktioniert nur mit TRUE ' INTERRUPT OFF ' UIRKyb=OFF ' mit ON oder OFF hier werden nur Im_P3 Impulse gezaehlt ' INTERRUPT basirq_3 'BASIC-Interruptroutine vereinbaren ' KBIER=&b01000100 'Bit2=KBIE2=Pin5/Port3 'sobald die oberen 3 Zeile aktiviert sind wird nur noch Im_P3 gezaehlt 'obwohl basirq_4 aktivert ist PRINT "W_Im_P3=";Im_P3,"W_Im_P4=";Im_p4 Pause 100 INTERRUPT basirq_4 'User-Assemblerroutine fuer KEYB muss aktiviert werden sonst bleibt Prog stehen UIRKyb=ON 'User-Assemblerroutine fuer KEYB muss aktiviert werden sonst bleibt Prog stehen KBIER=&b01001000 'Keyboard-Interrupt fuer PORT[4] aktivieren; 'werden die basirq_3 in Zeile 64,65,66 ausgelassen, dann werden Im_P4 Impulse an Port 4 ' gezaehlt, aber nun wird auch bei Tastendruck an Port 3 die Variable Im_P4 hoch gezaehlt WEND END PROCEDURE basirq_3 'COMPILE 'Interruptroutine an Port 4 ADD Im_P3,1 PRINT "Im_P3=";Im_p3 RETURN INTERRUPT END PROCEDURE PROCEDURE basirq_4 'COMPILE 'Interruptroutine an Port 4 ADD Im_P4,1 PRINT "Im_P4=";Im_p4 RETURN INTERRUPT END PROCEDURE |
| Antwort schreiben |