-         

Ergebnis 1 bis 2 von 2

Thema: SRF05 Auswertung gelingt nicht?! ==> Warum?

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    01.03.2010
    Beiträge
    15

    SRF05 Auswertung gelingt nicht?! ==> Warum?

    Anzeige

    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.

    Vermutlich liegt es an meinen Programmierfähigkeiten

    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.

    Code:
    #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  
    
    	  	while(  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, bin nämlich total am verzweifeln.

    Vielen Dank!

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    01.03.2010
    Beiträge
    15
    hallo ich bins noch mal,
    ich bin nun mein code noch mal durchgegangen und habe
    die größten fehler beseitigt! :-D

    so das das programm im debug modus vom keil so wie es sollte abläuft!

    leider funktioniert das auch nur im debug modus und nicht auf der hardware, sprich die testLEDs bleiben leider aus!

    der obere code wurde auf den neusten stand akualisiert!

    könnte ihr mir vielleicht jetzt ein tip geben was ich falsch mache?

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •