Witam
Od paru dni mecze sie z napisaniem obslugi 1wire. Czujnik DS18B20 podlaczony mam na 3 przewodach (Vcc, GND i sygnal zwarty z Vcc przez rezystor 4k7). Uklad chyba zlozony jest poprawnie bo program napisany w CodeVisionAVR dziala i pokazuje dobra temperatute.
Ponizej przedstawiam program z ktorym mam klopoty, kompiluje go w WinAVR. Wyglad na to ze dziala funkcja ow_reset bo dostaje na lcd komunikat ok. Dalej probuje odczytac 64bitowy kod czujnika, niestety otrzymuje osiem wartosci 255.
Wpliku temp.c i temp.h linijki z komentarzem to inna tez bezowocna proba odwolania sie do czujnika.
Atmega8 dziala z zegarem 8Mhz (uisp -dlpt=0x378 -dprog=bsd --wr_fuse_l=0xe4)
Bede wdzieczny za pomoc w znalezieniu bledu.
plik term.c
plik term.h
plik delay.c
plik delay.h
Od paru dni mecze sie z napisaniem obslugi 1wire. Czujnik DS18B20 podlaczony mam na 3 przewodach (Vcc, GND i sygnal zwarty z Vcc przez rezystor 4k7). Uklad chyba zlozony jest poprawnie bo program napisany w CodeVisionAVR dziala i pokazuje dobra temperatute.
Ponizej przedstawiam program z ktorym mam klopoty, kompiluje go w WinAVR. Wyglad na to ze dziala funkcja ow_reset bo dostaje na lcd komunikat ok. Dalej probuje odczytac 64bitowy kod czujnika, niestety otrzymuje osiem wartosci 255.
Wpliku temp.c i temp.h linijki z komentarzem to inna tez bezowocna proba odwolania sie do czujnika.
Atmega8 dziala z zegarem 8Mhz (uisp -dlpt=0x378 -dprog=bsd --wr_fuse_l=0xe4)
Bede wdzieczny za pomoc w znalezieniu bledu.
plik term.c
#include <avr/io.h>
#include "term.h"
#include "delay.c"
#include "lcd.c"
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);
}
plik term.h
/*
#define OW_PIN PD5
#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 OW_PIN PD5
#define OW_IN PIND
#define OW_OUT PORTD
#define OW_DDR DDRD
#define OW_OUT_LOW() cbi(OW_OUT,OW_PIN)
#define OW_OUT_HIGH() sbi(OW_OUT,OW_PIN)
#define OW_DIR_IN() cbi(OW_DDR,OW_PIN)
#define OW_DIR_OUT() sbi(OW_DDR,OW_PIN)
plik delay.c
#include "delay.h"
void delay_us(unsigned int us)
{
unsigned int delay_loops;
register unsigned int i;
delay_loops = (us+3)/5*CYCLES_PER_US; // +3 for rounding up (dirty)
for (i=0; i < delay_loops; i++) {};
}
void delay_ms(unsigned int ms)
{
unsigned int i;
for (i=0;i<ms;i++)
{
delay_us(999);
asm volatile (
"WDR"::);
}
} plik delay.h
#define F_CPU 8000000 /* 1MHz zegar procesora */
#define CYCLES_PER_US ((F_CPU+500000)/1000000) /* cpu cycles per microsecond */
void delay_us(unsigned int us);
void delay_ms(unsigned int ms);