DS18B20 w AVT3505- czy komus sie udało uruchomić?

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
gadula88
-
Posty: 4
Rejestracja: 15 kwie 2006, 22:15

DS18B20 w AVT3505- czy komus sie udało uruchomić?

Post autor: gadula88 » 21 maja 2006, 12:43

Już myślałem że więcej nie będę wam zawracać głowy, a jednak :wink: Od kłopotów z LCD, nauczyłem się korzystać z wielu rzeczy (PWM, UART, serwa, ADC itp), ale za nic nie mogę uruchomić układu DS18b20. Korzystam z tego programu:

Kod: Zaznacz cały

#include <avr/io.h> 
#include "lcd.h" 

#define OW_PIN  PD1 
#define OW_IN   PIND 
#define OW_OUT  PORTD 
#define OW_DDR  DDRD 

#define OW_GET_IN()   ( OW_IN & (1<<OW_PIN)) 
#define OW_OUT_LOW()  ( OW_OUT &= (~(1 << OW_PIN)) ) 
#define OW_OUT_HIGH() ( OW_OUT |= (1 << OW_PIN) ) 
#define OW_DIR_IN()   ( OW_DDR &= (~(1 << OW_PIN )) ) 
#define OW_DIR_OUT()  ( OW_DDR |= (1 << OW_PIN) )

#define F_CPU 8000000ul


void delay_us(unsigned int us); 

void delay_ms(unsigned int ms);

void delay_us(unsigned int us) //parametr t od 0 do 255. 
{ 
do{asm("nop");}while(--us); 
}  

void delay_ms(unsigned int ms) 

{ 

            unsigned int i; 

            for (i=0;i<ms;i++) 

                        { 

                        delay_us(999); 

                        asm volatile ( 

                        "WDR"::); 

                                               } 

}



unsigned char ow_reset(void) 
   { 
   uint8_t err=1; 
   OW_DIR_OUT(); 
    OW_OUT_LOW(); 
    
   delay_us(480); 

   OW_DIR_IN(); 
    
   delay_us(70); 
   //err = OW_GET_IN(); 
   if (bit_is_clear(OW_IN,OW_PIN)) {err=0;} 
   delay_us(410); 

return err; 
} 


unsigned char ow_read_bit(void) 
   { 
    
   uint8_t b=1; 
      OW_DIR_OUT(); 
   OW_OUT_LOW(); 
   delay_us(6); 
   OW_DIR_IN(); 
   delay_us(9); 
   //b = OW_GET_IN(); 
   if (bit_is_clear(OW_IN,OW_PIN)) {b=0;} 
   delay_us(55); 
   return b; 
   } 


void ow_write_bit(char b) 
   { 
    
   if (b) 
   { 
   OW_DIR_OUT(); 
   OW_OUT_LOW(); 
    
   delay_us(6); 
   OW_DIR_IN(); 
   delay_us(64); 
   } 
   else 
   { 
   OW_DIR_OUT(); 
   OW_OUT_LOW(); 
    
   delay_us(60); 
   OW_DIR_IN(); 
   delay_us(10); 
   } 
} 

void ow_write_byte(char data) 
{ 
unsigned char i, temp; 
for(i=0;i<8;i++) 
   { 
   temp=data>>1; 
   temp &= 0x01; 
   ow_write_bit(temp); 
    
   } 
} 

unsigned char ow_read_byte (void) 
{ 
unsigned char i; 
unsigned char value=0; 
   for (i=0;i<8;i++) 
   { 
   if(ow_read_bit()) value |= 0x01<<i; 
   delay_us(6); 
   } 
return (value); 
} 

void lcd_putuint8(uint8_t a){ 
        uint8_t z; 
        z = a  / 100; 
        if (z) lcd_putc(z + 0x30); 
        a -= z * 100; 
        z = a / 10; 
        if (z) lcd_putc(z + 0x30); 
        a -= z * 10; 
        lcd_putc(a + 0x30); 

} 


int main (void) 
{ 
 uint8_t n; 
char dat[9]; 

lcd_init(LCD_DISP_ON); 
lcd_puts("Test HD44780"); 
delay_ms(1500); 
lcd_clrscr(); 


    
    
if (!ow_reset()) 
{ 
lcd_puts("OK"); 
delay_ms(1500); 
lcd_clrscr(); 

      ow_reset(); 
      ow_write_byte(0x33); 
      for (n=0;n<8;n++) { dat[n]=ow_read_byte();} 
       
      for (n=0;n<8;n++) 
         { 
         lcd_putuint8(dat[n]); 
         if (n==3) { lcd_puts("\n");} 
         else lcd_puts(" "); 
         } 

} 
else 
{ 
lcd_puts("Brak czujnika"); 
delay_ms(1500); 
lcd_clrscr(); 
} 

return(0); 
}
No i podłączałem dwa różne czujniki (trzy przewody: GND, VCC i DATA, rezystor 4,7k między VCC i DATA), ale dostaję tylko osiem razy 255. Jeszcze jednego czujnika nie mam, ale wątpię aby oba były wadliwe. Czy ktoś ma może działający program do tego czujnika? Bo za nic nie mogę go uruchomić, strach pomyśleć co będzie jak przyjedzie do mnie LCD z 3310 :neutral:

Z pozdrowieniami
gadula88

ODPOWIEDZ