Witam,
Od kilku dni próbuję za pomocą ATMega16 zmierzyć czasy:
- opóźnienia jednego impulsu w stosunku do drugiego (czasy 70-100µs)
- czas drugiego impulsu (czasy są 10-500µs)
I wyniki są niezbyt dobre - kilka pomiarów daje wyniki całkowicie różne (a czasem nawet wartości ujemne). A próbowałem tak robić:
1. Ustawiam Timer2 na generowanie przerwania co 64µs (16MHz z prescalerem 8 ) - przerwanie generowane po przepełnieniu licznika:
Do tego napisałem funkcję zwracającą czas w µs:
Pomiaru czasu następuje za pomocą przerwań sprzętowych:
- INT1 sygnał wyzwalający (zbocze opadające):
- INT0 sygnał, który jest opóźniony w stosunku do tego INT1, którego czas mierzę (generowany po każdej zmianie stanu - logical change):
A w programie głównym mam:
No i czasy opóźnienia (start_time - trigger_time) są czasem sensowne (czas ok. 90µs), a czasem głupie np. 12 µs, a czasem ujemne
Timer0 jest wyłączony, więc na pewno nie przeszkadza.
Macie pomysł co jest nie tak, ew. jak zrobić ten pomiar lepiej?
Pozdr.
andrusz
Od kilku dni próbuję za pomocą ATMega16 zmierzyć czasy:
- opóźnienia jednego impulsu w stosunku do drugiego (czasy 70-100µs)
- czas drugiego impulsu (czasy są 10-500µs)
I wyniki są niezbyt dobre - kilka pomiarów daje wyniki całkowicie różne (a czasem nawet wartości ujemne). A próbowałem tak robić:
1. Ustawiam Timer2 na generowanie przerwania co 64µs (16MHz z prescalerem 8 ) - przerwanie generowane po przepełnieniu licznika:
ISR(TIMER2_OVF_vect) {
counter++;
} Do tego napisałem funkcję zwracającą czas w µs:
unsigned long mmicros() {
unsigned char t = TCNT2;;
return ((counter << 8) | t) >> 1;
}Pomiaru czasu następuje za pomocą przerwań sprzętowych:
- INT1 sygnał wyzwalający (zbocze opadające):
- INT0 sygnał, który jest opóźniony w stosunku do tego INT1, którego czas mierzę (generowany po każdej zmianie stanu - logical change):
ISR(INT1_vect) {
trigger_time = mmicros();
} ISR(INT0_vect) {
unsigned long get_time = mmicros();
if (start_time == 0) {
start_time = get_time;
} else {
end_time = get_time;
}
} A w programie głównym mam:
while (1) {
trigger_time = 0;
start_time = 0;
end_time = 0;
while (trigger_time == 0) ;
while (start_time == 0) ;
while (end_time == 0) ;
[wysłanie wyniku]
}No i czasy opóźnienia (start_time - trigger_time) są czasem sensowne (czas ok. 90µs), a czasem głupie np. 12 µs, a czasem ujemne
Macie pomysł co jest nie tak, ew. jak zrobić ten pomiar lepiej?
Pozdr.
andrusz