Forum: Mikrocontroller und Digitale Elektronik Atmega 16 und HC-SR04


von Shaggy (Gast)


Lesenswert?

Hallo ich bin gerade dabei mein HC-SR04 an mein Atmega16 zu hängen und 
wollte um zu sehen ob er vernünftig läuft 2 LED's ansteuern, die auf das 
Echo Signal des HC-SR04 Reagieren, sprich bei LOW Pegel die eine LED an, 
bei High die andere, jedoch ist es bei mir so das nur die 1. LED dauer 
lechtet. kann mir vllt jemand Helfen.

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define F_CPU 1000000UL //1MHz CPU Takt
//Impuls Start: PD2 auf High
ISR  (TIMER1_COMPA_vect)
{
  PORTD|=(1<<PD2);
}

//Impuls Ende: PD2 auf Low
ISR(TIMER1_COMPB_vect)
{
  PORTD &= ~(1<<PD2);
}
int main(void)
{
    // Ein- und Ausgänge
    //Eingänge: Echo: PD3

    //Ausgänge:
    DDRD  |= (1<<PD2);          //Trigger
    DDRA  |= (1<<PA0)|(1<<PA1);      //Status LED1 :PA0, LED2 :PA1
  //Register Konfiguration
  TCCR1B  |= (1<<WGM12);          // CTC Modus aktiv
  TCCR1B  |= (1<<CS10);          //Prescaller 1:1 = 1000000 Hz
  TIMSK  |= (1<<OCIE1A) | (1<<OCIE1B);  // Timer Interrups zum Vgl.
  OCR1A = 20000;              // Periodendauer: 20 ms
  OCR1B = 10;              // Implusdauer: 10 us


  while (1)

    {
    if (PIND & (1<<PD3)) //Wenn Echo auf High
    {
      PORTA |= (1<<PA0);  //LED1 AN
      PORTA &= (1<<PA1);  //LED2 AUS
      _delay_ms (1);
    }

    if (!(PIND & (1<<PD3))) //Wenn Echo auf LOW
    {
      PORTA &= (1<<PA0);  //LED1 AUS
      PORTA |= (1<<PA1);  //LED2 AN
      _delay_ms(1);
    }
    }
}

: Verschoben durch User
von Shaggy (Gast)


Lesenswert?

2 Fehler sind mir gerade selber aufgefallen. Also LED's Blinken beim 
manuellen Wechsel von high und Low. Jetzt hab ich noch die Frage, ob die 
Ansteuerung den richtig ist oder ob da auch noch ein Fehler drin steckt.

Fehler waren Sei(); vergessen damit überhaupt das interrupt ausgeführt 
wird und statt ... &= (1.... Müsste es ...&= ~(1.... Heißen. Und low und 
und High sind In der Anzeige der LEDs vertauscht.

von Wolfgang (Gast)


Lesenswert?

Shaggy schrieb:
> ... jedoch ist es bei mir so das nur die 1. LED dauer lechtet.

Was heißt das? Wie hast du das fest gestellt?
Hast du dir die Zeit zwischen Aussendung und Eintreffen des Echos mal 
ausgerechnet?

von Shaggy (Gast)


Lesenswert?

Also mittlerweile läuft der Code fehlerfrei die erste Diode leuchtet, 
sobald am Echo pin ein high Pegel anliegt also warte auf Echo Signal. 
Die 2. Led leuchtet nach Eintreffen des Echos kurz auf und zeigt an wenn 
der Echo auf Low geht. Die Frequenz der 1. LED ist fest die der 2. 
ändert sich mit der Entfernung des Objektes.

von Bastian W. (jackfrost)


Lesenswert?

Dir ist bewusst das die Länge der Highflanke die Laufzeit ist ? Also die 
Zeit die deine LED 1 leuchtet.

Wenn kein Echo kommt ist der Ausgang für 200 ms high.

Gruß JackFrost

von Shaggy (Gast)


Lesenswert?

Also zieht er doch wenn das Signal kommt von high auf Low oder nicht?

von Rainer V. (rudi994)


Lesenswert?

Bastian W. schrieb:
> Wenn kein Echo kommt ist der Ausgang für 200 ms high.

Ist das nicht etwas viel? Das wären max. nur 5 Messungen pro Sekunde :(

In diversen Datenblättern/Anleitungen gibt es verschiedene Angaben, z.B. 
mind. 10µs lang mit High triggern, nach abgefallener Triggerflanke 
sendet der HC-SR04 einen 200µs langen Burst (8 Pulse, 40 kHz), danach 
geht der Echo-Pin auf High und bleibt es 38ms lang, falls kein Echo 
kommt (oder geht bei Echo wieder auf Low), empfohlene Gesamtdauer pro 
Meßzyklus ist 60ms (also knapp 17 Messungen pro Sekunde).

Vllt. ist hier noch etwas: HC-SR04 auswerten
Beitrag "Ultraschallsensor HC-SR04 auswerten"
Beitrag "Ultraschall Modul HCSR04, falsche Auswertung"
Fertiger Code in AVR-C (evtl. mit HD44780 Display):
Beitrag "HC SR-04 Ultraschallsensor (fertiger Code im Anhang)"

von Shaggy (Gast)


Lesenswert?

mal so ne blöde frage wie kann man es am besten realisieren, die zeit 
zwischen High und Low Auszuwerten=

von Rainer V. (rudi994)


Lesenswert?

Distanz = Signallaufzeit (High am Echo-Pin)*1/2*Schallgeschwindigkeit 
(in trockener Luft 343.46 m/s bei 1013 mBar und 20 °C). Das ist vor 
allem temperaturabhängig! 
https://de.wikipedia.org/wiki/Schallgeschwindigkeit

von Wolfgang (Gast)


Lesenswert?

Shaggy schrieb:
> mal so ne blöde frage wie kann man es am besten realisieren, die
> zeit zwischen High und Low Auszuwerten=

Messserie bei verschiedenen Abständen machen, Distanz gegen Pulsdauer 
auftragen, linear fitten
-> Offset,  Schallgeschwindigkeit/2

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.