-
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.
-
Bist du sicher das du ihn im Betriebsmodus 2 verwendest?!
Also, 1. Pin an 5V, 2. Pin frei lassen, den mittleren Pin an PD6, 4. und 5. Pin an Masse! So und nicht anders!
Deine Funktion "avrAbstand" versteh ich nicht, ist doch total überflüssig?!
-
Was muss man machen, dass er im Betriebsmodus 2 ist?
Ok, ich werd's mal so wie bei dir versuchen. Laeuft dein gepostetes Programm fuer den PD6 als Ansteuerpin? Und muesste das rote LED am SRF05 leuchten?
-
Um ihn in den BEtriebsmodus 2 zu bekommen musst du Pin4 mit GND verbinden.
Liess dir mal die Anleitung dazu durch!
Hier mal mein Code, bedenke aber das die Pausenzeiten "passend gemacht" sind.
Läuft dein Asuro wirklich auf 8MHz?
Code:
uint16_t getAbstand(uint8_t sensor)
{
uint16_t abstand = 0; // abstand in cm
DDRC |= (1<<sensor); // sensor Pin auf Ausgang
PORTC |= (1<<sensor); // sensor Pin auf high setzen
_delay_us(4); // 20 mikrosek. warten
PORTC &= ~(1<<sensor); // sensor Pin auf low setzen (ist noch als Ausgang konfiguriert)
DDRC &= ~(1<<sensor); // sensor Pin auf Eingang setzen
while(!(PINC & (1<<sensor))); // auf Sensorantwort warten (Eingang wird high)
while(PINC & (1<<sensor)) // warten bis Signalende bis Eingang low wird
{
_delay_us(1); // 58 mikrosec. warten entspricht 1cm entfernung
abstand++; // Anzahl der cm erhöhen
}
return abstand; // gemessenen Abstand zurückgeben
}
/////////////////////////////////////////////////////////////////////////////
// Main-Funktion
/////////////////////////////////////////////////////////////////////////////
main()
{
uint16_t x = 0;
char ausgabe[10]="\0";
lcdInit();
lcdString("X ");
x = getAbstand(5);
itoa((x/22), ausgabe, 10);
lcdString(ausgabe);
lcdString("cm");
while (true) // Mainloop-Begin
{
} // Mainloop-Ende
-
Mmh... Also, um sicher zu gehen:
Ich stecke alles so ein, wie beschrieben, Pin 1,3 und 5. Dann kompiliere ich das Programm, flashe es auf den ASURO ... und nichts laueft... das habe ich nun ein paar Mal wiederholt... immer das gleiche Resultat.... mache ich etwas falsch?
-
Wo gibt's die Anleitung? Ich habe schon ein paar SRF05 datasheets angeschaut... da wird aber nicht so viel dazu erklaert... alles recht kurz.
-
-
Und wo ist der GND konkret am ASURO? (Sorry dass ich so bloede Fragen stelle, bin noch recht ein Anfaenger)
-
GND ist Masse, bzw. 0V! Und da muss Pin 4 mit ran.
-
jipppiiii
es laeuft -> juipiduippiiii
Zwar nicht so genau... aber es tut sich was! ich glaub's fast nicht :D ... nach zwei Monaten Hardware check, endlich!
Ich hab' vergessen (bzw. nirgends gelesen) dass man den 4.Pin mit dem 5.Pin am SRF05 kurzschliessen muss...