Hallo,
ich habe jetzt doch den Timer1 des Ultraschallsensors durch den Timer0 ersetzen können, die Entfernungen werden zwischen 3 und 50 cm auch linear berechnet (>50cm habe ich nicht geprüft). Aber ich habe das Gefühl dass trotzdem etwas faul ist. Eigentlich müsste ich doch den Timer an der Stelle starten wo die Zeilen auskommentiert sind, oder? Wenn ich diese Zeilen statt denen weiter unten im Code verwende, dann bekomme ich keine linearen Entfernungen angezeigt: bei 10cm Abstand werden 20cm angegeben, bei 20cm 30cm, bei 30cm 40cm, etc.
Mit einem Vorteiler von 256 habe ich denselben Effekt, nur dass Entfernungen oberhalb 40cm gar nicht mehr erkannt werden (wegen Overflow?).
Verwende ich den Timer evtl falsch? Muss ich einen anderen Modus einstellen? Für Hinweise wäre ich dankbar.
uint16_t range;
while(true)
{
DDRA |= ADC5; // ADC5 Ausgang
PORTA = ( 1<<PORTA5 ); // ADC5 high
_delay_us(10); // 10uS warten
PORTA = ( 0<<PORTA5 ); // ADC5 low
//TCNT0 = 0; // Timer0 zurücksetzen
//TCCR0 = (1<<CS02) | (1<<CS00); // Timer0 mit Prescaler 1024 starten
DDRA &= ~ADC5; // ADC5 Eingang
while(!(PINA&0x20)); // Warten bis steigende Flanke an ADC5
TCNT0 = 0; // Timer0 zurücksetzen
TCCR0 = (1<<CS02) | (1<<CS00); // Timer0 mit Prescaler 1024 starten
while(PINA&0x20); // Warten bis fallende Flanke an ADC5
TCCR0 = ~(1<<CS02); // Timer0 stoppen
range = TCNT0; // Wert aus Timer Counter Register = Abstand in cm.
displayData(range);
_delay_ms(1000); // 1s warten bis zur nächsten Messung
}
return 0;
Grüße, Jordi
Lesezeichen