Mmh...also bei mir funktioniert es immer noch nicht... es gibt immernoch sehr ungenaue Daten, obwohl ich nun beliebige Unterbrechungen von 1 bis 70 uM gemacht habe.
Kannst du mir bitte genau sagen, was du mit was verbunden hast, damit dein gepostet Programm bei mir laeuft - ich benutze einen normal aufgebauten ASURO ohne LCD display ? Ich weiss, es wir oben schon erklaert, aber irgendwie hab' ich das Gefuehl, dass ich etwas falsch mache. Also ich hab' es so angeschlossen:
5v supply - out+
0 Ground - out-
der 'Mittlere',also trigger input,output - CON1
No connection - PD6
mit folgendem programm
Also, dieses Programm funktioniert bei mir. Ich weiss, eigentlich sollte bei "No connection" auch nichts verbunden sein, aber bei mir gibt es nur mit dieser Einsteckvariante Messungen aus.Code:#include "asuro.h" #ifndef F_CPU /* wenn F_CPU nicht bereits vorher definiert (z.B. durch Übergabe als Parameter zum Compiler innerhalb des Makefiles) */ #define F_CPU 8000000UL /* Quarz mit 8 Mhz */ #endif #include <util/delay.h> // Funktion: Abstand per Ultraschall messen über SRF05 // Parameter: // sensor: PIN an dem der Sensor hängt // Rückgabewert: gemessener Abstand in cm uint16_t getAbstand(uint8_t sensor) { uint8_t tmp_sreg; tmp_sreg = SREG; cli(); // interrupts deaktivieren uint16_t abstand = 0; // abstand in cm DDRD |= (1<<sensor); // sensor Pin auf Ausgang PORTD |= (1<<sensor); // sensor Pin auf high setzen _delay_us(20); // 20 mikrosek. warten PORTD &= ~(1<<sensor); // sensor Pin auf low setzen (ist noch als Ausgang konfiguriert) DDRD &= ~(1<<sensor); // sensor Pin auf Eingang setzen while(!(PIND & (1<<sensor))); // auf Sensorantwort warten (Eingang wird high) while(PIND & (1<<sensor)) // warten bis Signalende bis Eingang low wird { _delay_us(58); // 58 mikrosec. warten entspricht 1cm entfernung abstand++; // Anzahl der cm erhöhen } SREG=tmp_sreg; // Register zurücksetzen return abstand; // gemessenen Abstand zurückgeben } uint16_t avrAbstand(uint8_t sensor) { uint8_t k=0; uint16_t average=0; for (k=0; k<50; k++) average=average+getAbstand(sensor); return (average/50); } int main(void) { Init(); int i=0; int j,k; BackLED(ON,ON); char S[100]; while(1) { uint16_t abstand = avrAbstand(PD6); sprintf(S,"\n\rA:%4d\n\r",abstand); SerWrite(S,strlen(S)); } }







Zitieren

Lesezeichen