Hallo,
ich bräuchte einen ganz einfachen Drehzahlmesser und habe auch mal die SuFu bemüht. Ich will die Drehzahl von meinem Roller auslesen (2Takt - 1 Zylinder), dass heisst ja das ich pro Impuls eine Umdrehung habe oder?
Das Ganze soll dann am besten auf 4 7-Segment Anzeigen angezeigt werden (Ist Preiswerter als LCD und auch schneller oder?).
ich möchte gerne einen AtMega8 benutzen.
Mit der SuFu habe ich folgendes gefunden:
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
Welchen Teil davon brauche ich, da steht ja noch ziemlich viel anderer Code drinne, aber ich brauche ja nur den Drehzahlmesser Ohne LCD,Lampen etc.?
Und wie steuer ich denn am Besten die 7 Segmentanzeigen an? Der Mega8 hat ja keine 28 IO Pins die ich dafür nehmen könnte (Wäre ja auch eine ziemliche verschwendung).
Lesezeichen