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?
Code:$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







Zitieren

Lesezeichen