Не могу подключить датчик DS18b20 с помощью библиотеки отсюда: http://chipenable.ru/index.php/programm ... tvami.html.
Контроллер не видит датчик.
Код(Пожалуйста не обращайте внимания на большое количество прерываний
Код: Выделить всё
#define F_CPU 8000000
#define ADC_Stop (1)
#define MPX_messure (2)
#define LM_messure (3)
#define UART_data_ok (4)
#define UART_reception_ended (5)
#define UART_transfer_completed (6)
#define VS 5000
#define amount_of_messung 12
#define amount_of_sensors 3
#define BUS OWI_PIN_0
#define DS18B20_FAMILY_ID 0x28
#define DS18B20_CONVERT_T 0x44
#define DS18B20_READ_SCRATCHPAD 0xbe
#define DS18B20_WRITE_SCRATCHPAD 0x4e
#define DS18B20_COPY_SCRATCHPAD 0x48
#define DS18B20_RECALL_E 0xb8
#define DS18B20_READ_POWER_SUPPLY 0xb4
#define MAX_DEVICES 4
#define READ_SUCCESSFUL 0x00
#define READ_CRC_ERROR 0x01
#define SEARCH_SENSORS 0x00
#define SENSORS_FOUND 0xff
#include <avr/io.h>
#include <math.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include "UART_macros.h"
#include "lcd_lib.c"
#include "Bits_macros.h"
#include "1Wire\OWIPolled.h"
#include "1Wire\OWIHighLevelFunctions.h"
#include "1Wire\OWIBitFunctions.h"
#include "1Wire\common_files\OWIcrc.h"
volatile register uint8_t a asm("r8");
volatile register uint8_t n asm("r9");
volatile register uint8_t n_of_sensor asm("r10");
volatile register uint8_t i asm("r11");
volatile uint8_t Status, lng,
UART_received_Data[UART_Size_of_buf]={0x41, 0x74, 0x6d, 0x65, 0x67, 0x61, 0x33, 0x32, 0x20, 0x55, 0x41, 0x52, 0x54, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, 0x79, 0x21},//"Atmega32 UART is ready!";
UART_reception_Data[UART_Size_of_buf], rezultH, rezultL;
int A_D_C = 0;
OWI_device allDevices[MAX_DEVICES];
unsigned char rom[8];
unsigned int temperature = 0;
unsigned char num = 0;
ISR (USART_RXC_vect)
{
if (a >= UART_Size_of_buf)
{
UART_interrupt_completion_reception_wildcat;
UART_reception_wildcat;
SetBit(Status, UART_reception_ended);
a = 0;
}
else
{
UART_received_Data[a] = UDR;
a++;
}
sei();
//LCDsendChar(rc);
}
ISR (USART_TXC_vect)
{
SetBit(Status, UART_transfer_completed);
//a=0;
sei();
}
ISR (USART_UDRE_vect)
{
a++;
if(a == lng)
{
UART_interrupt_on_clean_UDR_wildcat;
UART_transfer_wildcat;
a=0;
UART_reception_allow;
UART_interrupt_completion_reception_allow;
}
else
{
UDR = UART_reception_Data[a]; //починаєм передачу чергового байта
}
sei();
}
ISR(TIMER0_OVF_vect)
{
//ADCSR = (1<<ADSC);
if (i >= 2)
{
i = 0;
ADMUX |= (1<<REFS0);
switch (n_of_sensor)
{
case 0:
ADMUX |= (0<<MUX0) | (0<<MUX1) | (0<<MUX2) | (0<<MUX3);
break;
case 1:
ADMUX |= (1<<MUX0) | (0<<MUX1) | (0<<MUX2) | (0<<MUX3);
break;
case 2:
ADMUX |= (0<<MUX0) | (1<<MUX1) | (0<<MUX2) | (0<<MUX3);
break;
}
ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADIE) | (1<<ADPS1) | (1<<ADPS0);
n ++;
}
else
{
i ++;
}
sei();
}
ISR(ADC_vect)
{
/*rezultL=ADCL;
rezultH=ADCH;*/
A_D_C = ADC;
if (i == 0)
{
SetBit(Status, ADC_Stop);
}
sei();
}
unsigned char DS18B20_ReadTemperature(unsigned char bus, unsigned char * id, unsigned int* temperature)
{
unsigned char scratchpad[9];
unsigned char i;
OWI_DetectPresence(bus);
OWI_MatchRom(id, bus);
OWI_SendByte(DS18B20_CONVERT_T ,bus);
while (!OWI_ReadBit(bus));
OWI_DetectPresence(bus);
OWI_MatchRom(id, bus);
OWI_SendByte(DS18B20_READ_SCRATCHPAD, bus);
for (i = 0; i<=8; i++){
scratchpad[i] = OWI_ReceiveByte(bus);
}
if(OWI_CheckScratchPadCRC(scratchpad) != OWI_CRC_OK){
return READ_CRC_ERROR;
}
*temperature = (unsigned int)scratchpad[0];
*temperature |= ((unsigned int)scratchpad[1] << 8);
return READ_SUCCESSFUL;
}
int main(void)
{
//*******UART
DDRB |= 1<<0;
UBRRH = 0x00;
UBRRL = 51;
lng = strlen(UART_reception_Data);
UART_transfer_allow;
UDR = UART_received_Data[0];
UART_interrupt_on_clean_UDR_allow;
a = 0;
//******АЦП
ADMUX |= (1<<REFS0);
ADCSRA |= (1<<ADEN) | (0<<ADSC) | (1<<ADIE) | (1<<ADPS1) | (1<<ADPS0);
n = 0;
n_of_sensor = 0;
float messure_sum[amount_of_messung];
/*for (uint8_t j = 0; j < amount_of_messung; j ++)
{
messure_sum[j] = 0
}*/
//******PORTS
DDRD = 0b00000010;
//*******LCDmonitor
//*
LCDinit();
LCDclr();
LCDhome();
//LCDstring("WER", 3);
//*/
//*****Timer0
TCCR0 = (1 << CS12) | (0 << CS11) | ( 1 << CS10);
TIMSK = (1 << TOIE0);
TCNT0 = 0;
i = 0;
//*****DS18B20
OWI_Init(BUS);
OWI_SearchDevices(allDevices, MAX_DEVICES, BUS, &num);
unsigned int temperature = 0;
unsigned char searchFlag = SEARCH_SENSORS;
unsigned char crcFlag = 0;
unsigned char num = 0;
//*****
sei();
while(1)
{
char myStg[10];
/*unsigned int temperature = 0;
DS18B20_ReadTemperature(BUS, allDevices[0].id, &temperature);
sprintf(myStg, "t=%i", temperature);
LCDGotoXY(0, 0);
LCDstring(myStg, 3);*/
/*-флаг сброшен - выполнить поиск 1Wire устройств
-если количество заданных устройсв совпадает с
колличеством найденных - устанавливаем флаг,
чтобы функция поиска больше не запускалась
-отобразить количество найденных устройств*/
if (searchFlag == SEARCH_SENSORS){
num = 0;
crcFlag = OWI_SearchDevices(allDevices, MAX_DEVICES, BUS, &num);
//LCDGotoXY(14,1);
if (crcFlag = SEARCH_CRC_ERROR)
{
LCDstring("JOPE", 4);
}
//BCD_1Lcd(num);
if ((num == MAX_DEVICES)&&(crcFlag != SEARCH_CRC_ERROR)){
searchFlag = SENSORS_FOUND;
}
}
/*считать температуру первого найденного датчика
если возвращена ошибка CRC, вывести строку "not"
и сбросить флаг, чтобы функция поиска снова произвела
опрос шины*/
LCDGotoXY(0,1);
crcFlag = DS18B20_ReadTemperature(BUS, allDevices[0].id, &temperature);
if (crcFlag != READ_CRC_ERROR){
//DS18B20_PrintTemperature(temperature);
DS18B20_ReadTemperature(BUS, allDevices[0].id, &temperature);
sprintf(myStg, "t=%i", temperature);
LCDGotoXY(0, 0);
LCDstring(myStg, 3);
}
else{
LCDstring(" fot ", 3);
searchFlag = SEARCH_SENSORS;
}
/*считать температуру второго найденного датчика
если возвращена ошибка CRC, вывести строку "not"
и сбросить флаг, чтобы функция поиска снова произвела
опрос шины*/
LCDGotoXY(7,1);
crcFlag = DS18B20_ReadTemperature(BUS, allDevices[1].id, &temperature);
if (crcFlag != READ_CRC_ERROR){
//DS18B20_PrintTemperature(temperature);
sprintf(myStg, "t=%i", temperature);
LCDGotoXY(0, 1);
LCDstring(myStg, 3);
}
else{
LCDstring(" not ", 3);
searchFlag = SEARCH_SENSORS;
}
asm("NOP");
DDRC = 0xFF;
if (BitIsSet(Status, ADC_Stop))
{
cli();
messure_sum[n] = (A_D_C * VS) / 1024;
//char myStg[10];
sprintf(myStg, "n=%i", n);
//LCDGotoXY(0, 3);
//LCDstring(myStg, 4);
sprintf(myStg, "n=%i", n_of_sensor);
//LCDGotoXY(6, 3);
//LCDstring(myStg, 3);
if(n >= amount_of_messung)
{
n = 0;
float val;
for (uint8_t j = 0; j < amount_of_messung; j ++)
{
val += messure_sum[j] / amount_of_messung;
}
switch (n_of_sensor)
{
case 0:
sprintf(myStg, "P=%i", (val / 5 + 95) / 900000 * 750064);
//LCDGotoXY(0, 0);
//UART_received_Data += (uint8_t)messure_sum;
//LCDstring(myStg, 5);
n_of_sensor ++;
break;
case 1:
sprintf(myStg, "T=%i", val / 10);
//LCDGotoXY(0, 1);
//UART_received_Data += messure_sum;
//LCDstring(myStg, 5);
n_of_sensor ++;
break;
case 2:
sprintf(myStg, "V=%i", val);
//LCDGotoXY(0, 2);
//UART_received_Data += messure_sum;
//LCDstring(myStg, 5);
n_of_sensor ++;
break;
}
if (n_of_sensor >= amount_of_sensors)
{
SetBit(Status, UART_data_ok);
TCCR0 = (0 << CS12) | (0 << CS11) | ( 0 << CS10);
TCNT0 = 0;
n_of_sensor = 0;
}
}
sei();
ClearBit(Status, ADC_Stop);
}
asm("NOP");
if (BitIsSet(Status, UART_data_ok))
{
ClearBit(Status, UART_reception_ended);
ClearBit(Status, UART_data_ok);
a = 0;
UART_transfer_allow; //дозвіл на передачу
UDR = UART_received_Data[0];
UART_interrupt_on_clean_UDR_allow;
}
if (BitIsSet(Status, UART_reception_ended))
{
TCCR0 = (1 << CS12) | (0 << CS11) | ( 1 << CS10);
}
}
}
Проект в Atmel Studio 6.2:[attachment=0]Meteo3.rar[/attachment]
В чем может быть проблема?
Заранее очень благодарю :))


