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);
#endifKod: 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;
}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);
}
}
}