Schorschi
27.05.2006, 22:53
Hallo.
Bin dabei mir einen Drehzahlmesser zu bauen.
Die Hardware hab ich schon fertig (Mega32, 4mal 7-Segmentanzeige).
Hab mich mal im Forum belesen und folgenden Code geschrieben.
Ich zähle damit die eingehenden Impulse von der Zündspule meines Motors über dem externen Interrupt. Als Zeitbasis nehme ich eine Sekunde (8MHz, Prescale=256, und 34285 als Zähleranfang). Das müsste dann ungefähr eine Sekunde ergeben.
Nun mein Problem:
Hab am Anfang meiner Test´s mit dem Programm nicht gemerkt, dass ich das Fusebit für den internen Takt nicht ausgeschaltet hatte. Ich bekam nur falsche Werte.
Also hab ich mit nem anderem Programm und ner Stoppuhr rumprobiert bis ich auf vernünftige Timer-Einstellungen kam.
Jetzt hab ich aber das Fusebit geändert. Arbeite also mit 8 MHz und die ausgegebene Drehzahl passt wieder überhaupt nicht.
Also hab ich wieder die Stoppuhr genommen. Diesmal passen aber die Timerwerte.
Ein Zählerüberlauf mit 8MHz, Prescale=256, und 34285 als Zähleranfang dauert genau eine Sekunde im Testprogramm, aber mein Drehzahlmesser geht voll daneben. Er zeigt ca. das Doppelte an oder sogar etwas mehr.
Braucht der Mega32 mit externem Quarz mehr als einen Takt um den Timer um eins zu erhöhen?
Wer kann mir sagen was ich falsch mache?
$regfile = "m32def.dat"
$framesize = 128
$swstack = 128
$hwstack = 128
$crystal = 8000000
$baud = 9600
Config Int0 = Falling
Config Timer1 = Timer , Prescale = 256
Config Portb = Output
Config Porta = Output
Enable Interrupts
Portd.2 = 1
Const Zaehleranfang = 34285
Timer1 = Zaehleranfang
Dim Ups As Integer
Dim Upm As Integer
Dim Einer As Integer
Dim Zehner As Integer
Dim Hunderter As Integer
Dim Tausender As Integer
Porta = &B00000000
Portb = &B00000000
Ups = 0
On Int0 Interruptroutine
Enable Int0
On Timer1 Timerueberlauf
Enable Timer1
Do
Einer = Upm Mod 10
Zehner = Upm Mod 100
Zehner = Zehner / 10
Hunderter = Upm Mod 1000
Hunderter = Hunderter / 100
Tausender = Upm Mod 10000
Tausender = Tausender / 1000
Portb = &B00000001
Porta = Einer
Waitus 100
If Zehner > 0 Or Hunderter > 0 Or Tausender > 0 Then
Portb = &B00000010
Porta = Zehner
End If
Waitus 500
If Hunderter > 0 Or Tausender > 0 Then
Portb = &B00000100
Porta = Hunderter
End If
Waitus 500
If Tausender > 0 Then
Portb = &B00001000
Porta = Tausender
End If
Waitus 500
Loop
Interruptroutine:
Incr Ups
Return
Timerueberlauf:
Upm = Ups * 60
Timer1 = Zaehleranfang
Ups = 0
Return
End
Danke für eure Hilfe
Bin dabei mir einen Drehzahlmesser zu bauen.
Die Hardware hab ich schon fertig (Mega32, 4mal 7-Segmentanzeige).
Hab mich mal im Forum belesen und folgenden Code geschrieben.
Ich zähle damit die eingehenden Impulse von der Zündspule meines Motors über dem externen Interrupt. Als Zeitbasis nehme ich eine Sekunde (8MHz, Prescale=256, und 34285 als Zähleranfang). Das müsste dann ungefähr eine Sekunde ergeben.
Nun mein Problem:
Hab am Anfang meiner Test´s mit dem Programm nicht gemerkt, dass ich das Fusebit für den internen Takt nicht ausgeschaltet hatte. Ich bekam nur falsche Werte.
Also hab ich mit nem anderem Programm und ner Stoppuhr rumprobiert bis ich auf vernünftige Timer-Einstellungen kam.
Jetzt hab ich aber das Fusebit geändert. Arbeite also mit 8 MHz und die ausgegebene Drehzahl passt wieder überhaupt nicht.
Also hab ich wieder die Stoppuhr genommen. Diesmal passen aber die Timerwerte.
Ein Zählerüberlauf mit 8MHz, Prescale=256, und 34285 als Zähleranfang dauert genau eine Sekunde im Testprogramm, aber mein Drehzahlmesser geht voll daneben. Er zeigt ca. das Doppelte an oder sogar etwas mehr.
Braucht der Mega32 mit externem Quarz mehr als einen Takt um den Timer um eins zu erhöhen?
Wer kann mir sagen was ich falsch mache?
$regfile = "m32def.dat"
$framesize = 128
$swstack = 128
$hwstack = 128
$crystal = 8000000
$baud = 9600
Config Int0 = Falling
Config Timer1 = Timer , Prescale = 256
Config Portb = Output
Config Porta = Output
Enable Interrupts
Portd.2 = 1
Const Zaehleranfang = 34285
Timer1 = Zaehleranfang
Dim Ups As Integer
Dim Upm As Integer
Dim Einer As Integer
Dim Zehner As Integer
Dim Hunderter As Integer
Dim Tausender As Integer
Porta = &B00000000
Portb = &B00000000
Ups = 0
On Int0 Interruptroutine
Enable Int0
On Timer1 Timerueberlauf
Enable Timer1
Do
Einer = Upm Mod 10
Zehner = Upm Mod 100
Zehner = Zehner / 10
Hunderter = Upm Mod 1000
Hunderter = Hunderter / 100
Tausender = Upm Mod 10000
Tausender = Tausender / 1000
Portb = &B00000001
Porta = Einer
Waitus 100
If Zehner > 0 Or Hunderter > 0 Or Tausender > 0 Then
Portb = &B00000010
Porta = Zehner
End If
Waitus 500
If Hunderter > 0 Or Tausender > 0 Then
Portb = &B00000100
Porta = Hunderter
End If
Waitus 500
If Tausender > 0 Then
Portb = &B00001000
Porta = Tausender
End If
Waitus 500
Loop
Interruptroutine:
Incr Ups
Return
Timerueberlauf:
Upm = Ups * 60
Timer1 = Zaehleranfang
Ups = 0
Return
End
Danke für eure Hilfe