TomXV Napisano Kwiecień 6, 2012 Udostępnij Napisano Kwiecień 6, 2012 Witam,Chciałbym zamontować do swojego robota jakiś czujnik temperatury i zdecydowałem się na ds18b20 korzystając z strony: http://www.jaglarz.com/ja/elektronika/ds18b20.pdf napisałem kod. Lecz niestety on niedziała (nie odczytuje temperatury tylko wskazuje temp1 i temp2 równe 255, natomiast wykrywa urządzenie) czy mógłby ktoś wskazać błąd? #ifndef F_CPU #define F_CPU 16000000UL #endif // prędkość transmisji 9600 #define UART_BAUD_RATE 9600 #include <avr/io.h> #include <stdlib.h> #include <util/delay.h> #include <avr/interrupt.h> #include "uart.h" #define WE 6 #define PORT_1wire PIND #define SET_1wire DDRD&=~_BV(WE) #define CLEAR_1wire DDRD|=_BV(WE) #define DELAYUS(x) _delay_us(x) unsigned char reset_pulse(void){ unsigned char PRESENCE=0; CLEAR_1wire; DELAYUS(500); //500us SET_1wire; DELAYUS(30); if(bit_is_clear(PORT_1wire,WE)) {PRESENCE=1;} else {PRESENCE=0;} DELAYUS(470); if(bit_is_set(PORT_1wire,WE)) {PRESENCE=1;} else {PRESENCE=0;} return PRESENCE; } void send(char bit){ CLEAR_1wire; DELAYUS(5); if(bit==1) SET_1wire; DELAYUS(80); SET_1wire; } unsigned char read(void){ unsigned char PRESENCE=0; CLEAR_1wire; DELAYUS(2); SET_1wire; DELAYUS(15); if(bit_is_set(PORT_1wire,WE)) PRESENCE=1; else PRESENCE=0; return(PRESENCE); } void send_byte(char wartosc){ unsigned char y; unsigned char pom; for (y=0;y<8;++y){ pom = wartosc>>y; pom &= 0x01; send (pom); } DELAYUS(100); } unsigned char read_byte(void){ unsigned char y; unsigned char wartosc=0; for(y=0;y<8;++y){ if(read()) wartosc |= 0x01<<y; DELAYUS(15); } return (wartosc); } int main(void) { uart_init(UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU)); // włączenie modułu UART, ustawienie prędkości transmisji sei(); //wlaczenie obslugi przerywan uart_puts("start "); unsigned char sprawdz; char temp1=0; char temp2=0; char buf[10]={0,0,0,0,0,0,0,0,0,0}; while(1) { int i=0; int y=0; sprawdz=reset_pulse(); if(sprawdz){ send_byte(0xCC); send_byte(0x44); _delay_ms(750); sprawdz=reset_pulse(); send_byte(0xCC); send_byte(0xBE); temp1=read_byte(); temp2=read_byte(); sprawdz=reset_pulse(); float temp=0; temp=(float)(temp1+(temp2*256))/16; //dtostrf(temp,1,1,buf); uart_putc(temp1); uart_putc(temp2); uart_putc('\n'); _delay_ms(200); } else{ uart_puts("\npresence: "); uart_putc(sprawdz); _delay_ms(750); } } } Bardzo proszę o pomoc. Link do komentarza Share on other sites More sharing options...
Harnas Kwiecień 6, 2012 Udostępnij Kwiecień 6, 2012 Tu masz sprawdzony kod http://hobby.abxyz.bplaced.net/index.php?pid=4&aid=8 Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »