Der Nachfolger des WDR-Computerclub mit Wolfgang Back und Wolfgang Rudolph - ...und immer ein Bit übrigbehalten!


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 

 OMICRO Port3 u. 4 keyb Interrupt benutzen für Impulszaehlung Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Joe - 19.02.2017 18:58)
Joe nutzt:  Open-Micro, Open-Macro
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

Bisherige Antworten:

Re: OMICRO Port3 u. 4 keyb Interrupt benutzen für Impulszaehlung (von Dietmar - 20.02.2017 17:18)
    OMICRO Port3 u. 4 keyb Interrupt benutzen für Impulszaehlung (von Joe - 23.02.2017 22:22)
        Re: OMICRO Port3 u. 4 keyb Interrupt benutzen für Impulszaehlung (von Dietmar - 24.02.2017 12:27)
            Polling? (von Norbert - 24.02.2017 18:38)
                Re: Polling? (von Norbert - 25.02.2017 2:13)
                    Port3 u. 4 mittels keyb Interrupt benutzen für Impulszaehlung (von Joe - 27.02.2017 23:28)
                       Prellen? (von Dietmar - 1.03.2017 17:36)
                          Re: Prellen? (von Joe - 2.03.2017 22:51)
                             KBSCR-Abfrage in BASIC (von Dietmar - 18.04.2017 3:34)
                             Re: Prellen? (von Dietmar - 6.03.2017 22:20)