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.
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 */
* 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:
while ((PIND & (1<<PD6) ) == 0); /* solange warten, wie Port D.6 low ist */
Es geht auch mit den folgenden avrlibc Bibliotheksfunktion.
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 */
*Natürlich kannst du dir auch für deine Ports ein paar Defines überlegen, die aussagekräftiger sind.
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 */
Viel Erfolg. Zum weiteren Studium empfehle ich dir das [url=http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial]AVR-GCC Tutorial[/ur]
Lesezeichen