void writeSensor(int i){
if(i == 1){
DDRD |= DQ;
PORTD &=~ DQ;
_delay_us(10); //10//1
DDRD &=~ DQ;
_delay_us(65); //65
}else if(i == 0){
DDRD |= DQ;
PORTD &=~ DQ;
_delay_us(90); //90 //65
DDRD &=~ DQ;
_delay_us(5); //5 //1
}
}
Hi Ihr beiden, wenn ihr den Sensor ohnehin beschreibt, braucht ihr das
DQ-Bit im DDR nur einmal zu Beginn der Funktion setzen.
Euer Hauptproblem ist, dass Ihr die Funktion z. B. mit writeSensor(0xCC)
aufruft. Aber in der Funktion writeSensor fragt ihr nur i == 1 ab. Da i
aber 11001100 hat, entspricht es nicht der 1 und deshalb wird der Port
nicht bedient.
Das zweite Problem was ich sehe ist, dass Ihr die 8 Bits hintereinander
bedienen müßt. Da tut Eure Funktion aber nicht, weil ihr keine Schleife
programmiert habt.
Euer Code sollte besser so aussehen.
void writeSensor(int i)
{
/*Iterationsvariable für die Bitposition*/
uint8 j;
DDRD |= DQ; /* Beim Schreiben bleibt DDRD auf Ausgang*/
/*for-schleife über alle 8 Bits. */
for(j=0; j < 8; j++)
{
/* links schieben ist multiplizieren und binär und verknüpf.*/
/* sollte mit 1 an Positon 2^0 anfangen. LSB first !!! */
if(i & (1 << j))
/* das hier soll eine 1 an der Bitpos feststellen.*/
{
PORTD &=~ DQ;
_delay_us(5); /*lt. Datenbl. min. 1µsec*/
PORTD |= DQ;
}
else
{
PORTD &=~ DQ;
/* 60µs sollten reichen. Länger kann nicht schaden.*/
_delay_us(60);
PORTD |= DQ;
}
}/*ende der for-schleife*/
}/*ende der funktion writeSensor*/
So das lesen macht ihr jetzt so ähnlich. Da müßt Ihr erst einen kurzen
Impuls auf 0 senden und dann den DDRD auf Input setzen.
Das solltet Ihr jetzt aber hin bekommen.
Viel Erfolg