So hab mal versucht en Timer0 zum laufen zu bekommen.
Die Umdrehungszeit wird beim Int0 auf Null gesetzt.
Code:
$regfile = "m8def.dat"
$crystal = 10000000
$baud = 9600
Ddrb = &B00000111
Portb = &B00000000
Ddrc = &B00000000
Portc = &B00000000
Ddrd = &B11110011
Portd = &B00001100
Dim A As Byte
Dim Pause As Integer
Dim Aus As Integer
Dim Dzmax As Integer
Pause = 100
Aus = 0
Dzmax = 10000 'Drehzahlbegrenzung
'Testrotine der Ausgänge
A = 0
While A <= 4
A = A + 1
Waitms Pause
Portb.0 = 1
Portb.1 = 0
Waitms Pause
Portb.0 = 0
Portb.1 = 1
Wend
Portb.0 = 1
'Zündung
Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pinb.2 = Output
Config Pinb.3 = Output
Config Pind.2 = Input
Config Pind.3 = Input
Portd.2 = 1 'Pullup ein
Portd.3 = 1 'Pullup ein
On Int0 Int0serv
On Int1 Int1serv
Config Int0 = Falling 'Überprüfung ob der Pegel vom Geber fällt oder steigt....Falling!
Config Int1 = Falling
Enable Int0
Enable Int1
'Drehzahl
Config Timer1 = Timer , Prescale = 256
Const Timervorgabe = 3036
Const Markierungenproscheibe = 1
Dim Zaehlerirq0 As Long
Dim Impulseprosekunde As Long
Dim Impulseprominute As Long
Dim Umdrehungenprominute As Integer
Zaehlerirq0 = 0
On Timer1 Timer_irq
Enable Timer1
'Umlaufzeit 1.Zylinder
Config Timer0 = Timer , Prescale = 1
Const Timervorgabe2 = 254
Dim Umtime As Word
Dim Um_irq As Long
Dim Zuenttime As Word
Dim Zuenttime2 As Word
On Timer0 Um_irq
Enable Timer0
Enable Interrupts
'-------------------
Do
Portb.0 = 1
Portb.1 = 1
'Drehzahlüberwachung
Impulseprominute = Impulseprosekunde * 60
Umdrehungenprominute = Impulseprominute / Markierungenproscheibe
If Umdrehungenprominute > Dzmax Then
Disable Int1
Print "Drehzahlbegrenzung hat angesprochen"
Else
Enable Int1
End If
Select Case Umdrehungenprominute
Case 1000 To 1200 : Portb.2 = 1
Case Else : Portb.2 = 0
End Select
Impulseprominute = Impulseprosekunde * 60
Umdrehungenprominute = Impulseprominute / Markierungenproscheibe
'Print "U/min " ; Umdrehungenprominute
Loop
'-------------------
'linker Zylinder
Int0serv:
Zuenttime = Umtime
Umtime = 0
Waitms Zuenttime
Zuenttime2 = Zuenttime
Portb.0 = 0
Incr Zaehlerirq0
Enable Int0
Return
'rechter Zylinder
Int1serv:
Waitms Zuenttime2
Portb.1 = 0
Enable Int1
Return
'Umlaufzeit ermitteln
Um_irq:
Timer0 = Timervorgabe2
Incr Umtime
Print "Zeit" ; Umtime
Return
'Pro Sekunde ein Aufruf
Timer_irq:
Timer1 = Timervorgabe
Impulseprosekunde = Zaehlerirq0
Zaehlerirq0 = 0
Return
Kommt mir so vor als ob Timer0 nicht die 0,1µs bringt.
Der Zähler steigt zu wenig in Incr Umtime.
Muss noch mal nachrechen mit der Umlaufzeit und dem zurücksetzen von Umtime auf 0.
Puhh das wird doch wohl nicht werden ?
Lesezeichen