-
srf04 mit pulse
hallo, ich möchte meinen srf04 ultra abfragen mit winavr , der geht mit pulse.
bascom:
Portc.6 = 0
Pulseout Portc , 6 , 10
Pulsein Ultrasonic_m , Pinc , 7 , 1
am port c6 wird ein puls abgegeben an den ultra und in der variablen ultrasonic_m ein wert zurückgegeben ,der durch einen impuls vom srf04 an port c7 dann vom avr erzeugt wird.
wie kann ich das in winavr realisieren. danke.
mfg pebisoft
-
Hallo pebisoft,
am einfachsten.
port c7 kontinuierlich abfragen ob impuls gestartet ist
denn ein timer starten mit 0
port c7 kontinuierlich abfragen ob impuls gestopt ist
timer auslesen
die timer wert ist nach einen distanz um zu rechnen
abhangig welcher timer-range gewahlt ist
besser wahre es ein externen interrupt eingang als impuls eingang zu nutzen, einen impuls-start und einem impuls-stop generieren dann jeden ein interrupt womit die timer gestartet und gelesen wird
dass kostet viel weniger belastung fur die procezzor.
mahl so eine idee
gruss
Henk
-
das verstehe ich nicht so ganz. wer hat denn schon mit winavr ein srf04 zum laufen gebracht mit richtigen entfernungsdaten.
mfg pebisoft
-
Da hab ich falch gelesen
ich dachte die abstand-puls vom srf04 wird an c7 angeboten...
bitte um vezeihung... :oops:
-
Pepisoft ich hab grad bisschen Code geschrieben, müsste eigentlich funktionieren kanns aber nicht testen, hab kein srf04.
Code:
// Für ATMega8, benutzt wir Input Capture von Timer1, auf 8Mhz geändert
#include <io.h>
#include <avr/delay.h>
#define US_PORT PORTD
#define US_PORT_RICHTUNG DDRD
#define US_PIN PD7 // Der Pin kommt zum Trigger-Puls Eingang
unsigned char start_messung(void)
{
unsigned char wert,wert_in_cm;
US_PORT|=(1<<US_PIN); // Trigger-Puls auf high
// PD6 ist Input Capture Pin beim ATMega8, hier kommt der Echo-Pulse Ausgang hin
TIMSK|= (1<<TICIE1); // Input Capture Interrupt enable
TCCR1B|= (1<<CS11); // Prescaler 8, damit dauert ein Tackt 1 micro sekunden
_delay_us(15); // Laut Datenblatt Trigger-Puls min 10us auf high
US_PORT&=~(1<<US_PIN); // Trigger-Puls Eingang wieder auf low
while ( !(TIFR & (1<<ICF1 )) ) ; // Warten bis Echo-Puls Ausgang auf low --> Messung beendet
wert=172*ICR1/10000; // wert ist nun in cm
TIFR|=(1<<ICF1); // ICF1 Bit wieder löschen durch schreiben einer logischen 1
TCCR1B&= ~(1<<CS12) & ~(1<<CS11) & ~(1<<CS10); // Timer wieder aus
return wert;
}
void main (void)
{
unsigned char wert;
US_PORT_RICHTUNG|=(1<<US_PIN); // US_PIN auf Ausgang
wert=start_messung();
}
Gruß Muraad
EDIT: Mir ist grad noch was aufgefallen. Wenn er garkein Echo empfängt also kein Objekt vor dem Sensor ist bleibt er durch die Zeile
while ( !(TIFR & (1<<ICF1 )) ) ; // Warten bis Echo-Puls
glaub ich in einer Endlosschleife. Besser währe es mit der Funktion nur die Messung zu starten, um auf das Input Capture Signal zu "warten" sollte man aber den Interrupt SIG_INPUT_CAPTURE1 verwenden.
-
hallo, der code ist wunderbar. eine zeitmessung mit höchster präsenz. ja auch universal überall einsetzbar. würde ich mit in deiner wunderbaren sammlung reinnehmen. klasse. mir fehlt immer das wissen für die speziellen bezeichnungen der internen bit-setzung in timer, adc usw.
ich habe jetzt schon viel gesammelt, gibt aber immer wieder probleme.
siehe auch pwm. abr man muss sich zeit dafür nehmen.
mfg pebisoft
-
Immer wenn ich Code schreib hab ich neben her die Seite
www.mc-project.de und das avr-gcc tutorial von www.mikrocontroller.net offen und schau da auch immer erst wie ich die Bits setzten muss.
Oder nehm deren Code und änder ihn bisschen ab.
Und Pepisoft hast du den Code testen können und er hat funktioniert?
Was passiert wenn kein Objekt vor dem Sensor ist, bleibt er in einer Endlosschleife und wartet auf ein Echo?
Ich bin auch immer am überlegen ob ich mir srf04 oder srf08/10 mit I2C kauf, da der Preistunterschied schon übel ist.
Gruß Muraad
-
hallo, der srf04 ist besser zu handhaben. wie du geschrieben hast, kann man als programmierer 100% einfluss nehmen mit einfachen timer-befehlen und die fehlersuche ist einfacher. ich habe auch einen srf08 i2c.
den kann man nicht mehr dreinreden. am robby habe ich 3x srf04, zur zeit laufen die mit bascom auch da habe ich gute variable möglichkeiten.
den srf08 habe ich wieder abgebaut.
habe dein programm noch nicht getestet.
mfg pebisoft
-
nochmal zur endlos schleife:
da der schall 58,066 usec pro cm braucht,
und der srf04 max 300 cm messen kann, kann man ihn
nach 17630 usec abschalten.
abschaltung = 10us trigger + 200us interne taktung + (300 x 58,066us).
man kann noch einen kleinen sicherheitszuschlag geben ohne das das ablaufprogramm
des robby davon etwas merkt.
mfg pebisoft
-
hallo wo ist der "Input Capture Pin" am avr16.
ist das pin pd2 und pd3 (int0 und int1).
mfg pebisoft