Forum: Mikrocontroller und Digitale Elektronik HC-SR04 keine Reaktion


von Nicolas K. (ccodex)


Lesenswert?

Hallo Leute,
ich versuche seit Tagen mein HC-SR04 zum laufen zu bringe aber leider 
ohne Erfolg.
Wenn ich auf den Trigger-Eingang des HC-SR04 ein Signal gebe aendert 
der Echo-Ausgang sein Signal nicht, zum messen der Zeit wie lange der 
Schall brauch auf der Strecke.
Ich hab auch schon einen anderen ausprobiert aber dort hatte ich leider 
auch keinen Erfolg, beide waren noch neu beim testen.

Ich hoffe ihr koennt mir helfen den Fehler zu finden.

MFG
Nico

Hier mal meinen Code:
1
#define F_CPU 8000000UL
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
6
#include "uart.h"
7
8
#include <stdlib.h>
9
#include <string.h>
10
11
#define SCHALL 0.03232 // 323,2 m/s
12
/*
13
Alle 25 us overflow
14
15
 count = 8000 = 200ms
16
*/
17
18
volatile uint16_t count = 0;
19
20
ISR(TIMER0_OVF_vect){
21
  TCNT0 = 56;
22
  count++;
23
}
24
25
26
int main( void )
27
{
28
  DDRD |= ( 1 << DDD2 ); // Trigger
29
  DDRD &= ~( 1 << DDD3 ); //Echo
30
  
31
  TCCR0A = 0;
32
  TIMSK0 |= ( 1 << TOIE0 );
33
  
34
  TCNT0 = 56; // Timer initialisiert 
35
  
36
  sei();
37
  
38
  char sbuff[256]={0};
39
  double hcWidth = 0;
40
  
41
  while(1){
42
    UART.puts( "Start Messung" );
43
    
44
    PORTD &= ~( 1 << PORTD2 );
45
    _delay_us( 11 );
46
    PORTD |= ( 1 << PORTD2 );
47
    _delay_us( 11 );
48
    PORTD &= ~( 1 << PORTD2 );
49
    
50
    while( !(PIND & ( 1 << PIND3 )));
51
    TCCR0B |= ( 1 << CS00 ); // start Timer , kein prescaler
52
    
53
    while( (PIND & ( 1 << PIND3 )) && ( count < 8000 ) );
54
    TCCR0B &= ~( 1 << CS00 ); // stopp Timer
55
    
56
    if( count >= 8000 ){ // 200ms rum
57
      UART.puts( "Kein Wert!!!" );
58
    }else{
59
      hcWidth = SCHALL * 25 * ( count / 2 );
60
      dtostrf( hcWidth, 6, 3, sbuff );
61
      UART.gets( sbuff );
62
    }
63
      
64
    
65
    TCNT0 = 56;
66
    count = 0;
67
68
    UART.puts( "Ende Messung" );
69
70
    _delay_ms( 20 ); //Warten bis naechste Messung
71
  }
72
  
73
  return 0;
74
}

Beitrag #5099569 wurde von einem Moderator gelöscht.
von Wolle G. (wolleg)


Lesenswert?

Nicolas K. schrieb:
> Wenn ich auf den Trigger-Eingang des HC-SR04 ein Signal gebe aendert
> der Echo-Ausgang sein Signal nicht,

Dein Programm kann ich nicht beuteilen, da mir der verwendete µC 
unbekannt ist.
startest Du mit der fallenden oder steigenden Flanke?

von Bastian W. (jackfrost)


Lesenswert?

Hi,

das mit dem low - high - low kannst du dir sparen. Es reicht wenn du am 
Anfang den Trigger auf low setzt und wartest bis das Echo auf high geht. 
und dann am Ende den Trigger wieder auf high setzt.
1
UART.puts( "Start Messung" );
2
    
3
    PORTD &= ~( 1 << PORTD2 );
4
5
    while( !(PIND & ( 1 << PIND3 )));
6
    TCCR0B |= ( 1 << CS00 ); // start Timer , kein prescaler
7
    
8
    while( (PIND & ( 1 << PIND3 )) && ( count < 8000 ) );
9
    TCCR0B &= ~( 1 << CS00 ); // stopp Timer
10
    
11
    if( count >= 8000 ){ // 200ms rum
12
      UART.puts( "Kein Wert!!!" );
13
    }else{
14
      hcWidth = SCHALL * 25 * ( count / 2 );
15
      dtostrf( hcWidth, 6, 3, sbuff );
16
      UART.gets( sbuff );
17
    }
18
      
19
    
20
    TCNT0 = 56;
21
    count = 0;
22
23
    UART.puts( "Ende Messung" );
24
    PORTD |= ( 1 << PORTD2 );
25
    _delay_ms( 20 ); //Warten bis naechste Messung

Wie weit ist den Objekt weg vom Sensor ?

von Nicolas K. (ccodex)


Lesenswert?

wolle g. schrieb:
> Nicolas K. schrieb:
>> Wenn ich auf den Trigger-Eingang des HC-SR04 ein Signal gebe aendert
>> der Echo-Ausgang sein Signal nicht,
>
> Dein Programm kann ich nicht beuteilen, da mir der verwendete µC
> unbekannt ist.
> startest Du mit der fallenden oder steigenden Flanke?

Oh stimmt, ich arbeite mit einem Atmega 328P.
Der Trigger wird mit fallender Flanke gesteuert und muss vorher fuer 10 
us ein High-Pegel haben.


Bastian W. schrieb:
> Hi,
>
> das mit dem low - high - low kannst du dir sparen. Es reicht wenn du am
> Anfang den Trigger auf low setzt und wartest bis das Echo auf high geht.
> und dann am Ende den Trigger wieder auf high setzt.
> UART.puts( "Start Messung" );
>
>     PORTD &= ~( 1 << PORTD2 );
>
>     while( !(PIND & ( 1 << PIND3 )));
>     TCCR0B |= ( 1 << CS00 ); // start Timer , kein prescaler
>
>     while( (PIND & ( 1 << PIND3 )) && ( count < 8000 ) );
>     TCCR0B &= ~( 1 << CS00 ); // stopp Timer
>
>     if( count >= 8000 ){ // 200ms rum
>       UART.puts( "Kein Wert!!!" );
>     }else{
>       hcWidth = SCHALL  25  ( count / 2 );
>       dtostrf( hcWidth, 6, 3, sbuff );
>       UART.gets( sbuff );
>     }
>
>
>     TCNT0 = 56;
>     count = 0;
>
>     UART.puts( "Ende Messung" );
>     PORTD |= ( 1 << PORTD2 );
>     _delay_ms( 20 ); //Warten bis naechste Messung
>
> Wie weit ist den Objekt weg vom Sensor ?

Das Programm kommt beim ueberpruefen des PIN 3, also Echo Pin, nicht 
mehr weiter.

: Bearbeitet durch User
von Dieter F. (Gast)


Lesenswert?

Du solltest das Timing beachten. Mach mal
1
    while(1){
2
    UART.puts( "Start Messung" );
3
    
4
    PORTD |= ( 1 << PORTD2 );
5
    _delay_ms( 20 );
6
    PORTD &= ~( 1 << PORTD2 );
7
  _delay_us( 11 );
8
    PORTD |= ( 1 << PORTD2 );
9
    
10
    while( !(PIND & ( 1 << PIND3 )));

Nicolas K. schrieb:
> Der Trigger wird mit fallender Flanke gesteuert und muss vorher fuer 10
> us ein High-Pegel haben.

Der Trigger ist die fallende Flanke - ja - und das Trigger-Signal muss 
mindestens 10 µs low sein ... . Zwischen 2 Messungen sollten 20 ms 
liegen.

https://www.mikrocontroller.net/attachment/218122/HC-SR04_ultraschallmodul_beschreibung_3.pdf

von Nicolas K. (ccodex)


Lesenswert?

So ich hab jetzt mal den Code ueberarbeitet:
1
int main( void )
2
{
3
  DDRD |= ( 1 << DDD2 ); // Trigger
4
  DDRD &= ~( 1 << DDD3 ); //Echo
5
  
6
  TCCR0A = 0;
7
  TIMSK0 |= ( 1 << TOIE0 );
8
  
9
  TCNT0 = 56; // Timer initialisiert 
10
  
11
  sei();
12
  
13
  char sbuff[256]={0};
14
  double hcWidth = 0;
15
  
16
  while(1){
17
    UART.puts( "Start Messung" );
18
    
19
    PORTD |= ( 1 << PORTD2 );
20
    _delay_ms( 20 );        <--- Die Verbesserung von Dieter F.
21
    PORTD &= ~( 1 << PORTD2 );
22
    _delay_us( 11 );
23
    PORTD |= ( 1 << PORTD2 );
24
  
25
26
    while( !(PIND & ( 1 << PIND3 )));
27
    TCCR0B |= ( 1 << CS00 ); // start Timer , kein prescaler
28
  
29
30
    while( (PIND & ( 1 << PIND3 )) && ( count < 8000 ) );
31
    TCCR0B &= ~( 1 << CS00 ); // stopp Timer
32
  
33
    if( count >= 8000 ){ // 200ms rum
34
      UART.puts( "Kein Wert!!!" );
35
    }else{
36
      hcWidth = SCHALL * 25 * ( count / 2 );
37
      dtostrf( hcWidth, 6, 3, sbuff );
38
      UART.puts( sbuff ); <---- statt gets muss puts hin 
39
    }
40
      
41
    
42
    TCNT0 = 56;
43
    count = 0;
44
45
    UART.puts( "Ende Messung" );
46
  }
47
  
48
  return 0;
49
}

Dieter F. schrieb:
> Du solltest das Timing beachten. Mach mal
>
>     while(1){
>     UART.puts( "Start Messung" );
>
>     PORTD |= ( 1 << PORTD2 );
>     _delay_ms( 20 );
>     PORTD &= ~( 1 << PORTD2 );
>   _delay_us( 11 );
>     PORTD |= ( 1 << PORTD2 );
>
>     while( !(PIND & ( 1 << PIND3 )));
>
> Nicolas K. schrieb:
>> Der Trigger wird mit fallender Flanke gesteuert und muss vorher fuer 10
>> us ein High-Pegel haben.
>
> Der Trigger ist die fallende Flanke - ja - und das Trigger-Signal muss
> mindestens 10 µs low sein ... . Zwischen 2 Messungen sollten 20 ms
> liegen.
>
> https://www.mikrocontroller.net/attachment/218122/...

Danke also jetz klappt es soweit, dass ich wenigstens Werte bekommen.
Jetzt kommt aber das Problem, wenn ich die Hand nicht vor den Sensor 
halte bekomm ich Wert aber wenn ich mit der Hand ueber dem Sensor wische 
haelt er bei der ersten Schleife wieder an.

Ich versteh nicht was jetzt schon wieder ist.

: Bearbeitet durch User
von Nicolas K. (ccodex)


Lesenswert?

Sry das ich schon wieder poste aber jetzt funktioniert es auf einmal. 
Komisch :D

Danke noch an euch das ihr mir so gut geholfen habt. :D

: Bearbeitet durch User
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.