f
Warning: Cannot modify header information - headers already sent by (output started at /home/anderian/ftp/www_forum/db/mysql4.php:1) in /home/anderian/ftp/www_forum/includes/sessions.php on line 548

Warning: Cannot modify header information - headers already sent by (output started at /home/anderian/ftp/www_forum/db/mysql4.php:1) in /home/anderian/ftp/www_forum/includes/sessions.php on line 549

Warning: Cannot modify header information - headers already sent by (output started at /home/anderian/ftp/www_forum/db/mysql4.php:1) in /home/anderian/ftp/www_forum/includes/page_header.php on line 343
And-Tech :: Zobacz temat - [C] Problem z DS18B20

Strona korzysta z plików cookie w celu realizacji usług zgodnie z Politykš prywatnoœci.

Możesz okreœlić warunki przechowywania lub dostępu do cookie w Twojej przeglšdarce lub konfiguracji usługi.

And-Tech Strona Główna And-Tech
Forum firmy And-Tech

FAQFAQ  SzukajSzukaj  UżytkownicyUżytkownicy  GrupyGrupy
RejestracjaRejestracja  ZalogujZaloguj  AlbumAlbum  DownloadDownload

Poprzedni temat «» Następny temat
[C] Problem z DS18B20
Autor Wiadomość
simoon87 

Wiek: 29
Dołączył: 07 Mar 2010
Posty: 8
Skąd: Bydgoszcz
Wysłany: Pon Lis 15, 2010 9:30 pm   [C] Problem z DS18B20

Witam, mam problem z obsługą termometry DS18B20. Program kompiluje się bez błędu, po wgraniu na wyświetlaczu pokazuje się -1.0 . Proszę o sprawdzenie kodu bo już nie wiem co jest nie tak ;/

DS18B20.H
Kod:

#ifndef ds18b20
#define ds18b20

#define WE    0
#define PORT_1WIRE    PINC
#define SET_1WIRE    DDRC &= ~_BV(WE)
#define CLEAR_1WIRE    DDRC |= _BV(WE)

void delayms(long t);
void delayus(long t);
unsigned char RESET_PULSE(void);
void send(char bit);
void send_byte(char wartosc);
unsigned char read(void);
unsigned char read_byte(void);

#endif


DS18B20.C
Kod:

#include <avr/io.h>
#include <util/delay.h>
#include "ds18b20.h"

/***************************************        Opoznienia        **********************************/

void delayms(long t)
{
    while(t)
    {
        _delay_ms(10);
        t--;
    }
}
void delayus(long t)
{
    while(t)
    {
        _delay_us(1);
        t--;
    }
}

/***************************************    Magistrala 1-wire     **********************************/
   
unsigned char RESET_PULSE(void)        ////reset magistrali i oczekiwanie na impuls PRESENCE
{
    char PRESENCE;
    CLEAR_1WIRE;                    //magistrala - stan niski
    delayus(500);
    SET_1WIRE;                        //magastrala - stan wysoki
    delayus(30);                    //oczekiwanie na stan niski od DS
   
    if(bit_is_clear(PORT_1WIRE, WE))//sprawdzamy stan linii (LOW)
    {
        PRESENCE = 1;                //1 - odebrano bit
    }
    else
    {
        PRESENCE = 0;                //0 - stan nieaktywny
    }
   
    delayus(470);                    //MASTER na stan wysoki od DS
   
    if(bit_is_set(PORT_1WIRE, WE))    //sprawdza stan linii (HIGH)
    {
        PRESENCE = 1;
    }
    else
    {
        PRESENCE=0;
    }
    return(PRESENCE);                //zwraca wartosc funkcji
}

void send(char bit)                    ////wysyłanie pojedynczego bitu do DS
{
    CLEAR_1WIRE;
    delayus(5);

    if(bit == 1)
    {
        SET_1WIRE;                    //zwolnienie magistrali - wysylanie 1
        delayus(80);                //przetrzymanie
        CLEAR_1WIRE;                //wysylanie zera
    }
}

void send_byte(char wartosc)        ////wysyla caly bajt na magistrale
{
    unsigned char i=0;                //zmienna licznikowa
    unsigned char pom;                //pomocnicza

    for(i=0; i<8; i++)
    {
        pom = wartosc>>i;            //przesuniecie bitowe
        pom = 0x01;                    //skopiowanie bitu do zmiennej pomocniczej
        send(pom);                    //wyslanie bitu na magistrale
    }
    delayus(100);
}

unsigned char read(void)            ////zczytuje bit z magistralii
{
    unsigned char PRESENCE = 0;

    CLEAR_1WIRE;                    //ustawienie w stan niski DS
    delayus(2);                        //oczekiwanie
    SET_1WIRE;                        //zwolnienie magistrali
    delayus(15);                    //oczeliwanie

    if(bit_is_set(PORT_1WIRE, WE))    //odbior 1 lub 0
    {
        PRESENCE = 1;
    }
    else
    {
        PRESENCE = 0;
    }
    return(PRESENCE);                //zwracanie wartosci funkcjii
}

unsigned char read_byte(void)        ////zczytuje bajt z magistralii
{
    unsigned char i = 0;            //zmienna licznikowa
    unsigned char wartosc = 0;        //pomocnicza

    for(i=0; i<8; i++)
    {
        if(read())
        {
            wartosc |= 0x01<<i;        //zczystywanie po jednym bicie
        }
        delayus(15);
    }
    return(wartosc);                //zwrot wartosci funkcjii           
}


MAIN.C
Kod:

#define F_CPU 16000000L
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include "hd44780.h"
#include "ds18b20.h"

/***************************************    Zmienne i prototypy     **********************************/
void sys_init(void);

char buf[8];

/***************************************        Program glowny        **********************************/
void main(void)
{
    unsigned char sprawdz;
    char LSB = 0, MSB = 0;

    sys_init();
    for(;;)
    {
        sprawdz = RESET_PULSE();
        if(sprawdz)
        {
            send_byte(0xCC);        //SKIP ROM
            send_byte(0x44);        //CONVERT T
            delayms(75);            //oczekiwanie - czas konwersji
           
            sprawdz = RESET_PULSE();//wysylanie sygnalu reset
            send_byte(0xCC);        //SKIP ROM
            send_byte(0xBE);        //READ SCRATCHPAD

            LSB = read_byte();        //odczyta czesci mlodszej
            MSB = read_byte();        //odczyta czesci starszej

            sprawdz = RESET_PULSE();//zwolnienie magistrali
           
            float temp = 0;
            temp = (float)(LSB | (MSB<<8));
                       
            dtostrf(temp,1,1,buf);    //konswersja FLOAT na STRING
            LCD_LOCATE(0,0);
            lcd_puts(buf);
            delayms(100);
        }
    }
}

/***************************************        Funkcje         **********************************/
void sys_init(void)
{
    lcd_init();
    LCD_DISPLAY(LCDDISPLAY);
    LCD_CLEAR;
    LCD_LOCATE(0,0);
}
[/code]
 
 
     
Josep 

Dołączył: 29 Maj 2013
Posty: 3
Wysłany: Sro Maj 29, 2013 1:16 pm   

Na wstępie przepraszam że odkopuję ale autor nie napisał czy rozwiązał problem.
Miałem podobny problem wystarczy w kodzie w main.c w linii
Kod:
delayms(75);

zamienić na
Kod:
delayms(750);
. Problem wynika z krótkiego czasu na zamianę a DS18B20 wymaga najlepiej 750ms
 
     
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group