Hallo
Aller Anfang ist schwer.
X4 habe ich gewählt, weil ich mir die C-Pins gut merken kann und weil sie Bit0 und Bit1 am Port belegen. Prinzipiel kannst du mit allen Pins digitale (high/low) Signale auswerten. Da aber nur ein paar Pins auch analoge Signale einlesen können sind diese Pins "wertvoller" und man versucht, diese für spätere Erweiterungen frei zu halten.
Die Signale deines SRF05 sind eindeutig digital:
Bild hier
Hier noch das überarbeitete Programm:
Code:
// SRF05 Ansteuerung mit der bee (zweiter Anlauf) mic 4.6.12
// Anschluß an X4: Vcc, GND, PC0=Start, PC1=Messwert (SRF04-Modus)
// Datenblatt SRF05: http://www.robotikhardware.de/download/srf05doku.pdf
// https://www.roboternetz.de/community/threads/58058-Nibobee-Ultraschall-wie-anschlie%C3%9Fen
#include <avr/io.h>
#include <util/delay.h>
uint8_t messwert, timeout;
int main(void)
{
DDRB = 0b0001111; // Die Pins der Leds sind Ausgang
PORTB &= 0b11110000; // 0V ausgeben. Die Leds sind aus
DDRC = 0b00000001; // Im Datenrichtungsregister PC0 als Ausgang definieren (Bit 2^0)
PORTC &= ~(1<<PC0);// 0V ausgeben an PC0
PORTB |= 0x0f; // alle Leds an
_delay_ms(1000); // eine Sekunde warten
PORTC &= 0xf0; // alle Leds wieder aus
while(1)
{
messwert=0;
timeout=0;
PORTC |= 1; // Startimpuls ausgeben
_delay_us(20); // der Impuls muss mindestens 10µs dauern
PORTC &= 0xfe; // Startimpuls fertig
while(!(PINC & 0b00000010) && --timeout) _delay_ms(4); // timeout 1 Sekunde
if(timeout>0)
{
while((PINC & 2) && (++messwert<16)) // Überlauf bei 16
{
_delay_us(1666); // 25ms/16-Schritte
}
if(messwert<16) // wir können nur 4 Bit anzeigen
{
PORTC &= 0xf0; // alle Leds aus
PORTC |= messwert; // Messwert dual anzeigen
}
}
}
return 0;
}
Auf das Servo mag ich im Moment noch nicht eingehen, aber du kannst dich schon mal einlesen:
http://www.google.de/search?q=servosignal
Gruß
mic
Lesezeichen