Forum: Mikrocontroller und Digitale Elektronik HC-SR04 keine Reaktion


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Nicolas K. (ccodex)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.