PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SRF05 US-Sensor -Problem



hannes468
20.10.2007, 13:26
Hallo,
wie der Title schon sagt arbeite ich grade an einem SRF05 (http://www.robotikhardware.de/download/srf05doku.pdf)
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:

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

uwegw
20.10.2007, 13:45
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.

hannes468
20.10.2007, 14:13
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.


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?

hannes468
23.10.2007, 16:56
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.