Forum: Mikrocontroller und Digitale Elektronik SRF05 Problem beim auswerten des Sensors


von dima.h (Gast)


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!
1
#include <t89c51ac2.h>   // Header für Controller "AT89C51AC3"
2
#include <stdio.h>       // Standard-Eingabe-Ausgabe-Header
3
4
// sfr P0 = 0x80;    /* Port-0, address 80h */
5
// sfr P1 = 0x90;    /* Port-1, address 90h */
6
// sfr P2 = 0xA0;    /* Port-2, address 0A0h */
7
// sfr P3 = 0xB0;    /* Port-3, address 0B0h */
8
9
/*---------------------------------------------------------------------------
10
Dieses Programm liest die Entfernug aus dem Ultraschall Sensor SRF05 aus,
11
und gibt die Entferung in cm auf Port 2 in Form von aufleuchtenden LEDs aus.
12
-----------------------------------------------------------------------------*/
13
14
/*--- Eingaenge und Ausgaenge deklarieren ---*/
15
16
   sfr srfPort = 0x90;        // Die Ports MÜSSEN mit der Hex-Adress angegeben werden (0x90 = Port 1)
17
   sfr ausgabe = 0xA0;        // Die Ports MÜSSEN mit der Hex-Adress angegeben werden (0xA0 = Port 2)
18
19
   sbit trigger_pin = P1^4;       // SRF05 Auslösung Trigger
20
   sbit echo_pin = P1^3;      // SRF04 Ergebnis einholen
21
22
/*--- Variablen und Konstanten Deklarieren ---*/
23
24
   unsigned int distanz;          // speichert die Distanz
25
26
/*--- Methoden und Prototypen ---*/
27
28
   void main(void);        // Hauptprogramm
29
   void srf_messung_ein(void);   // Schaltet den Port 1 auf High
30
   void srf_messung_aus(void);  // Schaltet den Port 1 auf Low und auf "einlesen"
31
   void timer_10ms(void);    // Wartet bis ein Burst ausgesendet wurde 
32
   void entfernung();      // errechnet die Entfernung zum Objekt
33
   int timer_echo();      // erfasst die Dauer vom reflektierten Echo
34
35
/*--- Hauptprogramm ---*/
36
37
   void main(void){    
38
 
39
         ausgabe=0x1;      //Port 2.1 zeigt den Betrieb an
40
        
41
         while(1){
42
            
43
            srf_messung_ein();
44
            timer_10ms();
45
            srf_messung_aus();
46
            timer_echo();
47
            entfernung();                  
48
         }      
49
   } //  main
50
51
/*--- Zusatzfunktionen ---*/
52
53
   void timer_10ms(void) {  
54
         // Timer0 vorbereiten
55
         TMOD=0x02;             // Timer 0 im 16 Bit-Betrieb (Mode1) Binär 000010000
56
         TH0=0xFFFF;            // Reload Wert ist 0xFFFF = 65535
57
         TL0=0xD8EF;            // Startwert = 55535 d.h. 10ms bis 65535 -> High-Bit des Zählers   
58
         TF0=0;                 // Timer 0 Überlaufflag löschen
59
         TR0=1;                 // Timer 0 starten           
60
   }
61
62
   void srf_messung_ein(void){
63
      trigger_pin = 0xFFFF;    // trigger_pin Impuls auslösen (P1 auf high=1)
64
   }
65
66
   void srf_messung_aus(void){ 
67
      trigger_pin = 0x0000;    // trigger_pin Impuls beenden (P1 auf low=0)
68
      srfPort = 0xFF;      // srfPort auf einlesen geschaltet  
69
   }
70
71
/*--- Entfernung berechnen ---*/
72
73
   void entfernung(int z){  
74
75
    distanz = z; 
76
     
77
      if(distanz > 20 ){
78
         ausgabe=0x03;      // Port 2.1 zeigt den Betrieb an u. Port 2.2 zeigt Distanz an
79
      }
80
      if(distanz > 40 ){
81
         ausgabe=0x07;          // Port 2.1 zeigt den Betrieb an u. Port 2.3 zeigt Distanz an
82
      }
83
      if(distanz > 60 ){
84
         ausgabe=0x0F;          // Port 2.1 zeigt den Betrieb an u. Port 2.4 zeigt Distanz an
85
      }
86
    if(distanz > 80 ){
87
         ausgabe=0x1F;          // Port 2.1 zeigt den Betrieb an u. Port 2.5 zeigt Distanz an
88
      } 
89
    if(distanz > 100 ){
90
         ausgabe=0x3F;          // Port 2.1 zeigt den Betrieb an u. Port 2.6 zeigt Distanz an
91
      }       
92
   }
93
94
   int timer_echo(){ 
95
    // Timer1 vorbereiten
96
       TMOD=0x20;         // Timer 1 im Reload-Betrieb (Mode2)
97
       TH1=0x7530;        // Reloadwert 30000, wenn bis Reloadwert gezählt wird ist kein Objekt in Reichweite 
98
       TL1=0x0000;              // Startwert 0
99
       TF1=0;          // Timer 1 Überlaufflag löschen
100
       TR1=1;           // Timer 1 starten  
101
          
102
      if(  echo_pin  != 1 ){ 
103
            
104
          distanz = (TL1/59);    // berechnet die Dauer des Echos in cm, speichert sie in der Variable "distanz"
105
          entfernung(distanz);  // distanz wird der Methode entfernung übergeben
106
107
      if(TL1 == 0x7530){    // 30ms abgelaufen d.h. es ist kein Objekt in Reichweite
108
        TR1=0;
109
        return 0;
110
      }   
111
    }    
112
  }

Ich wäre für jeden Tip dankbar!

Gruß, dima.h

von dima.h (Gast)


Lesenswert?

hab den code noch einmal abgeändert!
keiner ne idee was ich falsch mache?????

heeeelllllp!
1
#include <t89c51ac2.h>   // Header für Controller "AT89C51AC3"
2
#include <stdio.h>       // Standard-Eingabe-Ausgabe-Header
3
 
4
5
// sfr P0 = 0x80;    /* Port-0, address 80h */
6
// sfr P1 = 0x90;    /* Port-1, address 90h */
7
// sfr P2 = 0xA0;    /* Port-2, address 0A0h */
8
// sfr P3 = 0xB0;    /* Port-3, address 0B0h */
9
10
/*---------------------------------------------------------------------------
11
Dieses Programm liest die Entfernug aus dem Ultraschall Sensor SRF05 aus,
12
und gibt die Entferung in cm auf Port 2 in Form von aufleuchtenden LEDs aus.
13
-----------------------------------------------------------------------------*/
14
15
/*--- Eingaenge und Ausgaenge deklarieren ---*/
16
17
   sfr srfPort = 0x90;      // Die Ports MÜSSEN mit der Hex-Adress angegeben werden (0x90 = Port 1)
18
   sfr ausgabe = 0xA0;      // Die Ports MÜSSEN mit der Hex-Adress angegeben werden (0xA0 = Port 2)
19
20
   sbit trigger_pin = P1^4;
21
   sbit echo_pin = P1^3;
22
23
/*--- Variablen und Konstanten Deklarieren ---*/
24
25
   unsigned int i;    
26
27
/*--- Methoden und Prototypen ---*/
28
29
   void main(void);      // Hauptprogramm
30
   void srf_messung_ein(void);     // Schaltet den Port 1 auf High
31
   void srf_messung_aus(void);    // Schaltet den Port 1 auf Low und auf "einlesen"
32
   void delay_10ms(void);    // Wartet bis ein Burst ausgesendet wurde 
33
   void echo(void);
34
35
/*--- Hauptprogramm ---*/
36
37
  void main(void){       
38
    while(1){       
39
      ausgabe=0x1;                     //Port 2.1 zeigt den Betrieb an
40
            srf_messung_ein();
41
            delay_10ms();
42
                srf_messung_aus();
43
      echo();
44
           }      
45
     } //  main
46
47
/*--- Zusatzfunktionen ---*/
48
49
  void delay_10ms(void) {  
50
           // Timer0 vorbereiten
51
    TMOD=0x01;               // Timer 0 im 16 Bit-Betrieb (Mode1) Binär 000010000
52
          TH0=0xF5;              // Reload Wert ist 0xFFFF = 65535
53
          TL0=0xFF;              // Startwert = 55535 d.h. 10ms bis 65535 -> High-Bit des Zählers   
54
          TF0=0;                   // Timer 0 Überlaufflag löschen
55
          TR0=1;                   // Timer 0 starten              
56
     }
57
58
     void srf_messung_ein(void){
59
          trigger_pin = 1;         // trigger_pin auf HIGH
60
     }
61
62
  void srf_messung_aus(void){ 
63
    trigger_pin = 0;         // trigger_pin auf LOW   
64
          echo_pin = 0xFF;        // echo_pin "aufeinlesen" 
65
     }
66
67
/*------------------------------------------------------------------
68
 Hier wird wohl der Fehler sein
69
--------------------------------------------------------------------*/
70
71
  void echo(void){
72
    TMOD=0x10;        // Timer1 im 16Bit Modus
73
    TH1=0xCF;        // Startwert 8ACF = 35535 = 30ms bis 65535, wenn der Zähler bis zum HIGH- Bit
74
    TL1=0x8A;        // zählt dann ist kein Objekt in Reichweite
75
    TF1=0;          // Überlaufflag löschen
76
    TR1=1;              // Timer1 starten
77
78
    while (echo_pin != 0 && TF1 !=1){  // Misst die Dauer des “eingelesenen” High- Impulses
79
      i = (unsigned int) (TL1/29);  // schreibe gezählten Timerwert in "i" und gib es in cm aus
80
      if(i == 0 ){
81
        ausgabe=0x03;
82
      }
83
      if(i > 20 ){      // Objekt weiter weg wie 20 cm?
84
        ausgabe=0x07;
85
      }
86
      if(i > 60 ){      // Objekt weiter weg wie 60 cm?
87
        ausgabe=0x0F;
88
      }      
89
    }     
90
  }

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.