Hier mal meinen Code für den Drehzahlmesser.
Der soll die Drehzahl messen und dann die 5 oder 10 maximal Drehzahlen speichern. Das ist wichtig damit ich sehe ob das Modellauto mit der Übersetzung die Maximale Drehzahl erreicht. (Fehlt aber noch im Programm).
Dann soll der Drehzahlmesser zwischen z.B. 8000 und 9000 U/m eine Lampe an schalten. (einstellbar) Das ist um die Fliehkraftkupplungs einstellung zu vereinfachen. Denn die Kupplung darf nicht zu früh kuppeln und auch nicht zu spät.
Ich setzt mal den ganzen Code hier rein, wichtig ist aber nur der Code zwischen dem do –loop. Also die Hauptschleife.
Das Prinzip ist einfach. Auf Steigende Flanke (oder fallende Flanke) warten dann Timer starten, auf fallende Flanke warten, und wieder auf Steigende Flanke warten. Dann Timer aus lesen. Im Timer steht die Zeit von einer Umdrehung. Umdrehung ausrechnen usw.. Wenn das schneller geht als das Hi von der Steigende Flanke braucht, sollte man wieder auf fallende Flanke warten bevor man neu beginnt.
Ich arbeite erst seit 2-3 Wochen mit Bascom. Wenn einer was sieht was man besser machen kann, nur zu. Freue mich für jeden Vorschlag.
Code:
$regfile = "m16def.dat"
$crystal = 8000000
$baud = 19200
Config Lcdpin = Pin , Db4 = Porta.0 , Db5 = Porta.2 , Db6 = Porta.4 , Db7 = Porta.6 , E = Portc.7 , Rs = Portc.6
'Config Lcd = 16 * 2
Config Lcd = 16 * 1
'$sim
Dim Count1 As Single
Dim Rpm As Word
'Dim Temp As Single
Dim Uberlauf As Bit
Dim Menuselect As Byte
Dim Zylinder As Byte
Dim Lampe_an As Word
Dim Lampe_aus As Word
Config Timer1 = Timer , Prescale = 8
'On Timer1 Timer1_isr
Config Pind.4 = Output
Portd.4 = 1
Set Portb.0
Config Pinb.0 = Input ' eingang fur drehzahl
' ********* Menu Tasten *************
Config Pind.2 = Input
Set Portd.2
Config Pinb.4 = Input
Set Portb.4
Config Pinb.5 = Input
Set Portb.5
Config Pinb.6 = Input
Set Portb.6
Config Pinb.7 = Input
Set Portb.7
' ********* end Menu Tasten *************
On Int0 Menu_int0
Enable Int0
Enable Timer1
Enable Interrupts
Stop Timer1
Do
Bitwait Pinb.0 , Reset
Start Timer1
Timer1 = 0
Bitwait Pinb.0 , Set
Bitwait Pinb.0 , Reset
Stop Timer1
Count1 = Timer1
Count1 = 1000000 / Count1
Count1 = Count1 * 60
Rpm = Int(count1)
Cls
Cursor Off Noblink
Lcd Rpm ; " RPM"
If Rpm > Lampe_an And Rpm < Lampe_aus Then
Portd.4 = 0
Else
Portd.4 = 1
End If
Waitms 300
Bitwait Pinb.0 , Set
Loop
End 'end program
Timer1_isr:
Cls
Lcd "Fehler"
Waitms 100
Rpm = 0
Count1 = 0
Return
Menu_int0:
Menuselect = 0
Do
Waitms 100
If Pind.2 = 0 Then
Incr Menuselect
Do
Loop Until Pind.2 = 1
End If
If Menuselect > 6 Then
Menuselect = 1
End If
Select Case Menuselect
Case 1 'Max_drehzahl
Cls
Lcd "Drehzahl"
If Pinb.4 = 0 Then
Do
Loop Until Pinb.4 = 1
Gosub Max_drehzahl
End If
Case 2 'Motortype
Cls
Lcd "Motortype"
If Pinb.4 = 0 Then
Do
Loop Until Pinb.4 = 1
Gosub Motor_type
End If
Case 3 'Zylinder Zahl
Cls
Lcd "Zyl. Zahl"
If Pinb.4 = 0 Then
Do
Loop Until Pinb.4 = 1
Gosub Zyl_zahl
End If
Case 4 ' Lampe an
Cls
Lcd "Lampe an"
If Pinb.4 = 0 Then
Do
Loop Until Pinb.4 = 1
Gosub Lampe_an
End If
Case 5 ' Lampe aus
Cls
Lcd "Lampe aus"
If Pinb.4 = 0 Then
Do
Loop Until Pinb.4 = 1
Gosub Lampe_aus
End If
Case 6 ' ruruck
Cls
Lcd "return"
If Pinb.4 = 0 Then
Exit Do
End If
End Select
Loop
Return
Max_drehzahl:
'Cls
'Lcd "Max Drehzahl"
'Waitms 100
Return
Motor_type:
'Cls
'Lcd "Motor type"
'Waitms 100
Return
'***************************************
Zyl_zahl:
Cls
Do
Cls
Lcd "Zylinder"
Lcd Zylinder
Waitms 100
If Pinb.5 = 0 Then
Incr Zylinder
If Zylinder > 8 Then
Zylinder = 1
End If
Do
Loop Until Pinb.5 = 1
End If
If Pinb.6 = 0 Then
Decr Zylinder
If Zylinder = 0 Then
Zylinder = 8
End If
Do
Loop Until Pinb.6 = 1
End If
If Pinb.4 = 0 Then
Do
Loop Until Pinb.4 = 1
Exit Do
End If
Loop
Return
'*******************************************
Lampe_an:
Cls
Do
Cls
Lcd "Lam. An "
Lcd Lampe_an
Waitms 100
If Pinb.5 = 0 And Pind.2 = 0 Then
Lampe_an = Lampe_an + 100
If Lampe_an > 23000 Then
Lampe_an = 0
End If
End If
If Pinb.6 = 0 And Pind.2 = 0 Then
Lampe_an = Lampe_an - 100
If Lampe_an =< 0 Then
Lampe_an = 23000
End If
End If
If Pinb.5 = 0 And Pind.2 = 1 Then
Incr Lampe_an
If Lampe_an => 23000 Then
Lampe_an = 0
End If
End If
If Pinb.6 = 0 And Pind.2 = 1 Then
Decr Lampe_an
If Lampe_an =< 0 Then
Lampe_an = 23000
End If
End If
If Pinb.4 = 0 Then 'zuruck
Do ' enprellen
Loop Until Pinb.4 = 1
Dta1:
Data Lampe_an
Exit Do
End If
Loop
Return
'*******************************************
Lampe_aus:
Cls
Do
Cls
Lcd "Lam. aus "
Lcd Lampe_aus
Waitms 100
If Pinb.5 = 0 And Pind.2 = 0 Then
Lampe_aus = Lampe_aus + 100
If Lampe_aus > 23000 Then
Lampe_aus = 0
End If
End If
If Pinb.6 = 0 And Pind.2 = 0 Then
Lampe_aus = Lampe_aus - 100
If Lampe_aus =< 0 Then
Lampe_aus = 23000
End If
End If
If Pinb.5 = 0 And Pind.2 = 1 Then
Incr Lampe_aus
If Lampe_aus => 23000 Then
Lampe_aus = 0
End If
End If
If Pinb.6 = 0 And Pind.2 = 1 Then
Decr Lampe_aus
If Lampe_aus =< 0 Then
Lampe_aus = 23000
End If
End If
If Pinb.4 = 0 Then 'zuruck
Do ' enprellen
Loop Until Pinb.4 = 1
Exit Do
End If
Loop
Return
Lesezeichen