DS18B20 + DS1307 не получается объединить ...
|
|
RYZHIK | Дата: Пятница, 19.10.2012, 22:07 | Сообщение # 1 |
 Рядовой
Группа: Пользователи
Сообщений: 5
Статус: 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); } }
|
|
| |
HiSER | Дата: Суббота, 20.10.2012, 21:23 | Сообщение # 2 |
 Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Статус: Offline
| Без лога ошибок ни чего не понятно... Первое что бросилось в глаза, i2c.h и 1wire.h и используют совтовую реализацию протокола им требуется указать пины для работы. Указываются пины ассемблерной вставкой: #asm ...... #endasm
Сообщение отредактировал HiSER - Суббота, 20.10.2012, 21:24 |
|
| |
RYZHIK | Дата: Понедельник, 22.10.2012, 02:11 | Сообщение # 3 |
 Рядовой
Группа: Пользователи
Сообщений: 5
Статус: 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
Статус: Offline
| тут есть моя статья с примером без использования float.
|
|
| |
RYZHIK | Дата: Четверг, 25.10.2012, 23:45 | Сообщение # 5 |
 Рядовой
Группа: Пользователи
Сообщений: 5
Статус: 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
Статус: Offline
| if ((a==1) && (b==0)) { ... } if (a==1 && b==0) { ... }Добавлено (26.10.2012, 08:47) --------------------------------------------- && - И для условий & - И для битовых операций || - ИЛИ для условий | - ИЛИ для битовых операций ! - НЕ для условий ~ - НЕ для битовых операций ^ - исключающее ИЛИ
|
|
| |
RYZHIK | Дата: Пятница, 26.10.2012, 09:48 | Сообщение # 7 |
 Рядовой
Группа: Пользователи
Сообщений: 5
Статус: Offline
| Благодарю )))
|
|
| |