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