Ich konnte es nicht abwarten und habe es gleich probiert. Leider ohne Erfolg. Es muss noch ein Fehler drin sein. Ich poste deshalb mal etwas mehr von meinem Code, vielleicht ist es ja noch eine Kleinigkeit:
Code:
#define AVRGCC
#include <avr/io.h>
#include <compiler.h>
#include <util/delay.h>
/**
IOs:
PD2 (INT0) Tacho Eingang
**/
volatile U32 TachoTime = 0;
volatile U16 TachoTimeCounterHigh = 0;
U32 SpeedBuffer[SpeedBufferSize];
U8 SpeedBufferPointer;
U32 CurrentSpeed = 0;
int main(void)
{
DDRB = 0b11111100; // Das LCD hängt an PB7...PB5
PORTB = 0b00000000;
DDRD = 0b00000000;
PORTD = 0b01000100;
LCD_Init ();
// IRQ 0 für Tacho-Signal-Eingang:
MCUCR = 0b00000001;
GIMSK = 0b01000000;
// Timer 1: Takt für Tacho-Input-Counter:
TCCR1B |= (1<<CS11); // Prescaler auf 8:
TIMSK |= (1<<TOIE1); // IRQ für Overflow
/**
for (SpeedBufferPointer = 1; SpeedBufferPointer < SpeedBufferSize; SpeedBufferPointer++)
SpeedBuffer[SpeedBufferPointer] = 0;
SpeedBufferPointer = 1;
**/
sei ();
while (1)
{
// Geschwindigkeitsberechnung:
// TachoTime:
// 1 Sekunde entspricht FCPU / Prescaler = 8000000 / 8 = 1000000 entspricht 1µs Auflösung
// schnellste Geschwindigkeit: 100km/h entspricht 2,988ms Mindest-Auflösung
// 1 km/h entspricht 298,8 ms (ganze Periode): bzw Zeit zwischen Flankenwechsel: 149,4 ms
// --> Geschwindigkeit = 149400 µs / Flankenzeit
// --> Geschwindigkeit in Zehntel-km/h = 1494000 µs / Flankenzeit
// langsamste Geschwindigkeit: 0,1 km/h entspricht 14940000 µS
if ((TachoTime > 0) && (TachoTime < 15000000))
CurrentSpeed = 1494000 / TachoTime;
else
CurrentSpeed = 0;
/**
SpeedBuffer[SpeedBufferPointer] = CurrentSpeed;
if (SpeedBufferPointer < SpeedBufferSize)
SpeedBufferPointer++;
else
SpeedBufferPointer = 1;
CurrentSpeed = 0;
U8 i1;
for (i1 = 1; i1 < SpeedBufferSize; i1++)
CurrentSpeed = CurrentSpeed + SpeedBuffer[i1];
CurrentSpeed = CurrentSpeed / SpeedBufferSize;
**/
LCD_Cursor (1, 1);
LCD_Zahl (CurrentSpeed);
}
return(0);
}
// Tacho-Eingang Signalwechsel:
SIGNAL (INT0_vect)
{
TachoTime = TachoTimeCounterHigh;
TachoTime = TachoTime<<8;
U8 tmp = TCNT1L;
TachoTime = TachoTime + TCNT1H;
TachoTime = TachoTime<<8;
TachoTime = TachoTime + tmp;
TCNT1L = 0;
TCNT1H = 0;
TachoTimeCounterHigh = 0;
}
// Tacho-Eingang-Zeitmessung:
SIGNAL (SIG_TIMER1_OVF)
{
if (TachoTimeCounterHigh < 0xFFFF)
TachoTimeCounterHigh++;
}
Das Tacho-Signal springt immer noch wild durcheinander. Selbst mit Glättung.
Hüüüülfe! Das sollte doch eigentlich ganz easy sein!
Viele Grüße
Andreas
Lesezeichen