www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SRF05 abfrage Problem bei der Antwort vom Sensor


Autor: Stefan (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich verush mit einem Atmega 16 und dem Ultraschallsensor SRF05 
Entfernungen zu messen. Mein Problem ist, dass ich den Wechsel von High 
auf Low der Antwort vom Sensor nicht abgefangen bekomme, bzw ich nicht 
in die if rein komm. Im Debugg flieg ich aus meiner while schleife raus 
wenn ich in diese Funktion reinmöchte. Ich verwende das AVR Studio. 
Vielen Dank fürs anschauen

Gruß Stefan
 while(1)
 { 
 if((PINA & 0x01)== 1) //Pin abfrage zum start
   { PORTC |= (1 << PIN0);
     _delay_us(30);
     PORTC &= ~(1 << PIN0);
   }

 if(PINC & 0x02) // starten wenn impuls zurück kommt 
 { 
    TCCR0 |= (1 << CS00); //Timer0 starten 
  messung=1;
 }

 if(((PINC & 0x02)==0)&&messung)
   { TCCR0 &= ~((1 << CS00) | (1 << CS01) | (1 << CS02));
     auswerten();
   messung=0;
   }     

 }//while ende

}//ende main

Autor: Uwe ... (uwegw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie ist der Sensor angeschlossen? Ein Pin oder zwei Pins?
Denn du fragst einmal auf PA1 ab, und dann auf PC2. Selbst wenn du den 
Sensor im SRF04-Modus betreibst, hättest du den Auslöse- und 
Auswertungs-Pin stellenweise vertauscht...

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey,

im 2 Pin betrieb ich schau mal nach, thx

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pin A0 ist ein Taster mit dem die Messung gestartet werden soll an Pin 
C0 bekommt der Sensor seinen Start impuls und auf Pin C1 kommt die 
Antwort, und hier will ich die Dauer des "High" zustandes messen.

Gruß

Autor: dima.h (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo liebe user,

ich bin nun seit 2 Tagen dran meine 2x SRF05 Sensoren zum laufen zu 
bringen.

Mein problem ist das ich das Highimpuls für die Messung aussende,
das reflektierende Highimpuls vom Objekt dann aber nicht mehr empfange.

Ich habe den SRF05 an einem ATMEL89C51AC3 Mikrocontroller im MODE1 
angschlossen.

Mein Programm soll mir die Messung dann an LEDs wiedergeben.
Ich sehe aber an den für die Messung bestimmten LEDs keine reaktion.

Das Programm funktioniert im Keil- Debug Modus eigentlich wie es sollte!
#include <t89c51ac2.h>   // Header für Controller "AT89C51AC3"
#include <stdio.h>       // Standard-Eingabe-Ausgabe-Header

// sfr P0 = 0x80;    /* Port-0, address 80h */
// sfr P1 = 0x90;    /* Port-1, address 90h */
// sfr P2 = 0xA0;    /* Port-2, address 0A0h */
// sfr P3 = 0xB0;    /* Port-3, address 0B0h */

/*---------------------------------------------------------------------------
Dieses Programm liest die Entfernug aus dem Ultraschall Sensor SRF05 aus,
und gibt die Entferung in cm auf Port 2 in Form von aufleuchtenden LEDs aus.
-----------------------------------------------------------------------------*/

/*--- Eingaenge und Ausgaenge deklarieren ---*/

   sfr srfPort = 0x90;        // Die Ports MÜSSEN mit der Hex-Adress angegeben werden (0x90 = Port 1)
   sfr ausgabe = 0xA0;        // Die Ports MÜSSEN mit der Hex-Adress angegeben werden (0xA0 = Port 2)

   sbit trigger_pin = P1^4;       // SRF05 Auslösung Trigger
   sbit echo_pin = P1^3;      // SRF04 Ergebnis einholen

/*--- Variablen und Konstanten Deklarieren ---*/

   unsigned int distanz;          // speichert die Distanz

/*--- Methoden und Prototypen ---*/

   void main(void);        // Hauptprogramm
   void srf_messung_ein(void);   // Schaltet den Port 1 auf High
   void srf_messung_aus(void);  // Schaltet den Port 1 auf Low und auf "einlesen"
   void timer_10ms(void);    // Wartet bis ein Burst ausgesendet wurde 
   void entfernung();      // errechnet die Entfernung zum Objekt
   int timer_echo();      // erfasst die Dauer vom reflektierten Echo

/*--- Hauptprogramm ---*/

   void main(void){    
 
         ausgabe=0x1;      //Port 2.1 zeigt den Betrieb an
        
         while(1){
            
            srf_messung_ein();
            timer_10ms();
            srf_messung_aus();
            timer_echo();
            entfernung();                  
         }      
   } //  main

/*--- Zusatzfunktionen ---*/

   void timer_10ms(void) {  
         // Timer0 vorbereiten
         TMOD=0x02;             // Timer 0 im 16 Bit-Betrieb (Mode1) Binär 000010000
         TH0=0xFFFF;            // Reload Wert ist 0xFFFF = 65535
         TL0=0xD8EF;            // Startwert = 55535 d.h. 10ms bis 65535 -> High-Bit des Zählers   
         TF0=0;                 // Timer 0 Überlaufflag löschen
         TR0=1;                 // Timer 0 starten           
   }

   void srf_messung_ein(void){
      trigger_pin = 0xFFFF;    // trigger_pin Impuls auslösen (P1 auf high=1)
   }

   void srf_messung_aus(void){ 
      trigger_pin = 0x0000;    // trigger_pin Impuls beenden (P1 auf low=0)
      srfPort = 0xFF;      // srfPort auf einlesen geschaltet  
   }

/*--- Entfernung berechnen ---*/

   void entfernung(int z){  

    distanz = z; 
     
      if(distanz > 20 ){
         ausgabe=0x03;      // Port 2.1 zeigt den Betrieb an u. Port 2.2 zeigt Distanz an
      }
      if(distanz > 40 ){
         ausgabe=0x07;          // Port 2.1 zeigt den Betrieb an u. Port 2.3 zeigt Distanz an
      }
      if(distanz > 60 ){
         ausgabe=0x0F;          // Port 2.1 zeigt den Betrieb an u. Port 2.4 zeigt Distanz an
      }
    if(distanz > 80 ){
         ausgabe=0x1F;          // Port 2.1 zeigt den Betrieb an u. Port 2.5 zeigt Distanz an
      } 
    if(distanz > 100 ){
         ausgabe=0x3F;          // Port 2.1 zeigt den Betrieb an u. Port 2.6 zeigt Distanz an
      }       
   }

   int timer_echo(){ 
    // Timer1 vorbereiten
       TMOD=0x20;         // Timer 1 im Reload-Betrieb (Mode2)
    TH1=0x7530;        // Reloadwert 30000, wenn bis Reloadwert gezählt wird ist kein Objekt in Reichweite 
         TL1=0x0000;              // Startwert 0
    TF1=0;          // Timer 1 Überlaufflag löschen
    TR1=1;           // Timer 1 starten  
          
      if(  echo_pin  != 1 ){ 
            
           distanz = (TL1/59);    // berechnet die Dauer des Echos in cm, speichert sie in der Variable "distanz"
      entfernung(distanz);  // distanz wird der Methode entfernung übergeben

      if(TL1 == 0x7530){    // 30ms abgelaufen d.h. es ist kein Objekt in Reichweite
        TR1=0;
        return 0;
           }   
    }    
  }

Ich wäre für jeden Tip dankbar!

Gruß, dima.h

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.