Forum: Mikrocontroller und Digitale Elektronik Entfernungsmessung mit HC-SR04


von elektro newbie (Gast)


Angehängte Dateien:

Lesenswert?

Hallo liebe Leute, ich bin relativer Anfänger in der Welt der 
Microcontroller. Zur Übung wollte ich mit meinem kleinen Board eine 
Entfernungsmessung mit einem HC-SR04 Board durchführen. Die Idee war 
folgende.
Der Triggereingang des Moduls ist mit PA4 verbunden. Wird nun der Taster 
S1 betätigt, wird ein Interrupt (INT1) ausgelöst, dass den 
triggereingang zunächst auf L und anschließend auf H setzt. Das löst die 
Messung aus und das Modul setzt den Echo Ausgang (verbunden mit PD2) auf 
H-Pegel. Dies soll nun einen Interrupt (INT0) auslösen der den Timer 0 
startet. der Timer 0 soll die Zeit zählen bis das Echo detektiert wurde 
und die Zeit in ms ersteinmal in einer Variable abspeichern. Nach 
empfang des Echos fällt der Echoausgang wieder auf L, löst erneut die 
ISR(Int0) aus und der Timer wird gestoppt.
Soweit erstmal.
Nun habe ich Testweise nach jeder "Stufe" eine LED an PortB leuchten 
lassen. Es scheint so als ob die ISR(INT1) normal durchläuft, der Timer 
gestartet aber nicht mehr gestoppt wird.

Ich konnte schon ein paar Fehler erkennen, bin mittlerweile aber 
womöglich blind für meinen eigenen Code und komme einfach nicht auf 
meinen Fehler, daher wäre es nett wenn ihr euch den Code vlt mal 
anschauen könntet.

Ich weiß, dass der derzeitige Code nicht wirklich eine großartige 
Funktion hat und das es womöglich noch andere Wege gibt, ich möchte aber 
erstmal nur einen Vernünftigen Betrieb des Moduls hinbekommen auf die 
von mir angedachte weise (da ähnliches auch in der Schule verlangt 
wird).

Im Anhang befindet sich der Schaltplan für das von mir verwendete Board.

Hier der Quelltext:
----------------------------------------------------------------
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#define F_CPU 16000000
4
#include <util/delay.h>
5
6
//Globale Variablen
7
int countint = 0; //Zur Unterscheidung ob die Zeitmessung gestartet oder beendet werden soll
8
int timems = 0;    //Zur aufnahme der verstrichenen Zeit in ms
9
10
11
//Drücken von S1 soll eine Abstandsmessung auslösen (Triggereingang des Moduls zunächst auf L und wieder zurück auf H)
12
ISR(INT1_vect)
13
{  PORTB &= 0b00000000;
14
  PORTA &= 0b11101111;  //LOW Pegel generieren
15
  _delay_us(100);      //PORTA (Trigger wird dazu auf LOW gesetzt und nach 100us wieder auf high
16
  PORTA |= 0b00010000;  //Zurück auf High Pegel
17
  PORTB |= 0b00000001;
18
}
19
20
//H-Pegel am Ausgang soll Zeitmessung starten, L-Pegel soll Zeitmessung stoppen
21
ISR(INT0_vect)
22
{
23
  if (countint == 0)
24
  {
25
    //Zeitmessung starten (Timer0 aktivieren)
26
    TCCR0 = 0b00000011;
27
    TCNT0 = 5;
28
    PORTB |= 0b00000010;
29
  }
30
  if (countint == 1)
31
  {
32
    //Zeitmessung stoppen
33
    TCCR0 = 0b00000000;
34
    PORTB |= 0b00000100;
35
    countint = 2;
36
  }
37
  if(countint == 0)
38
  {
39
    countint = 1;
40
  }
41
  
42
  if (countint == 2)
43
  {
44
    countint = 0;
45
  }
46
}
47
48
//Bei Überlauf des Timers soll die Zeitvariable hochzählen.Die Zeit wird in ms gemessen
49
ISR(TIMER0_OVF_vect)
50
{
51
  timems++;
52
  TCNT0 = 5;        //Startwert neu setzen
53
  TIFR = 0b00000001;    //Overflow Bit zurücksetzen
54
  PORTB |= 0b00001000;  //Erfolg an PB3 (LED D6) anzeigen
55
}
56
57
58
int main(void)
59
{  cli();
60
  //Datenrichtung und Pullups
61
  DDRD &= 0b11110011; //PD2,3 als Eingang
62
  DDRA |= 0b00010000; //PA4 als Ausgang
63
  DDRB |= 0b11111111; //Alle LEDs
64
  
65
  PORTD |= 0b00001000; //Interner Pullup an PD3
66
  
67
  PORTA |= 0b00010000; //Triggereingang zu Programmstart auf High
68
  //Timer
69
  TIMSK = 0b00000001; //Timer0 Interrupt aktivieren
70
  //Interrupts
71
  MCUCR |= 0b00001001; //INT1 an PD3 -> Fallende Flanke, INT0 an PD2 -> Jeder log.Wechsel
72
  GICR |= 0b11000000; // INT0 und INT1 erlauben
73
  sei();
74
  
75
    while(1)
76
    {
77
    if (timems > 0)// Wenn eine Zeit gemessen wurde 
78
    {
79
      PORTB |= 0b00010000; //zeige es mit Lampe D5 an PB4 an
80
    }
81
    
82
  }  
83
}

: Bearbeitet durch User
von Sebastian W. (wangnick)


Lesenswert?

elektro newbie schrieb:
> triggereingang zunächst auf L und anschließend auf H setzt. Das löst die
> Messung aus

Sollte das nicht andersherum sein? Kurz auf H und dann die Messung durch 
die H->L-Flanke auslösen?

LG, Sebastian

von Elektro newbie (Gast)


Lesenswert?

Werde es morgen mal so probieren. Laut Beschreibung heißt es nur "Das 
Auslösen eines Messzyklus geschieht durch eine fallende Flanke am 
Triggereingang (Pin 2) für mindestens 10μs. " Deswegen dachte ich, dass 
es vom Prinzip her egal ist ob ich "High Low High" oder "Low High Low" 
mache. Die fallende Flanke müsste ja trotzdem gegeben sein.

LG
Stivo

von elektro newbie (Gast)


Lesenswert?

Hat leider nicht geholfen. Exakt der selbe Effekt wie zuvor.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.