Witam
Niedawno postanowiłem zrobić termometr na Atmedze8, podpiąłem wyświetlacz LCD, zaprogramowałem (posiłkując się Link) i działa. Następnie zakupiłem DS18B20 i tu zaczęły się schody - ciągle pojawia mi się 127.9 na wyświetlaczu, po odpięciu czujnika pokazuje się -0.1 więc wnioskuję, ęe jest odczyt z czujnika. Czujnik mam podpięty przez opornik 4,7 kΩ (połączyłem tak jak w tym linku podłączenie - schemat drugi). Obecnie Atmega działa na wewnętrzym kwarcu 4Mhz. Czy mogłby ktoś zerknąć na poniższy kod i wskazać ewentualne błędy? Wiem, że podobny temat był już nie raz poruszany ale szukałem mn w tych tematach:
Link1
Link2
Link3
i niestety dalej nic
Oto mój kod:
Portu D używam do połączenia z wyświetlaczem lcd, w pliku "lcd.c" mam obsługe wyświetlania i to działa bez problemu
DS18B20 jest podpięty do portu B pin 0
Siedzę z tym już parę dni i nic...
inventco.eu - temat poprawiłem - regulamin p.7.2
Niedawno postanowiłem zrobić termometr na Atmedze8, podpiąłem wyświetlacz LCD, zaprogramowałem (posiłkując się Link) i działa. Następnie zakupiłem DS18B20 i tu zaczęły się schody - ciągle pojawia mi się 127.9 na wyświetlaczu, po odpięciu czujnika pokazuje się -0.1 więc wnioskuję, ęe jest odczyt z czujnika. Czujnik mam podpięty przez opornik 4,7 kΩ (połączyłem tak jak w tym linku podłączenie - schemat drugi). Obecnie Atmega działa na wewnętrzym kwarcu 4Mhz. Czy mogłby ktoś zerknąć na poniższy kod i wskazać ewentualne błędy? Wiem, że podobny temat był już nie raz poruszany ale szukałem mn w tych tematach:
Link1
Link2
Link3
i niestety dalej nic
Oto mój kod:
#include <util/delay.h>
#include <avr/io.h>
#include "lcd.c"
#define PIN_1WIRE 0
#define PORT_1WIRE PINB
#define OUT_1WIRE_LOW PORT_1WIRE&=~(1<<PIN_1WIRE);
#define OUT_1WIRE_HIGH PORT_1WIRE|=1<<PIN_1WIRE;
#define DIR_1WIRE_IN DDRB&=~(1<<PIN_1WIRE);
#define DIR_1WIRE_OUT DDRB|=1<<PIN_1WIRE;
#define F_CPU 4000000UL
void delayus(unsigned int __count)
{
__asm__ volatile (
"1: sbiw %0,1" "\n\t"
"brne 1b"
: "=w" (__count)
: "0" (__count)
);
}
unsigned char uc_1Wire_ResetPulse(void)
{
unsigned char ucPresenceImpulse;
OUT_1WIRE_LOW;
DIR_1WIRE_OUT;
delayus(500);
DIR_1WIRE_IN;
delayus(30);
if(bit_is_clear(PORT_1WIRE,PIN_1WIRE))
ucPresenceImpulse = 1;
else
ucPresenceImpulse = 0;
delayus(470);
if(bit_is_set(PORT_1WIRE,PIN_1WIRE))
ucPresenceImpulse = 1;
else
ucPresenceImpulse = 0;
return ucPresenceImpulse;
}
void v1Wire_SendBit(char cBit)
{
DIR_1WIRE_OUT;
delayus(5);
if(cBit == 1)
DIR_1WIRE_IN;
delayus(80);
DIR_1WIRE_IN;
}
unsigned char uc1Wire_ReadBit(void)
{
unsigned char ucBit;
DIR_1WIRE_OUT;
delayus(2);
DIR_1WIRE_IN;
delayus(15);
if(bit_is_set(PORT_1WIRE,PIN_1WIRE))
ucBit = 1;
else
ucBit = 0;
return ucBit;
}
void v1Wire_SendByte(char ucByteValue)
{
unsigned char ucCounter;
unsigned char ucValueToSend;
for(ucCounter =0;ucCounter <8;ucCounter++)
{
ucValueToSend = ucByteValue>>ucCounter;
ucValueToSend &= 0x01;
v1Wire_SendBit(ucValueToSend);
}
delayus(100);
}
unsigned char uv1Wire_ReadByte(void)
{
unsigned char ucCounter;
unsigned char ucReadByte = 0;
for(ucCounter=0;ucCounter<8;ucCounter++)
{
if(uc1Wire_ReadBit())
ucReadByte |= 0x01<<ucCounter;
delayus(15);
}
return ucReadByte;
}
int main(void)
{
DDRD=0xFF;
unsigned char ucReset;
char cTempH =0, cTempL =0;
float fTemp = 0;
lcd_init(LCD_DISP_ON);
lcd_puts("Rozpoczecie \n programu");
char w_temp[16] ="{0}";
_delay_ms(1000);
while(1)
{
lcd_clrscr();
lcd_puts("zaczynam odzyt\ntemperatury");
_delay_ms(500);
ucReset = uc_1Wire_ResetPulse();
if(ucReset == 1)
{
v1Wire_SendByte(0xCC);
v1Wire_SendByte(0x44);
_delay_ms(750);
ucReset = uc_1Wire_ResetPulse();
v1Wire_SendByte(0xCC);
v1Wire_SendByte(0xBE);
cTempL = uv1Wire_ReadByte();
cTempH = uv1Wire_ReadByte();
ucReset = uc_1Wire_ResetPulse();
fTemp = (float)(cTempL+(cTempH<<8))/16;
dtostrf(fTemp,1,1,w_temp);
lcd_clrscr();
lcd_puts(w_temp);
_delay_ms(2000);
}
else
{
lcd_clrscr();
lcd_puts("Brak odczytu");
}
_delay_ms(1000);
}
}Portu D używam do połączenia z wyświetlaczem lcd, w pliku "lcd.c" mam obsługe wyświetlania i to działa bez problemu
DS18B20 jest podpięty do portu B pin 0
Siedzę z tym już parę dni i nic...
inventco.eu - temat poprawiłem - regulamin p.7.2