PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit 1-wire



Ethernut
02.04.2013, 08:14
Liebe Forumsgemeinde,

ich habe vor kurzem auch einen Thread erstellt bzgl. des Regelns. Bin aber auf ein Zwischenhindernis gestoßen. Ich brauche für einen Regler ja einen AD Wandler. Mir wurde der Dallas DS18S20 vorgegeben.
Nur habe ich zur Zeit das Problem, dass dieser mir laufend nur 1er liefert. Hier mal der Code:

main.c:


#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#include <stdio.h>

#include "UART.h"
#include "1wire.h"


int main(void)
{
DDRC=0xFF;
PORTC=0xFF;
USART_Init(103);

sei();
rs232_printf("Test 1\n");
rs232_printf("Reset: %d\n", OWTouchReset()); //gibt 0 zurück
rs232_printf("Test 2\n");

while(1)
{
rs232_printf("Endwert: %d\n",OWReadByte()); //ganzes Byte auslesen
_delay_ms(1500);
}
return 0;
}




1wire.c:


#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#include <stdio.h>

#include "UART.h"
#include "1wire.h"

//-----------------------------------------------------------------------------
// Generate a 1-Wire reset, return 1 if no presence detect was found,
// return 0 otherwise.
// (NOTE: Does not handle alarm presence from DS2404/DS1994)
//
int OWTouchReset(void)
{
int result;

_delay_us(0);
DDRD&=(0<<PD6); // Drives DQ low
PORTD=0x0;
_delay_us(480);
DDRD&=(1<<PD6); // Drives DQ high
PORTD=0b01000000;
_delay_us(70);
DDRD&=(0<<PD6); // Drives DQ low
PORTD=0x0;
result=(PIND&0b01000000);
DDRD&=(1<<PD6); // Drives DQ high
PORTD=0b01000000;
_delay_us(410);
return result; // Return sample presence pulse result
}

//-----------------------------------------------------------------------------
// Read a bit from the 1-Wire bus and return it. Provide 10us recovery time.
//
int OWReadBit(void)
{
int result;

DDRD&=(0<<PD6); // Drives DQ low
PORTD=0x0; //hier muss ich PORTD eh auf 0 setzen, oder?
_delay_us(15);
DDRD|=(1<<PD6);
PORTD=0b01000000;
_delay_us(12);
result=(PIND&0b01000000)>>6;
rs232_printf("result = %d\n",result);
_delay_us(55);

return result;
}

//-----------------------------------------------------------------------------
// Read 1-Wire data byte and return it
//
int OWReadByte(void)
{
volatile int loop, result=0,zwischen=0;

for (loop = 0; loop < 8; loop++)
{
zwischen=OWReadBit();
//rs232_printf("%d\n", zwischen);
result=result|(zwischen<<loop);
}
rs232_printf("gesendet\n");
return result;
}



Ich empfange nur 1er. Ich versuche mich an diese Webseite mit den Verzögerungen
zu orientieren:

http://www.maximintegrated.com/app-notes/index.mvp/id/126

Hab auch die Funktionen daraus entnommen. Alles wird über PIN 6
gesteuert.

Kann mir bitte einer sagen was ich da falsch mache? Irgendwie habe ich
das Gefühl, dass ich das nicht richtig verstehe.

Liebe Grüße,
Ethernut

seite5
02.04.2013, 20:43
hallo,
verstehe die Zeile DDRD|=(1<<PD6); nicht, meiner Meinach müsste das DDRD.6 au 0 gesetzt werden, PORTD.6 auf 1 (Eingang mit PullUp)
mfg
Achim