PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ereigniszähler



Wrage
22.11.2007, 12:20
Hallo Leute

Zur Beschreibung

Wir haben eine rutierende Scheibe mit Metalproben. Diese Proben werden von einem Induktiven-Schalter erkannt. Die Proben kommen je nach Drehzahl im Abstand
von ca 0,1 sec.

Wir wollen jetzt die Impulse mit der C-Control M-Unit2 erkennen.
Wir sind dafür an den Frequenzeingang (DFC1) gegangen und wollen den Eingang als Ereigniszähler nutzen.

Mit Folgendem Programmcode:
define LIGHT port[16]
define poti ad[1]

#system_init
LIGHT=off
define z word[13]
define x word[14]

'---- Umstellung Frequenz Ereignis -
PRINT"#ON_CONFIG#";
print"#INIT#";
PRINT"#COMMAND#";
PRINT"#PUT 00000110b#"
PRINT"#OFF_CONFIG#";

z=0
#LOOP

x=freq1
IF x=1 THEN GOTO Zaehler1 ELSE GOTO Zaehler2

#Zaehler1
z=z+1
GOTO Anzeige

#Zaehler2
z=z
GOTO Anzeige
'------------ ANZEIGE ---------------------
#Anzeige
print"#ON_LCD#";"#INIT#";

print"#L101#";
print"Ereignis ";:print FREQ;

print"#L201#";
print"Zaehler ";:print z;

goto LOOP

Uns wird leider weiterhin die Frequenz angezeigt.

Wir benötigen die Erkennung der einzelnen Proben um eine Geschwindigkeit berechnen zu können.

Wir sind für jeden Tip dankbar

Drifter2006
22.11.2007, 14:10
Hello Wrage,
Try this


'Event Counter'
define lcd_backlight_off port[16]
define e_count freq1

print"#ON_LCD#";"#INIT#";"#CLR#";"#OFF#";
lcd_backlight_off = 0

print"#ON_CONFIG#";
put &b00000010
print"#OFF#";

e_count = 0

#loop
print"#ON_LCD#";"#L101#";"e_count=";e_count;" ";"#OFF#";
goto loop
Greetings,
Drifter2006

Suggarman
23.11.2007, 08:51
Dafür gibt es doch ein fertiges Beispielprogramm:


'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIII
'IIIIIII DEMO ZUM BASIC-COMPUTER UNIT M 1.2/2.0 (by DIE HARD) IIIII
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIII
'--------------------------------------------------------------------
' Beispiel zum BASIC-COMPUTER mit dem Programmer/Application-Board
'--------------------------------------------------------------------
' ANWENDUNG: EREIGNISZÄHLER FREQ1 und FREQ2
'
'--------------------------------------------------------------------
' Dieses Beispiel zeigt die Vorgehensweise um die beiden Frequenzzähler
' als Ereigniszähler zu konfigurieren und abzufragen. Die Konfiguration
' erfolgt über ein KONFIGURATIONS-REGISTER, das wie alle erweiterten
' Funktionen über die "REDIRECT PRINT" Funktion gelesen und geschrieben
' werden kann.
'--------------------------------------------------------------------
' Das Konfigurations-Register bietet folgende Optionen.
'
' Bit 0 Schaltet beide PWM-DACs in den SERVO-Mode
' Bit 1 Schaltet den Frequenzzähler 1 in den EREIGNISZÄHLER Mode
' Bit 2 Schaltet den Frequenzzähler 2 in den EREIGNISZÄHLER Mode
' Bit 3 Aktiviert die PULLUP-Widerstände an PORT 1 bis 8
' Bit 4 Aktiviert die PULLUP-Widerstände an PORT 9 bis 15
' Bit 5 Zeigt an wenn die interne Uhr mit DCF77 synchronisiert wurde
' Bit 6 Signalisiert einen Fehler bei der IIC-Kommunikation
' Bit 7 Zustand der Start-Taste
'---------------------------------------------------------------------
' Einzelheiten darüber finden Sie in den Demos zu den EXTENDED FUNCTIONS
' - LCD MODULE über die zusätzlichen Funktionen für das LCd
' - CONFIG MODULE über die zusätzlichen Funktionen für die Konfiguraton
'
' Beschreibung:
' FREQ1 und FREQ2 sind Systemvariablen die nicht separat angelegt werden
' müssen. Ist der Zähler als Ereigniszähler konfiguriert, beeinhalten diese
' Variablen den aktuellen Zählerstand von Ereignissen.
' Im CONFIG-REGISTER bestimmen Bit 1 und Bit 2 die Funktion von FREQ1 u. FREQ2
' Beide Eingänge können getrennt konfiguriert werden, d.h. während einer
' der Eingänge ein Ereigniszähler ist kann der andere auch ein Frequenzzähler
' sein.
' Die Zähler können gelöscht werden, wenn den Systemvariablen jeweils der Wert 0
' zugewiesen wird.
' Ausserdem können Sie den Zählern beliebige Anfangswerte zuweisen, z.B.
' einem Zählerstand vom Vortag
' Der Ereigniszähler kann einen max. Wert von 32767 annehmen und zählt dann
' nicht mehr weiter
' Wenn Sie einen Frequenzgenerator an diese Eingänge anschliessen werden
' die registrierten Impulse im LCD angezeigt.
' Behelfsweise können Sie den DA1 Ausgang mit dem Frequenzzählereingang
' verbinden. Er erzeugt etwa 1880 Impulse pro Sekunde.
'
' In diesem Beispiel wird der Zähler 1 bei Null und der Zähler 2 bei 1000
' gestartet. Beide Zähler werden bei 32767 gelöscht.
' Der Wert für jeden Zähler wird auf dem LCD ausgegeben.
' Für die Anzeige selbst wird die "REDIRECT PRINT" Funktion verwendet,
'-----------------------------------------------------------------------

'--------------------------
'------ I/O PORTS ---------
'--------------------------

'--------------------------
'---- SYSTEM MEMORY -------
'--------------------------
define TEMPVAL byte[1]


#INIT

'--UMLEITUNG DER PRINT-FUNKTION AUF DAS CONFIG-MODULE -
print"#ON_CONFIG#"; 'UMGELEITET
get TEMPVAL 'den aktuellen Wert lesen
put (TEMPVAL or &B0000110) 'Bits setzten und zurück schreiben
print"#OFF#"; 'Umleitung abschalten

'--UMLEITUNG DER PRINT-FUNKTION AUF DAS LCD-MODULE ----
print"#ON_LCD#";
print"#INIT#";
'----- ZÄHLER 1 AUF EINEN STARTWERT EINSTELLEN --------
FREQ1=1000
'-------------------------------------------------
'-- DISPLAY DATA LOOP -
'-------------------------------------------------
#LOOP
print"#L101#"; 'CURSOR AUF ZEILE 1 POS 1
print"EVENTS1: ";:print FREQ1 ; 'AUSGABE FREQUENZ
print" "; 'REST DER ZEILE LÖSCHEN
print"#L201#"; 'CURSOR AUF ZEILE 2 POS 2
print"EVENTS2: ";:print FREQ2; 'AUSGABE FREQUENZ
print" "; 'REST DER ZEILE LÖSCHEN
'---- ZÄHLER BEI MAX. ZÄHLERSTAND LÖSCHEN -------
if FREQ1=32767 then FREQ1=0
if FREQ2=32767 then FREQ2=0
goto LOOP


Auf den ersten Blick würde ich sagen, dass der Fehler in "Freq" anstatt "freq1" oder "freq2" liegt.

mfg

Stefan

Wrage
27.11.2007, 10:26
Vielen Dank für die Hilfe

Hat geklappt.

Jetzt haben wir ein anderes Problem, vielleicht kann uns dabei auch jemand helfen.

Wir haben zwei umfangreiche Programme geschrieben, die einzelnd auch so laufen, wie ir uns das vorstelle. Wenn wir die beiden Programme zusammen fügen, dann hängt das Programm. Wir haben, die Stelle auch gefunden. Hier ist dann nur noch eine Addition von 1+1 möglich, bei 1+10 ist Ende.
Kann der Interne Speicher voll sein?
Macht es Sinn die einzelnen Programmme in Function zu schreiben?
Wo ist der Vorteil einer Function und was macht Sieß

Vielen Dank im Vorraus

Amiwerewolf
30.11.2007, 20:14
ich vermutte das du bei der addition zwei mal die gleiche variable benutzt und irgendwo dann dein programm streikt weil die variable zu groß ist!

vorteil einer funktion ist das sie einen wert ausgegen kann oder direkt mir einer anderen anweisung ausgeführt werden kann. z.B. eine variable im quadrat durch 100 teilen und 5 dazuzählen nehmen:




print test(50) 'gibt 30 am terminal aus
end

function test (b as byt)
define c as word
c = b * b '=2500
c = c / 100 '=25
c = c + 5 '=30
return c
end function


mehere funktionen ineinander verstapeln können allerdings ein problem ergeben, da immer byte 1&2 im Ram genutzt werden und mehrere ineinernader verschachtelte die variable überschereiben!