Hi,
ein paar Dinge sind mir aufgefallen, warum dein Programm wahrscheinlich nicht funktionieren kann:
* Du schaltest in deinem Programm nicht den Triggerausgang PB.3 sondern PB.0. Zudem schreibst du den gesamten Port B und nicht nur den einzelnen Portausgang. Für den AVR in C funktioniert das so:
Code:PORTB |= (1 << PB3); /* setzt Port B.3 auf HIGH */ PORTB &= (1 << PB3); /* setzt Port B.3 auf LOW */
* Wieso verwendest du überhaupt Port B.3? Dort wird nämlich beim Asuro die 36kHz Trägerfrequenz für die IR-LED ausgegeben. Besser wäre es, Port D.2 zu verwenden, dort hängt die rote Status LED dran.
* Die wait Funktion kommt mir sehr seltsam vor, dort werden sowohl die Register von Timer0 sowie Timer1 verwendet. Warum nimmst du nicht einfach die _delay_us Funktion aus der avrlibc.
* Das Einlesen des Ports D.6 für den Echo Impuls ist auch nicht ganz i.O. PORTx bezeichnet das Schreibregister eines Ports, PINx hingegen das Leseregister.Code:#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> /* in älteren avr-libc Versionen <avr/delay.h> */ ... _delay_us(10); /* 10µs Delay */
Es geht auch mit den folgenden avrlibc Bibliotheksfunktion.Code:while ((PIND & (1<<PD6) ) == 0); /* solange warten, wie Port D.6 low ist */
*Natürlich kannst du dir auch für deine Ports ein paar Defines überlegen, die aussagekräftiger sind.Code:loop_until_bit_is_set (PIND,PD6); /* wartet bis Pin D.6 HIGH ist */ loop_until_bit_is_clear (PIND,PD6); /* wartet bis Pin D.6 LOW ist */
Viel Erfolg. Zum weiteren Studium empfehle ich dir das [url=http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial]AVR-GCC Tutorial[/ur]Code:#define TRIGGER_PORT PORTD #define TRIGGER_PIN (1 << PD2) #define ECHO_PORT PIND #define ECHO_PIN PD6 ... TRIGGER_PORT |= TRIGGER_PIN; /* Trigger Port HIGH */ _delay_us(10); /* 10µs warten */ TRIGGER_PORT &= ~TRIGGER_PIN; /* Trigger Port LOW */







Zitieren

Lesezeichen