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