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
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));
}
}
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.
Lesezeichen