Суббота, 20.04.2024, 02:31
Микроконтроллерная техника AVR
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Микроконтроллеры » Вопросы по статьям » DS18B20 + DS1307 не получается объединить ...
DS18B20 + DS1307 не получается объединить ...
RYZHIKДата: Пятница, 19.10.2012, 22:07 | Сообщение # 1
Рядовой
Группа: Пользователи
Сообщений: 5
Репутация: 0
Статус: Offline
У меня возникла проблема при объединение DS18B20 + DS1307 + Atmega32. Так как я скажем не самый крутой программист то стараюсь использовать стандартные библиотеки CVAVR и не копаюсь в них а уж тем более не знаю как их переписывать или дописывать. При компиляции сей кода выдает ошибку ... Как я понял из за не совпадения типа данных ... Для правильной работы sprintf в настройках проекта надо установить тип данных float после применения данной настройки начинает ругаться библиотека math.h как я понял она у меня вступает в игру когда я хочу сделать преобразования с временем перед выводом на экран ...

Не знаю как объяснить лучше )))

Быть может кто нибудь сталкивался с такой проблемой и знает еще решении очень надеюсь на братья мои разработчики )))

Code

#include <mega32a.h>
#include <i2c.h>
#include <ds1307.h>
#include <1wire.h>
#include <ds18b20.h>
#include <alcd.h>
#include <stdio.h>
#include <delay.h>

char lcd_buffer[20];
char LcdBuffDevices[20];
unsigned char devices;
unsigned char rom_code[9];

char *str;

unsigned char hour,min,sek; //часы, минуты, секунды
unsigned char week_day,day,month,year; //день, месяц, год

void main(void)
{
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
MCUCSR=0x00;
TIMSK=0x00;
UCSRB=0x00;
ACSR=0x80;
SFIOR=0x00;
ADCSRA=0x00;
SPCR=0x00;
TWCR=0x00;

i2c_init();
w1_init();
lcd_init(20);

rtc_init(0,0,0);
rtc_set_date(1,18,10,12); //установить дату: день,месяц,год
rtc_set_time(00,00,00); //установить время: часы, минуты, секунды

devices=w1_search(0xF0,rom_code); // Узнаём количество подключенных датчиков и их индентификационный номер
sprintf(LcdBuffDevices,"Devices found %u", devices);

lcd_clear();  // Чистим LCD
lcd_gotoxy(0,2);  // Установка курсора в положение 0,0
lcd_puts(LcdBuffDevices);

ds18b20_init(&rom_code[0], 10, 120, DS18B20_12BIT_RES);

while (1)
       {
         if(devices>0)
           {               
               sprintf(lcd_buffer,"t1=%.1f C", ds18b20_temperature(&rom_code[0]));            
                
               str = ds18b20_temperature(&rom_code[0]);
                
               lcd_gotoxy(0,3);  // Установка курсора в положение 0,0
               lcd_putsf(str);   // Выводим на LCD температуру 1-го датчика
           }
     else  
           {
               lcd_gotoxy(0,3);   // Установка курсора в положение 0,3
               lcd_putsf("No temperature sensor");  // Выводим на LCD информацию об отсуствии датчиков
           };  
           
         rtc_get_time(&hour,&min,&sek); //считать время
         rtc_get_date(&week_day,&day,&month,&year); //считать дату
        
         lcd_gotoxy(0,0);
         lcd_putchar(hour/10+0x30);
         lcd_putchar(hour%10+0x30);
         lcd_putchar(':');
         lcd_putchar(min/10+0x30);
         lcd_putchar(min%10+0x30);
         lcd_putchar(':');
         lcd_putchar(sek/10+0x30);
         lcd_putchar(sek%10+0x30);
         lcd_gotoxy(0,1);
         lcd_putchar(day/10+0x30);
         lcd_putchar(day%10+0x30);
         lcd_putchar('-');
         lcd_putchar(month/10+0x30);
         lcd_putchar(month%10+0x30);
         lcd_putchar('-');
         lcd_putchar(year/10+0x30);
         lcd_putchar(year%10+0x30);
          
         delay_ms(100);
       }
}


sad
 
HiSERДата: Суббота, 20.10.2012, 21:23 | Сообщение # 2
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
Без лога ошибок ни чего не понятно...
Первое что бросилось в глаза, i2c.h и 1wire.h и используют совтовую реализацию протокола им требуется указать пины для работы.
Указываются пины ассемблерной вставкой:
#asm
......
#endasm


Сообщение отредактировал HiSER - Суббота, 20.10.2012, 21:24
 
RYZHIKДата: Понедельник, 22.10.2012, 02:11 | Сообщение # 3
Рядовой
Группа: Пользователи
Сообщений: 5
Репутация: 0
Статус: Offline
Вот ссылка на мой проект http://rghost.ru/download/41080777/1d6dffb885e42c0c2fad476cd4e95d53e924453f/DS18B20%20%20%20DS1307.zip

Предчувствие говорит мне что начало проблемы исходит из настроек проекта во вкладке C Compiler => Code Generation => (s)printf Features ... для преобразования температуры (как я понял) в строковый вид должно стоять Float, width но в этом случает вылезает ошибка Math.h и т.п. , иначе температурный датчик не пашет (((

Наверно "проблема" в этих строчках:

sprintf(lcd_buffer,"t1=%.1f C", ds18b20_temperature(&rom_code[0])); - преобразование температуры

lcd_putchar(hour/10+0x30); - преобразование часов

Сам я не программист а электронщик и то начинающий ... от себя могу сказать что как я понял мне нужен или другой вариант перевода температуры в строковый вид для вывода на LCD или же по другому преобразовывать время и дату от часиков.

Тут люди шаристые сидят особенно ты HiSER, так что вся надежда на вас ...
 
HiSERДата: Понедельник, 22.10.2012, 11:53 | Сообщение # 4
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
тут есть моя статья с примером без использования float.
 
RYZHIKДата: Четверг, 25.10.2012, 23:45 | Сообщение # 5
Рядовой
Группа: Пользователи
Сообщений: 5
Репутация: 0
Статус: Offline
HiSER, к тебе ещё нубский вопросик есть можешь мне написать простое условие сравнения а то я и так и сяк пробовал че то не получается ни как ...

unsigned char a = 1;
unsigned char b = 0;

if ((a == 1)&&(b == 0)) { ... }

if ((a == 1)&(b == 0)) { ... }

if (a == 1&&b == 0) { ... }

if (a == 1&b == 0) { ... }

какая конструкция правильная подскажи пожалуйста )))
 
HiSERДата: Пятница, 26.10.2012, 08:47 | Сообщение # 6
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
if ((a==1) && (b==0)) { ... }
if (a==1 && b==0) { ... }

Добавлено (26.10.2012, 08:47)
---------------------------------------------
&& - И для условий
& - И для битовых операций
|| - ИЛИ для условий
| - ИЛИ для битовых операций
! - НЕ для условий
~ - НЕ для битовых операций
^ - исключающее ИЛИ

 
RYZHIKДата: Пятница, 26.10.2012, 09:48 | Сообщение # 7
Рядовой
Группа: Пользователи
Сообщений: 5
Репутация: 0
Статус: Offline
Благодарю )))
 
Форум » Микроконтроллеры » Вопросы по статьям » DS18B20 + DS1307 не получается объединить ...
  • Страница 1 из 1
  • 1
Поиск:

Хостинг от uCoz