PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Messung von impulsen



brummelbär
15.12.2006, 14:46
das Problem besteht darin das in diesem Programm die Messung funktioniert aber super langsam, wie ne Schildkröte. Es schafft ein Signal pro Sekunde. Habe schon Programme gesehen, wo 200 pro Sekunde geschafft werden. Weiß aber nicht warum meins das nicht kann.
Habs hier mal angehängt. Es gibt schon ein paar mehr definierte Werte, die werden aber es später gebraucht, falls das Programm mal schneller zählt als jetzt. Hoffe mir kann jemand helfen!?!?




' Wenn an Digitalport 7 eine HIGH anliegt beginnt der Zählvorgang.
' Es wird zuvor die Zeit unmittelbar vor dem Zählen gespeichert.
' Wenn an Digitalport 7 eine LOW anliegt wird die Zeit erneut gespeichert
' und der Zählvorgang beendet.
' Es wird die verstrichene Zeit ermittelt.
' Es wird folgendes gezählt
' a) HIGH Pegel an Digitalport 5
'
' Ausgabe erfolgt auf die LCD
'
'

'############################################
'
' Definitionen für LCD Ausgabe
'
'############################################

' *** Daten-Definition ***
define lcd_buf byte
define lcd_param byte

' *** Definition LCD-Ports ***
define lcd_port byteport[2]
define lcd_rs port[14]
define lcd_rw port[13]
define lcd_e port[15]

'*** ASCII-Codes ***
define A_ &H41
define B_ &H42
define C_ &H43
define D_ &H44
define E_ &H45
define F_ &H46
define G_ &H47
define H_ &H48
define I_ &H49
define J_ &H4A
define K_ &H4B
define L_ &H4C
define M_ &H4D
define N_ &H4E
define O_ &H4F
define P_ &H50
define Q_ &H51
define R_ &H52
define S_ &H53
define T_ &H54
define U_ &H55
define V_ &H56
define W_ &H57
define X_ &H58
define Y_ &H59
define Z_ &H5A

define AUSRUFEZ &H21
define LEERZ &H20
define MINUS &H2D
define NULL &H30
define GLEICH &H3D
define DOPPELPUNKT &H3A
define KLAMMERZ &H29
define PUNKT &H2E


'*** Programmoperationen ***

gosub LCD_INIT:gosub LCD_CLS
pause 10
'############################################
'
' Programmquelltext
'
'############################################
'################################################# #####
'
' Definitionen von Eingängen, Ausgängen und Variablen
'
'################################################# #####


define Z_ODER_NICHT_Z port[7] ' Digitalport 1 zählen oder nicht zählen
define PD1 port[5] ' Digitalport für PD1
'PD1 = OFF
define PD2 port[2] ' Digitalport für PD2

'!!! Ein- und Ausgängedefinitionen!!!

define dig1 bit[5] ' Für Digitalport 1
dig1 = OFF
define dig2 bit[6] ' Für Digitalport 2
dig2 = OFF
define dig3 bit[7] ' Für Digitalport 3
dig3 = OFF

'!!!Zeitdefinitionen!!!

define anfm byte[17] ' Minuten zu Beginn des Zählens
anfm = 0
define anfs byte[18] ' Sekunden zu Beginn des Zählens
anfs = 0
define endm byte[13] ' Minuten am Ende des Zählens
endm = 0
define ends byte[14] ' Sekunden am Ende des Zählens
ends = 0
define anfspum byte[5] ' Sekunden zu Anfang eines jeden Intervalls der Pumpe
anfspum = 0
define endspum byte[6] ' Sekunden zum Vergleich fürs Pumpenintervall
endspum = 0
define anfskamla byte[8] ' Sekunden zu Anfang eines jeden Intervalls der Kamera- und Laserschutzzeit
anfskamla = 0
define endskamla byte[9] ' Sekunden zum Vergleich für die Kamera- und Laserschutzzeit


define zeitgenommen byte[4] ' Kontrollbit, ob bereits in mal ausgegeben wurde ????????????????????
zeitgenommen = 0 ' ?????????????????????

'!!!Seukunden und Minuten berechnet!!!

define gess byte[15] 'Gesamtsekunden
gess = 0
define gesm byte[16] 'Gesamtminuten
gesm = 0
define gesspum byte[7] 'Gesamtsekunden im Pumpintervall
gesspum = 0
define gesskamla byte[10] 'Gesamtsekunden im Kamera- und Laserschutzzeitintervall

'!!!Variblendefinition!!!

define zPD1 word[10] ' Zählvariable für PD1
zPD1 = 0
define zPD2 word[11] ' Zählvariable für PD2
zPD2 = 0
define zPD3 word[12] ' Zählvariable für PD1 & PD2
zPD3 = 0

'!!!Definitionan fürs Display!!!

define value word[10] ' Wort für die Ausgabe ans LCD
define output word[11] ' Wort für die Ausgabe ans LCD




'#########################Standby-Modus################################

#Standbyschleife 'Loop Marke um Programmteil 1 zu wiederholen

gosub LCD_CLS

lcd_param = 1 : gosub LCD_GOTOLINE

lcd_param = B_ : gosub LCD_WRITECHAR
lcd_param = E_ : gosub LCD_WRITECHAR
lcd_param = R_ : gosub LCD_WRITECHAR
lcd_param = E_ : gosub LCD_WRITECHAR
lcd_param = I_ : gosub LCD_WRITECHAR
lcd_param = T_ : gosub LCD_WRITECHAR
lcd_param = AUSRUFEZ : gosub LCD_WRITECHAR

if Z_ODER_NICHT_Z then goto Programmdurchlauf ' wenn an port[7] ein HIGH anliegt beginne zu zählen

goto Standbyschleife

'################################################# #############



'##########################Hauptprogramm-Modus####################################

#Programmdurchlauf 'Hauptprogramm in dem gezählt wir und Pumpe, Laser und Kamera gesteuert wird

gosub LCD_CLS

anfm = minute 'Zeit setzen Zähler
anfs = second 'Zeit setzen Zähler
anfspum = second 'Zeit setzen Pumpe
anfskamla = second 'Zeit setzen Kamera un Läser

lcd_param = 1 : gosub LCD_GOTOLINE

lcd_param = L_ : gosub LCD_WRITECHAR
lcd_param = O_ : gosub LCD_WRITECHAR
lcd_param = S_ : gosub LCD_WRITECHAR
lcd_param = LEERZ : gosub LCD_WRITECHAR
lcd_param = G_ : gosub LCD_WRITECHAR
lcd_param = E_ : gosub LCD_WRITECHAR
lcd_param = H_ : gosub LCD_WRITECHAR
lcd_param = T_ : gosub LCD_WRITECHAR
lcd_param = S_ : gosub LCD_WRITECHAR
lcd_param = AUSRUFEZ : gosub LCD_WRITECHAR

#Durchlauf

if not Z_ODER_NICHT_Z then goto Ausgabe ' wenn an port[X] ein LOW anliegt beginne zu zählen

if PD1 then zPD1 = zPD1 + 1 'Zähler PD1 zählt
if PD2 then zPD2 = zPD2 + 1 'Zähler PD2 zählt
'if PD3 then zPD3 = zPD3 + 1 'Zähler PD3 zählt wenn PD1 und PD2 gleichzeitig zählen

goto Durchlauf

'################################################# #############



'########################Display-Modus######################################

#Display

gosub LCD_CLS

lcd_param = 1 : gosub LCD_GOTOLINE

lcd_param = P_ : gosub LCD_WRITECHAR
lcd_param = D_ : gosub LCD_WRITECHAR
lcd_param = NULL + 1 : gosub LCD_WRITECHAR
lcd_param = DOPPELPUNKT : gosub LCD_WRITECHAR
lcd_param = LEERZ : gosub LCD_WRITECHAR

value = zPD1
gosub WRITEZAEHLER

lcd_param = P_ : gosub LCD_WRITECHAR
lcd_param = D_ : gosub LCD_WRITECHAR
lcd_param = NULL + 2 : gosub LCD_WRITECHAR
lcd_param = DOPPELPUNKT : gosub LCD_WRITECHAR
lcd_param = LEERZ : gosub LCD_WRITECHAR

value = zPD2
gosub WRITEZAEHLER

lcd_param = 2 : gosub LCD_GOTOLINE ' Wechsel in die zweite Zeile

lcd_param = P_ : gosub LCD_WRITECHAR
lcd_param = D_ : gosub LCD_WRITECHAR
lcd_param = NULL + 3 : gosub LCD_WRITECHAR
lcd_param = DOPPELPUNKT : gosub LCD_WRITECHAR
lcd_param = LEERZ : gosub LCD_WRITECHAR

value = zPD3
gosub WRITEZAEHLER
goto Durchlauf

'################################################# #############



'########################Ausgabe-Modus######################################

#Ausgabe

endm = minute 'Minuten am Ende der Zählung
ends = second 'Sekunden am Ende der Zählung

gesm = endm - anfm 'Berechnung der verstrichenen Minuten
gess = ends - anfs 'Berechnung der verstrichenen Sekunden

if gess < 0 then ends = ends + 60 : gesm = gesm - 1 ' Fange Ueberlauf der Sekunden auf
if gesm < 0 then endm = endm + 60 ' Fange Ueberlauf der Minuten auf

#Ergebnis

lcd_param = 1 : gosub LCD_GOTOLINE

lcd_param = Z_ : gosub LCD_WRITECHAR
lcd_param = E_ : gosub LCD_WRITECHAR
lcd_param = I_ : gosub LCD_WRITECHAR
lcd_param = T_ : gosub LCD_WRITECHAR
lcd_param = DOPPELPUNKT : gosub LCD_WRITECHAR
lcd_param = LEERZ : gosub LCD_WRITECHAR

value = gesm
gosub WRITEZEIT

lcd_param = LEERZ : gosub LCD_WRITECHAR
lcd_param = DOPPELPUNKT : gosub LCD_WRITECHAR
lcd_param = LEERZ : gosub LCD_WRITECHAR

value = gess
gosub WRITEZEIT

lcd_param = 2 : gosub LCD_GOTOLINE ' Wechsel in die zweite Zeile

lcd_param = P_ : gosub LCD_WRITECHAR
lcd_param = D_ : gosub LCD_WRITECHAR
lcd_param = NULL + 1 : gosub LCD_WRITECHAR
lcd_param = DOPPELPUNKT : gosub LCD_WRITECHAR
lcd_param = LEERZ : gosub LCD_WRITECHAR

value = zPD1
gosub WRITEZAEHLER

goto Ergebnis

'################################################# #############

'ENDE'

'##########################für Ausgabe der Zahlen####################################


#WRITEZEIT

output = abs(value)

' Hunderter-Dezimalstelle oder Leerzeichen
if abs(value) >= 100 then lcd_param = NULL + output/100 else lcd_param = LEERZ
gosub LCD_WRITECHAR
output = output mod 100

' Zehner-Dezimalstelle oder Leerzeichen
if abs(value) >= 10 then lcd_param = NULL + output/10 else lcd_param = LEERZ
gosub LCD_WRITECHAR

' einer Dezimalstelle oder Leerzeichen
lcd_param = NULL + output mod 10
gosub LCD_WRITECHAR
return


#WRITEZAEHLER

output = abs(value)

' negatives Vorzeichen oder Leerzeichen
if value < 0 then lcd_param = MINUS else lcd_param = LEERZ
gosub LCD_WRITECHAR

' Zehntausender-Dezimalstelle oder Leerzeichen (Ausblenden fuehrender Nullen)
if abs(value) >= 10000 then lcd_param = NULL + output/10000 else lcd_param = LEERZ
gosub LCD_WRITECHAR
output = output mod 10000

' Tausender-Dezimalstelle oder Leerzeichen
if abs(value) >= 1000 then lcd_param = NULL + output/1000 else lcd_param = LEERZ
gosub LCD_WRITECHAR
output = output mod 1000

' Hunderter-Dezimalstelle oder Leerzeichen
if abs(value) >= 100 then lcd_param = NULL + output/100 else lcd_param = LEERZ
gosub LCD_WRITECHAR
output = output mod 100

' Zehner-Dezimalstelle oder Leerzeichen
if abs(value) >= 10 then lcd_param = NULL + output/10 else lcd_param = LEERZ
gosub LCD_WRITECHAR

' einer Dezimalstelle oder Leerzeichen
lcd_param = NULL + output mod 10
gosub LCD_WRITECHAR
return

'############################################



'############################################
'
' Initialisieren des LCD
'
'############################################

'*** LCD_Interface ***
'( muss in jedes Programm mit LCD-Ausgabe eingefuegt werden)

#LCD_INIT

' alle ports 0
lcd_port = OFF

' 8-Bit-Modus aktivieren
lcd_param=&H38 : gosub LCD_WRITECMD

' mit 8-Bit-Command in 4-Bit-Modus umschalten
lcd_port=&B00000010
tog lcd_e
tog lcd_e

' ab jetzt 4-Bit-Modus
lcd_param = &H28 : gosub LCD_WRITECMD
lcd_param = &H0C : gosub LCD_WRITECMD

' Display loeschen
#LCD_CLS
lcd_param = &H02 : gosub LCD_WRITECMD
lcd_param = &H01 : gosub LCD_WRITECMD
return

' Zeilenwechsel
#LCD_GOTOLINE
if lcd_param = 1 then lcd_param = &H80
if lcd_param = 2 then lcd_param = &HC0
goto LCD_WRITECMD

' LCD-Kommando
#LCD_WRITECMD
lcd_buf = OFF
goto LCD_WRITE

' Zeichenausgabe
#LCD_WRITECHAR
lcd_buf = &B00100000

' Kommando oder Zeichen an Display senden
#LCD_WRITE
lcd_port = lcd_buf or (lcd_param shr 4) ' Hi-Nibble
tog lcd_e
tog lcd_e
lcd_port = lcd_buf or (lcd_param and &H0F) ' Lo-Nibble
tog lcd_e
tog lcd_e
return