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 

 Pulslaenge Messung, Compilierung mit OCBASR Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Joe - 17.04.2010 22:59)
Joe nutzt:  CC1-M-Unit V1.1, CC1-Station V2.0, Micro, Open-Micro
Hallo OMICRO Experten,

Folgende unten angeführte Programme
ANFRAGE0.BAS
11676PUO.BAS
wollte ich mittels OCBASR.EXE in einem Programmteil schneller machen.
Dazu wurde an den Programmteil zur Pulsbreitenbestimmung COMPILE angefügt
##
PROCEDURE basicirq COMPILE   'Interruptroutine;
                   'wenn Compile mittels OCBASR.exe benutzt wird kommt Fehlermeldung
                   'Zeile 48: interne Variable PTA nicht nutzbar; eventuell fehlt OPTION
     WHILE port4=off ' hier wird mit OCBAS.EXE ein Zaehlerwert von 5 bzw. 6 bis 10 bzw. 11 gezaehlt
           ADD zaehler,1
     WEND         ' dies ist Zeile 48
   RETURN INTERRUPT
END PROCEDURE  
##
Ohne COMPILE und mittels OCBAS.EXE compiliert funktionieren beide Programm
einwandfrei.
Da ich 4 Schaltfunktionen mit dem Fernsteuersignal ausführen wollte, versuchte ich durch eine schnellere Ausführung des Programmteils statt der Zaehlerwerte 5 oder 6 bis 10 oder 11 einen ca. Faktor 2 bis 3 höheren Zahlenwert zu erhalten, um für die 4 Schaltpunkte mehr Entscheidungs-Abstand zu bekommen.

Ich nutze die DOSIDE mit der neuesten Version 1.07 von OCBAS.EXE u. die aktuelle Version von OCBASR.EXE, sowie die neueste Include OM.DEF Version vom 14.04.2010
Ich habe schon alles mögliche versucht, bringe aber die Programme mit OCBASR.EXE nicht zum laufen.
Alle 3 Demoprogramme im OCBASR.ZIP Ordner laufen jedoch einwandfrei.
In der DOSIDE unter OPTION/TOOLS/BASIC COMPILER habe ich dabei jeweils OCBAS.EXE oder OCBASR.EXE eingetragen, um die jeweiligen Programme zu compilieren.

Welchen Fehler mache ich noch? Vielleicht kann mir jemand weiterhelfen!

Vielen Dank im voraus

Joe Fenk

#############
'ANFRAGE0.bas ist abgeleitet von D Harlos Vorschlag vom 22.03.2010
'** und zeigt die Nutzung des RC-Fernsteuersignals von 1..2msec fuer Schaltfunktionen
' Stand vom Sa. 11.04.2010

' ---PPM Signalpulsbreiten messung von 1 bis 2 msec eines RC-Fernsteuersignals

' Hardware: Fernsteuersignal wird gleichzeitig an  Port[3] u. Port [4] angelegt
' 1msec => ca. 5 oder 6 ausgegebener Zaehlerwert
' 2msec => ca. 10 bis 11 ausgegebener Zaehlerwert
' Die Wiederholrate des Fernsteuersignals betraegt ca. 50Hz'**bzw. ca. 20 msec

' --- Betriebssystem konfigurieren ------------------------------------------
INCLUDE "OM.DEF"           'Include-Datei mit Definitionen
' ---------------------------------------------------------------------------
' --- Definitionen Variable fuer das Hauptprogramm und die verwendeten Softwaremodule
' ----------------------------------------------
DEFINE zaehler  byte[01]           ' Hilfsvariable
' ----Definition Ports-----------------------------------------------------------------------
DEFINE port2 Port[2]  'Wird zwischen Zaehlerwert 6 bis 7 eingeschaltet
DEFINE port4 Port[4]  'PPM Eingang invertiert; desgleichen Port 3 genutzt fuer Interrupt; Port 4 als Pulsbreitenzaehler Eingang
DEFINE port5 Port[5]  'Wird zwischen Zaehlerwert 7 bis 9 eingeschaltet
DEFINE port6 Port[6]  'Wird zwischen Zaehlerwert 9 bis 11 eingeschaltet

port2=off
port5=off
port6=off

Config2=&b01000000  'IRQEN im Config Register des Controllers setzen
INTERRUPT basicirq  'Basic Interuptroutine vereinbaren
' --- Das Hauptprogramm -------------------------------------------------------------------

WHILE ON                '  On oder TRUE
      IF zaehler <>0 THEN
         Print "Zaehler=";zaehler
         Print
           PAUSE 50
         zaehler=0
      END IF
WEND        

END

PROCEDURE basicirq COMPILE   'Interruptroutine;
                   'wenn Compile mittels OCBASR.exe benutzt wird kommt Fehlermeldung
                   'Zeile 48: interne Variable PTA nicht nutzbar; eventuell fehlt OPTION
     WHILE port4=off
           ADD zaehler,1
     WEND         ' dies ist Zeile 48
   RETURN INTERRUPT
END PROCEDURE  
##### ab hier 2-tes Programm ##########################################
' Test von JFenk eines Vorschlages aus Eintrag 11676
' aus ccintern.dharlos.de/forum/lesen.php?eintrag=11676
' Hostmode, belegt IRQ Port, Startprobleme Kategorie:  (von Wolfgang - 5.11.2006 14:05)
' Auswertung eines Modellbau Empfaenger Signals um dann etliche Sachen zu Steuern...)
' Leider laesst es sich nicht immer sicherstellen (z.b. beim Einschalten) das zum Reset-Zeitpunkt die
' Port3 Leitung nicht gerade LOW ist.
' Dann wechselt der Controller aber in den Hostmode und wartet dort.
' Gibt es evt. die Moeglichkeit den Hostmode Input auf einen anderen Port zu legen? Der IRQ input
' ist hier sehr kostbar. Oder kann man das anders loesen? (evt. ein kurzes oder einstellbares Timeout?)

' Das Ganze ist sehr zeitkritisch da man das Timing dort genau vermessen muss. Die CPU wird also ca 30% der Rechenzeit im IRQ verbringen.
 
' ccintern.dharlos.de/forum/lesen.php?eintrag=11678
' Feedback von D.Harlos
' In diesem Fall bleibt Dir eigentlich nichts anderes uebrig,
' als die IRQ-Funktionalitaet auf einen anderen Port zu legen.
' Allerdings ist IRQ vom Kontroller fest an PORT[3] gebunden und kann nicht
' verlegt werden. Es ist jedoch moeglich, bei einer Aenderung an einem
' Digitalport einen Keyboard-Interrupt ausloesen zu lassen.
' Das wird im Betriebssystem bereits bei FREQ, bzw. FREQ1 benutzt.
' In diesem Fall benoetigst Du ein kleines Assemblerprogramm im Keyboard-Interrupt,
' mit dem das IRQ-Flag bei Auftreten des Interrupts gesetzt wird.

' Ich habe einmal auf die Schnelle das folgende Programm erstellt und auf der
' Open-Micro getestet. Hier wird jedes Mal, wenn an PORT[4] eine High-Low-Flanke
' detektiert wird, die BASIC-Interruptroutine gestartet.
' Also auch nicht viel anders als beim IRQ-Interrupt, der nur an PORT[3] nutzbar
' ist. Es ist allerdings zu beachten, dass PORT[4] nicht mehr als Ausgabepin
' zu benutzen ist. Ausserdem beisst sich die Nutzung des Keyboard-Interrupts ueblicherweise mit FREQ, genauer FREQ1.

' ---------------------------------------------------------------------------
' BASIC-Interruptroutine bei einem Keyboard-Interrupt aufrufen
' In OCBASIC fuer Open-Micro, Open-Mini und Open-Midi von Dietmar Harlos.
' ---------------------------------------------------------------------------

INCLUDE "om.def"          'Definitionen fuer die Open-Micro und Open-Mini

DEFINE a,b,c BYTE         'ein paar Variablen
DEFINE zaehler  byte[01]          ' zaehl variable zur Bestimmung der Impulslaenge

DEFINE port4    PORT[4]           ' Port 4 zuweisung

' --- Unsere eigene Assembler-Interruptroutine ------------------------------

' Die OM-Kontroller unterstuetzen das Einbinden einer Assemblerroutine in
' den Keyboard-Interrupt.

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
    PRINT "zaehler=";zaehler
    Pause 50
    zaehler=0
  END IF
WEND                      'kurze PAUSE-Befehle aufteilen.

END

' --- Die BASIC-Interruptroutine --------------------------------------------

PROCEDURE basirq COMPILE          'Interrupt an Pin4, Port4 der OM
   WHILE  port4=off               '
     ADD zaehler,1
     WEND
  RETURN INTERRUPT        'wenn in Zeile 88 COMPILE aktiviert ist, kommt Meldung Zeile 92: interne Variable nicht nutzbar. Eventuell fehlt Option
END PROCEDURE

 Antwort schreiben

Bisherige Antworten:

Re: Pulslaenge Messung, Compilierung mit OCBASR (von Dietmar - 19.04.2010 21:58)
    Nachtrag (von Dietmar - 19.04.2010 22:54)
        Re: Nachtrag (von Joe - 20.04.2010 20:05)
            Re: Nachtrag (von Dietmar - 20.04.2010 20:55)
                Re: Nachtrag (von Joe - 20.04.2010 22:58)