- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 4 von 4

Thema: SRF05 US-Sensor -Problem

  1. #1
    Neuer Benutzer
    Registriert seit
    17.04.2007
    Ort
    Kleve
    Alter
    33
    Beiträge
    3

    SRF05 US-Sensor -Problem

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,
    wie der Title schon sagt arbeite ich grade an einem SRF05
    Sensor, den ich im zweiten Mode betreibe, also mit einer Leitung
    zwischen Controller und Sensor.Als Controller verwende ich
    einen Atmega32.




    Mein Code sieht momentan wie folgt aus:
    Code:
    uint16_t getabstand(uint8_t sensor)
    {
    uint16_t count;
    
    
    DDRC|=sensor;
    PORTC |= (1<<sensor); //Puls senden
    _delay_us(10); //wait_us(10);
    PORTC &= ~(1<<sensor); //Puls Ende
    DDRC &= ~(1<<sensor);
    while(!bit_is_set(PINC,sensor)){}
    count=0;
    while(bit_is_set(PINC,sensor))
    {
    _delay_us(1);//wait_us(1); 
    count++;       //in der while schleife wird count immer nach einer mikrosekunde hochgezählt    
     if(count>5000) return 0; // kein Signal,
    }
    
    return count/58; // Abstand (mm)  
    }
    
    
    
    
    
    int main(void) {
    
    DDRB=0xff;             //an PB0 hängt eine led,diese dient als Rückmeldung 
    PORTB=(1<<PB0);   //ob der abstand höher oder niedriger als der 
    uint16_t abstand;      //Vergleichswert ist
    
    while (1){
    abstand=getabstand(1);  // sensor hängt an dem PIN PC1
    
    if (abstand>1){
    PORTB&=~(1<<PB0);
    }
    else{
    PORTB=(1<<PB0);
    
    }
    
    
    }
    return 0;}
    [/url]


    Vorerst geht es mir nur darum immer einen vergleichbaren Wert zu erhalten.
    Es fuktioniert auch schon, allerdings nur direkt nachdem ich das
    Programm draufgeladen habe.

    Sprich ich stecke den ISP-Stecker raus, mach den Strom an und lade das Programm drauf. Dann leuchtet die LED am Controller und die auf dem Sensor und ich kann die LED am Controller beeinflussen, indem ich z.B. die Hand vor den Sensor hin und her schiebe.Wenn ich jetzt aber den Strom ausmache (es leuchten dann noch beide LEDs, nur schwächer), den ISP-Stecker rausziehe und dann den Strom wieder anmache, tut sich am Sensor nichts mehr, die LED ist aus (im Gegensatz zu der am Controller).
    Spannung messe ich am der "Datenleitung" des Sensor keine
    ( wenn es funktioniert liegt eine Spannung an).

    Ich bin grad ziemlich ratlos wodran es liegen könnte.Vielleicht
    kennt ja jemand das Problem oder ich hab nur nen Anfängerfehler gemacht.Auf jeden Fall schon mal danke falls jemand helfen kann.


    hannes468

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    38
    Beiträge
    4.255
    Ich hab bei der Abfrage des SRF05 die Erfahrung gemacht, dass _delay_us(1) zu unpräzise ist bzw der Aufruf zu lange dauert. Daher ist die wirkliche Verzögerung viel größer als 1us. Ich arbeite jetzt mit einem Timer, der so eingestellt ist, dass im 1cm-Intervallen abgefragt wird (also alle 58us).

    Außerdem muss zwischen zwei Messungen gewartet werden, bis der vorherige Impuls abgeklungen ist. Sonst misst man die doppelten Echos vom letzten Impuls.

  3. #3
    Neuer Benutzer
    Registriert seit
    17.04.2007
    Ort
    Kleve
    Alter
    33
    Beiträge
    3
    Auf einen Timer werde ich sowieso umsteigen, spätestens wenn ich ne externen Taktquelle dranlöte.

    Ich hatte dazu auch schonmal ne Funktion geschrieben, nur damit hat sich der Sensor gar nicht gemeldet. Ich vermute sowieso das der interne Takt da nicht grad hilfreich ist.
    Code:
    volatile uint8_t us_sek=0;  //dient zum austausch zwischen interrupt-routine und zeitfunktion
    
    ISR(TIMER0_COMP_vect){ //interrupt routine: soll nach eine mikrosekunde                                                                                                 //                                       "us_sek" um 1 hochzählen
    us_sek++;}
    	
    	
      	
    void timer0_init(void){
    	TCCR0=(1<<CS00); // timer0 läuft ohne taktteiler
    	TIMSK=(1<<OCIE0);//compare match interrupt freigeschaltet
    	OCR0=10; // compare match wert 
    	}
    	
    	
    void wait_us(uint8_t sek){
    	us_sek=0;
    	
    	while(us_sek!=sek){}}  //wartet solange bis soviele mikrosekunden        
                                                //   rum sind  wie "sek" vorgibt

    Aber nochmal zum Problem mit dem Code mit den Zeitschleifen.
    Ich habe nun festgestellt, dass (während der ISP-Stecker nicht verbunden ist), wenn ich den Strom anstelle und dann ganz schnell aus und wieder an, der Sensor läuft. Hat vielleicht jemand eine Idee dazu?

  4. #4
    Neuer Benutzer
    Registriert seit
    17.04.2007
    Ort
    Kleve
    Alter
    33
    Beiträge
    3
    Ich bin nun auf nen externen Quarz umgestiegen und immerhin meldet sich der Sensor anscheinend direkt nach dem Start.

    Dann werd ich mich mal dranmachen die Zeit von nem Timer abzuleiten.

Berechtigungen

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

LiFePO4 Speicher Test