Hat jemand hier schon mal mit dem Ultraschall Sensor von PARALLAX Ping))) gearbeitet? Ich habe den Sensor an einen ATMega8 mit 16 MHz angeschlossen. Programmierung AVR-Studio und C! Ich bekommen immer nur diegleichen Werte, obwohl das Modul (Ping))) )einwandfrei zu arbeiten scheint (Oszilloskop). Funktionsweise: PB0 Ausgang 5 usec Impuls senden PB0 Eingang Capture 750 usec Pause warten auf Antwort von Ping)) In der entsprechende Interrupt Routine: //--------------------------------------------------------- ISR (TIMER1_CAPT_vect) { static uint8_t flanke=0; if (flanke == 0) { // steigende Flanke StartTime = ICR1; NrOverflows = 0; TCCR1B &= ~(1 << ICES1); // fallende Flanke flanke = 1; mess = 0; } else { // fallende Flanke EndTime = ICR1; TCCR1B |= (1 << ICES1); // steigende Flanke flanke = 0; mess = 1; } } //--------------------------------------------------------- ISR( TIMER1_OVF_vect ) { NrOverflows++; } //--------------------------------------------------------- ..... MfG
Hi, das sieht nach dem selben Fehler aus, den ich beim ersten Versuch mit Ultraschall auch gemacht habe. Du misst die Zeit zwischen den Senden und dem Empfang. Das ist falsch. Man sendet den Impulse und wenn die steigende Flanke kommt, dann misst man die Zeit bis zur fallenden Flanke des Ruecksignals. Versuch's mal so. SONIC_TYPE=0 ist cm, SONIC_TYPE=1 ist inch.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
Main sieht dann so aus.......
int main(void)
{
interrupt_init();
Trigger pin auf high..............
Vorgegebene Zeit warten...........
timer_start();
Trigger pin auf low...............
SONIC_RANGE beinhaltet den Wert in cm oder inch.
}
Gruesse
Dusty
Gast
#2378725
Hallo,
schönen Dank für Deine Antwort.
Deine Tips sind bereits vorhanden (Impulslänge messen):
Der Capture Input (PB0) Interrupt wird zunächst auf steigende Flanke
eingestellt:
TCCR1B |= (1 << ICES1); // auf steigende Flanke triggern
Startwert Timer1 festhalten
Tritt der Interrupt ein, wird in der Interrupt Routine der Capture
Interrupt
auf fallende Flanke eingestellt.
TCCR1B &= ~(1 << ICES1); // auf fallende Flanke triggern
Endwert Timer1 festhalten
Differenz Endwert - Startwert wird im Hauptprogramm bestimmt (nur wenn
fallende Flanke erkannt wurde).
MfG
Gast
#2380065
Problem gelöst! siehe Anhang! Die Lösung war eine Verzögerung von 50msec nach Aussenden des PING. Warum, kann ich nicht sagen, geht aus dem Datenblatt auch nicht hervor! Die ermittelten Daten finden sich im SourceCode! Damit ist das Thema für mich abgeschlossen.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.