DS18B20 + ATmega8

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
zecer
-
Posty: 18
Rejestracja: 18 wrz 2011, 13:39
Lokalizacja: białystok

DS18B20 + ATmega8

Post autor: zecer » 23 wrz 2011, 20:55

Witam
Próbuje napisac program który bedzie sterowal optotriakiem i triakiem do ktorego podlaczona bedzie grzalka i dioda led w zależności od temperatury z czujnika DS18B20.
Uklad ma utrzymac stala temperature podana w zmiennej czyli ponizej tej temp. grzalka grzeje a dioda sie pali , powyzej tej temp. dioda gasnie , grzalka rownież.
Czujnik podpięty pod port PD0 , optotriak(sterowany masa) pod PB1 , dioda led pod PB0
pliki main.c, ds18b20.c, ds18b20.h (kod zaczerpnięty z kursu abxyz)

Problem polega na tym ze zupelnie nic sie nie dzieje , obojetnie jakiej temperatury bym nie ustawil, oto kod.

ds18b20.h

Kod: Zaznacz cały

/*
   Plik ds18b20.h

   (xyz.isgreat.org)  
*/

#ifndef DS18B20_H
#define DS18B20_H

/* DS18B20 przyłączony do portu  PD0 AVRa  */
#define SET_ONEWIRE_PORT     PORTD  |=  _BV(0)
#define CLR_ONEWIRE_PORT     PORTD  &= ~_BV(0)
#define IS_SET_ONEWIRE_PIN   PIND   &   _BV(0)
#define SET_OUT_ONEWIRE_DDR  DDRD   |=  _BV(0)
#define SET_IN_ONEWIRE_DDR   DDRD   &= ~_BV(0)

unsigned char ds18b20_ConvertT(void);
int ds18b20_Read(unsigned char []);
void OneWireStrong(char);
unsigned char OneWireReset(void);
void OneWireWriteByte(unsigned char);
unsigned char OneWireReadByte(void);

#endif
ds12b20.c

Kod: Zaznacz cały

/*
   Plik ds18b20.c
   (minimum kodu do odczytu temperatury z ds18b20)

   xyz.isgreat.org
*/

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


/**********************************************************/

unsigned char ds18b20_ConvertT(void)
{
  if (!OneWireReset()) return 0;

  OneWireWriteByte(0xcc); // SKIP ROM
  OneWireWriteByte(0x44); // CONVERT T

  return -1;
}

/***********************************************************/

int ds18b20_Read(unsigned char scratchpad[])
{
  unsigned char i;    

  if (!OneWireReset()) return 0;

  OneWireWriteByte(0xcc); // SKIP ROM
  OneWireWriteByte(0xbe); // READ SCRATCHPAD

  for(i=0; i<9; i++) scratchpad[i] = OneWireReadByte();
 
  return 1;
}

/**********************************************************/

void OneWireStrong(char s)
{
  if (s)
  {
     SET_ONEWIRE_PORT; 
     SET_OUT_ONEWIRE_DDR; 
  }
  else
  {
     SET_IN_ONEWIRE_DDR; 
  }
}

/**********************************************************/

unsigned char OneWireReset()
{
  CLR_ONEWIRE_PORT; 

  if (!(IS_SET_ONEWIRE_PIN)) return 0;  

  SET_OUT_ONEWIRE_DDR; 
  _delay_us(500);
  SET_IN_ONEWIRE_DDR; 
  _delay_us(70);

  if(!(IS_SET_ONEWIRE_PIN))
  {
    _delay_us(500);
    return(1);
  }

  _delay_us(500);

return(0);
}

/**********************************************************/

void OneWireWriteByte(unsigned char byte)
{
   unsigned char i;

   CLR_ONEWIRE_PORT; 

   for (i=0; i<8; i++)
   {
     SET_OUT_ONEWIRE_DDR; 

     if (byte & 0x01)
     {
       _delay_us(7);
       SET_IN_ONEWIRE_DDR; 
       _delay_us(70);
     }
     else
     {
        _delay_us(70);
        SET_IN_ONEWIRE_DDR; 
        _delay_us(7);
     }

     byte >>= 1;
   }
}

/***********************************************************/

unsigned char OneWireReadByte(void)
{
  unsigned char i, byte = 0;

  SET_IN_ONEWIRE_DDR; 
  
  for (i=0; i<8; i++)
  {
     SET_OUT_ONEWIRE_DDR; 
     _delay_us(7);
     SET_IN_ONEWIRE_DDR; 
     _delay_us(7);
     byte >>= 1;
     
     if(IS_SET_ONEWIRE_PIN) byte |= 0x80;

     _delay_us(70);
  }

  return byte;
}
main.c

Kod: Zaznacz cały

#define F_CPU 1000000L
#include <avr/io.h>
#include <util/delay.h> 
#include <stdlib.h>
#include <compat/deprecated.h>
#include <stdio.h>
#include "ds18b20.h"

const double temperatura = 70; //temperatura jaka ma byc utrzymana

int main(void)
{

	sbi(DDRB,PB0);
	sbi(DDRB,PB1);
	
  /* Zmienna przechowuje aktualną wartość temperatury */        
  double temp;
  /* W tablicy zapisywane będą dane odczytane z układu ds18b20 */
  unsigned char ds18b20_pad[9];
 

  while(1)
  {
    /* Funkcja 'ds18b20_ConvertT' wysyła do układu ds18b20 
       polecenie pomiaru */    
 
     if(ds18b20_ConvertT())
    {
		

       /* 750ms - czas konwersji */
       _delay_ms(750);

      /* Odczyt z układu ds18b20, dane zapisywane są w tablicy ds18b20_pad. 
         Dwie pierwsze pozycje w tablicy to kolejno mniej znaczący bajt i bardziej 
     znaczący bajt wartość zmierzonej temperatury */            
       ds18b20_Read(ds18b20_pad);
          
      /* Składa dwa bajty wyniku pomiaru w całość. Cztery pierwsze bity mniej
         znaczącego bajtu to część ułamkowa wartości temperatury, więc całość
         dzielona jest przez 16 */       
       temp = ((ds18b20_pad[1] << 8) + ds18b20_pad[0]) / 16.0 ;
	   
	   if(temp<=temperatura)
			{
			sbi(PORTB,PB0); //wlacz diode
			cbi(PORTB,PB1); //triak ON
			}
		else if(temp>temperatura)
			{
			cbi(PORTB,PB0); //dioda off
			sbi(PORTB,PB1); //triak off
			}
	   
      
		_delay_ms(4000);

      
    }
  }
}
[/code]

ODPOWIEDZ