Поиск по сайту

Результаты поиска по тегам 'Ds18b20'.

  • Поиск по тегам

    Введите теги через запятую.
  • Поиск по автору

Тип публикаций


Категории и разделы

  • Вопрос-Ответ. Для начинающих
    • Песочница (Q&A)
    • Дайте схему!
    • Школьникам и студентам
    • Начинающим
    • Паяльник TV
    • Обсуждение материалов с сайта
  • Радиоэлектроника для профессионалов
    • Световые эффекты и LED
    • Роботы и модели на ДУ-управлении
    • Автоматика
    • Самодельные устройства к компьютеру
    • Программное обеспечение
    • Автомобильная электроника
    • Системы охраны и наблюдения. Личная безопасность
    • Питание
    • Электрика
    • Промышленная электроника
    • Ремонт
    • Металлоискатели
    • Измерительная техника
    • Мастерская радиолюбителя
    • Сотовая связь
    • Спутниковое ТВ
    • КВ и УКВ радиосвязь
    • Жучки
    • Телефония и фрикинг
    • Высокое напряжение
    • Идеи и технологии будущего
    • Справочная радиоэлементов
    • Литература
    • Разное
  • Аудио
    • FAQ, Технологии и компоненты
    • Для начинающих
    • Источники звука
    • Предусилители, темброблоки, фильтры
    • Питание аудио аппаратуры
    • Усилители мощности
    • Акустические системы
    • Авто-аудио
    • Ламповая техника
    • Гитарное оборудование
    • Прочее
  • Микроконтроллеры
    • МК для начинающих
    • AVR
    • PIC
    • STM32
    • Arduino и Raspberry Pi
    • ПЛИС
    • Другие микроконтроллеры и семейства
    • Алгоритмы
    • Программаторы и отладочные модули
    • Периферия и внешние устройства
    • Разное
  • Товары и услуги
    • Коммерческие предложения
    • Продам-Отдам, Услуги
    • Куплю
    • Уголок потребителя
    • Вакансии и разовая работа
    • Наши обзоры и тесты
  • Разное
    • Конкурсы сайта с призами
    • Сайт Паяльник и форум
    • Курилка
    • Технический английский (English)
    • Наши проекты для Android и Web
    • FAQ (Архив)
    • Личные блоги
    • Корзина
    • Вопросы с VK
  • ATX->ЛБП Переделки
  • Юмор в youtube Киловольты юмора
  • Надежность и группы продавцов Радиолюбительская доска объявлений exDIY
  • разные темы Переделки

Блоги

Нет результатов для отображения.

Нет результатов для отображения.

Местоположения

  • Пользователи форума

Группа


ICQ


Skype


Интересы


Город


Сфера радиоэлектроники


Оборудование

Найдено 26 результатов

  1. Могу ли я попросить о помощи

    Я хочу создать терморегулятор, который будет охлаждаться и должен работать с двумя двухскоростными вентиляторами. Целью терморегулятора является регулирование температуры T1 от 80 до 95 градусов, а T2 - от 95 до 110 градусов. Если температура превышает установленное значение T1, реле RL1 включается. Когда температура поднимается выше T1 до заданного значения T2, реле RL1 остается включенным и включается RL2. На дисплее отображается температура реальный Tr и степень, в которой вентиляторы Sp. Я пытался что-то сделать, но я начинаю программировать, и я не могу справиться с написанием этой логики. Если кто-то может помочь, я буду очень благодарен. Это то, что я сделал сейчас. Termo2ch.zip
  2. вопрос от нуба Хочу бросить в землю пару датчиков, возле трубы с холодной водой, чтобы контролировать возможное промерзание, но возникло пару вопросов Пока не решил на что буду выводить данные с датчика, просто сейчас стоит задача спаять с ftp + засиликонить в крышку из под бутылки, чтобы только голова торчала и зарыть. Вопрос заключается в сопротивлении, где лучше его ставить ? возле датчика ? по середине трассы или можно возле прибора если оно понадобится ? Максимальная длина витой если что - 25 метров Просто нужно в течении нескольких дней зарыть траншею и переделывать уже не будет возможности
  3. Всем доброго времени суток. Я реальный нуб в ATMEGA. Могу более-менее понять чужой код и из кусков сделать целое. Вопрос такой: реально ли на ATMEGA8 сделать 2 ШИМ (таймер 1 и2) и внутреннее прерывание (по таймеру 0) для чтения данных с DS18B20 на 8Мгц чтобы еще осталось на опрос кнопок и небольшую логику? Я выложу пример кода. По отдельность: ШИМ, прерывания, логика, запись в ЕПРОМ работает. Собираю все вместе - не работает. Пробовал в Протеусе, тоже глючит, да и протеус тормозит. Может кто чего подскажет. //#define F_CPU 8000000UL // устанавливаем рабочую частоту контроллера #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <avr/eeprom.h> #include "ds18x20.h" #include "onewire.h" #define MAXSENSORS 1 unsigned int tempint = 0; // переменная для целого значения температуры unsigned int subzero = 0; // переменная отрицательных значений температуры unsigned int clock = 0; //задержка для опроса датчика температуры unsigned int termo_error = 0; //флаг ошибки термодатчика unsigned char regim, R1_SHIBER, R1_VENT, R2_SHIBER, R2_VENT, R3_SHIBER, R3_VENT; //переменные режимов работы volatile char press = 0, pr = 0, pr1 = 0, set = 0; //дополнительные переменные для кнопок #define SHIBER_PB 1 //шибер подачи топлива #define SHIBER_PWM OCR1A #define VENT_PB 2 //вентилятор подачи воздуха #define VENT_PWM OCR1B #define LED1_ON PORTD |= _BV(PD3) // светодиод режим 1 #define LED1_OFF PORTD &= ~_BV(PD3) #define LED2_ON PORTD |= _BV(PD4) // светодиод режим 2 #define LED2_OFF PORTD &= ~_BV(PD4) #define LED3_ON PORTD |= _BV(PD6) // светодиод режим 3 #define LED3_OFF PORTD &= ~_BV(PD6) #define LED4_ON PORTD |= _BV(PD7) // светодиод 4 программирование #define LED4_OFF PORTD &= ~_BV(PD7) #define BUT_M PIND & (1 << PD1) // кнопка MENU #define BUT_U PIND & (1 << PD2) // кнопка UP #define BUT_D PIND & (1 << PD0) // кнопка DOWN unsigned char eep1 EEMEM; // режим работы unsigned char eep2 EEMEM; // режим 1 ШИМ вентилятор unsigned char eep3 EEMEM; //режим 1 ШИМ шибер unsigned char eep4 EEMEM; // режим 2 ШИМ вентилятор unsigned char eep5 EEMEM; // режим 2 ШИМ шибер unsigned char eep6 EEMEM; // режим 3 ШИМ вентилятор unsigned char eep7 EEMEM; // режим 3 ШИМ шибер unsigned char eep8 EEMEM; // флаг первого запуска uint8_t Temperature, szero; //-255 uint8_t nSensors, j; uint8_t cel_frac_bits; uint8_t gSensorIDs[MAXSENSORS][OW_ROMCODE_SIZE]; uint8_t search_sensors(void) // поиск DS18B20 { uint8_t i; uint8_t id[OW_ROMCODE_SIZE]; uint8_t diff, nSensors; nSensors = 0; for( diff = OW_SEARCH_FIRST; diff != OW_LAST_DEVICE && nSensors < MAXSENSORS ; ) { DS18X20_find_sensor( &diff, &id[0] ); if( diff == OW_PRESENCE_ERR ) { Temperature = 255; szero = 1; break; } if( diff == OW_DATA_ERR ) { Temperature = 255; szero = 1; break; } for (i=0; i<OW_ROMCODE_SIZE; i++) gSensorIDs[nSensors][i]=id[i]; nSensors++; } return nSensors; } void get_temp(int sensor){ // получаем температуру с датчиков DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL); DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL); j = gSensorIDs[0][sensor]; // family-code for conversion-routine if (DS18X20_read_meas_single(j, &szero, &Temperature, &cel_frac_bits) != DS18X20_OK) { //если не прочиталось то -255 Temperature = 255; szero = 1; } if (DS18X20_read_meas_single(j, &szero, &Temperature, &cel_frac_bits) != DS18X20_OK) { //если не прочиталось то -255 Temperature = 255; szero = 1; } tempint=(int)Temperature; subzero=(int)szero; } void pin_init(void) { //инициализация портов ШИМ DDRB |= (1<<SHIBER_PB) | (1<<VENT_PB); PORTB &= ~((1<<SHIBER_PB) | (1<<VENT_PB)); } void timer0_init(void) { //инициализация таймера для термодатчика TCCR0 |= (1<<CS00); TIMSK |= ( 1 << TOIE0); TCNT0 = 0xFF; } void timer1_init(void) { //инициализация таймера ШИМ шибера TCCR1A |= (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11); TCCR1B |= (1 << WGM13) | (1 << WGM12) | (1 << CS10); TCNT1 = 0x00; ICR1 = 0xFF; OCR1A = 0x00; OCR1B = 0x00; } void timer2_init(void) { //инициализация таймера ШИМ вентилятора TCCR2 |= (1 << COM21) | (1 << WGM21) | (1 << WGM20) | (1 << CS20); TCNT2 = 0x00; OCR2 = 0x00; } ISR(TIMER0_OVF_vect){ //прерывание таймера 0 для термодатчика if (clock != 4294967295){_delay_us(50);clock++;}else{get_temp(0);clock=0;} } //***************** обработка нажатия кнопок ********************** void buttons(){ if(~BUT_U){if(set == 0)pr++; // кнопка UP if(pr == 10){ // долгое нажатие } _delay_ms(100); }else{ if(pr >= 1 && pr < 10){ // короткое нажатие regim++; if (regim>3){regim=0;} eeprom_write_byte(&eep1, regim); // сохранение настройки в eeprom set = 0; pr = 0; } pr = 0; } if(~BUT_D){if(set == 0)pr1++; // кнопка DOWN if(pr1 == 10){ // длинное нажатие } _delay_ms(100); }else{ if(pr1 >= 1 && pr1 < 10){ // короткое нажатие. //set = 20; regim--; if (regim<0){regim=3;} eeprom_write_byte(&eep1, regim); // сохранение настройки в eeprom _delay_ms(100); set = 0; pr1 = 0; } pr1 = 0; } if(~BUT_M){ // кнопка MENU press++; if(press == 1 && set != 0){set++;} // переход по настройкам if(press >= 100 && set == 0){set = 1; _delay_ms(200);} // ход в настройки if(set == 1) eeprom_write_byte(&eep2, R1_VENT); if(set == 2) eeprom_write_byte(&eep3, R1_SHIBER); if(set == 3) eeprom_write_byte(&eep4, R2_VENT); if(set == 4) eeprom_write_byte(&eep5, R2_SHIBER); if(set == 5) eeprom_write_byte(&eep6, R3_VENT); if(set == 6) eeprom_write_byte(&eep7, R3_SHIBER); if(set > 6){ _delay_ms(100); set = 0; press = 0;} // если включена настройка даты, }else{ if(set == 0 && press >= 1){ // если не вошли в настройки regim++; if (regim>3){regim=0;} eeprom_write_byte(&eep1, regim); // сохранение настройки в eeprom } press = 0; } } //*****************режим настроек******************** void settings(){ //визуальное подтверждение настроек if(press >= 1 && set == 1) { LED1_ON; LED2_OFF; LED3_OFF; LED4_ON; SHIBER_PWM = R1_VENT;} //ШИМ шибер 0-255 if(press >= 1 && set == 2) { LED1_ON; LED2_OFF; LED3_OFF; LED4_ON; VENT_PWM = R1_SHIBER;} //ШИМ вентилятор 0-255 if(press >= 1 && set == 3) { LED1_OFF; LED2_ON; LED3_OFF; LED4_ON; SHIBER_PWM = R2_VENT;} //ШИМ шибер 0-255 if(press >= 1 && set == 4) { LED1_OFF; LED2_ON; LED3_OFF; LED4_ON; VENT_PWM = R2_SHIBER;} //ШИМ вентилятор 0-255 if(press >= 1 && set == 5) { LED1_OFF; LED2_OFF; LED3_ON; LED4_ON; SHIBER_PWM = R3_VENT;} //ШИМ шибер 0-255 if(press >= 1 && set == 6) { LED1_OFF; LED2_OFF; LED3_ON; LED4_ON; VENT_PWM = R3_SHIBER;} //ШИМ вентилятор 0-255 switch(set) // включена настройка { case 1: // настройка R1_VENT if(~BUT_U){R1_VENT++; if(R1_VENT > 254) R1_VENT = 0; _delay_ms(100);} if(~BUT_D){R1_VENT--; if((~BUT_D) && R1_VENT == 0) R1_VENT = 254; _delay_ms(100);} break; case 2: // настройка R1_SHIBER if(~BUT_U){R1_SHIBER++; if(R1_SHIBER > 254) R1_SHIBER = 0; _delay_ms(100);} if(~BUT_D){R1_SHIBER--; if((~BUT_D) && R1_SHIBER == 0) R1_SHIBER = 254; _delay_ms(100);} break; case 3: // настройка R2_VENT if(~BUT_U){R2_VENT++; if(R2_VENT > 254) R2_VENT = 0; _delay_ms(100);} if(~BUT_D){R2_VENT--; if((~BUT_D) && R2_VENT == 0) R2_VENT = 254; _delay_ms(100);} break; case 4: // настройка R2_SHIBER if(~BUT_U){R2_SHIBER++; if(R2_SHIBER > 254) R2_SHIBER = 0; _delay_ms(100);} if(~BUT_D){R2_SHIBER--; if((~BUT_D) && R2_SHIBER == 0) R2_SHIBER = 254; _delay_ms(100);} break; case 5: // настройка R3_VENT if(~BUT_U){R3_VENT++; if(R3_VENT > 254) R3_VENT = 0; _delay_ms(100);} if(~BUT_D){R3_VENT--; if((~BUT_D) && R3_VENT == 0) R3_VENT = 254; _delay_ms(100);} break; case 6: // настройка R3_SHIBER if(~BUT_U){R3_SHIBER++; if(R3_SHIBER > 254) R3_SHIBER = 0; _delay_ms(100);} if(~BUT_D){R3_SHIBER--; if((~BUT_D) && R3_SHIBER == 0) R3_SHIBER = 254; _delay_ms(100);} break; } } int main(){ /*******************************настройка переферии******************************/ cli(); ow_set_bus(&PIND, &PORTD, &DDRD, PD5); // иництализация протокола 1-wire nSensors = search_sensors(); // поиск датчиков DS18B20 DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL); //включаем преобразование температуры pin_init(); //timer0_init(); timer1_init(); timer2_init(); _delay_ms(5); if(eeprom_read_byte(&eep8) != 1){ // читаем eeprom, если там мусор (первый запуск), пишем свои данные eeprom_write_byte(&eep1, 0); // режим работы eeprom_write_byte(&eep2, 150); // режим 1 ШИМ вентилятор eeprom_write_byte(&eep3, 100); //режим 1 ШИМ шибер eeprom_write_byte(&eep4, 200); //режим 2 ШИМ вентилятор eeprom_write_byte(&eep5, 150); //режим 2 ШИМ шибер eeprom_write_byte(&eep6, 230); //режим 3 ШИМ вентилятор eeprom_write_byte(&eep7, 200); //режим 3 ШИМ шибер eeprom_write_byte(&eep8, 1); // флаг первого запуска } //читаем настройки из памяти regim = eeprom_read_byte(&eep1); // читаем режим работы из eeprom R1_VENT = eeprom_read_byte(&eep2); // читаем режим 1 ШИМ вентилятор из eeprom R1_SHIBER = eeprom_read_byte(&eep3); //читаем режим 1 ШИМ шибер R2_VENT = eeprom_read_byte(&eep4); //читаем режим 2 ШИМ вентилятор R1_SHIBER = eeprom_read_byte(&eep5); //читаем режим 2 ШИМ шибер R3_VENT = eeprom_read_byte(&eep6); //читаем режим 3 ШИМ вентилятор R1_SHIBER = eeprom_read_byte(&eep7); //читаем режим 3 ШИМ шибер sei(); _delay_ms(5); /**********************************инициализация ШИМ*************************************/ while(1){ //if (tempint=255) {LED1_ON;LED2_OFF;LED3_ON;termo_error=1;} else {termo_error=0;}//выводим код ошибки датчика темппературы buttons();//обработик нажатия кнопок if (termo_error == 0){//блокировка по термодатчику if(set == 0) { //нормальный режим работы if (regim == 0){ //режим работы 0 LED1_OFF; LED2_OFF; LED3_OFF; LED4_OFF; SHIBER_PWM = 0; //ШИМ шибер 0-255 VENT_PWM = 0; //ШИМ вентилятор 0-255 } if (regim == 1){ //режим работы 1 LED1_ON; LED2_OFF; LED3_OFF; LED4_OFF; VENT_PWM = R1_VENT; //ШИМ вентилятор 0-255 if (tempint >=40) { //блокировка по температуре SHIBER_PWM = 0; //ШИМ шибер 0-255 }else{ SHIBER_PWM = R1_SHIBER; //ШИМ шибер 0-255 } } if (regim == 2){ //режим работы 2 LED1_OFF; LED2_ON; LED3_OFF; LED4_OFF; VENT_PWM = R2_VENT; //ШИМ вентилятор 0-255 if (tempint >=60) { //блокировка по температуре SHIBER_PWM = 0; //ШИМ шибер 0-255 }else{ SHIBER_PWM = R2_SHIBER; //ШИМ шибер 0-255 } } if (regim == 3){ //режим работы 3 LED1_OFF; LED2_OFF; LED3_ON; LED4_OFF; VENT_PWM = R3_VENT; //ШИМ вентилятор 0-255 if (tempint >=80) { //блокировка по температуре SHIBER_PWM = 0; //ШИМ шибер 0-255 }else{ SHIBER_PWM = R3_SHIBER; //ШИМ шибер 0-255 } } } }else{ SHIBER_PWM=0; VENT_PWM=0; } if(set != 0) settings();//вход в настройки } //return 0; }
  4. Сделал девайс для своей машины, думаю, многим понравится. Прибор устанавливается на любом автомобиле с напряжением бортовой сети 12В. Основные функции: 1.остаток топлива в баке в литрах. 2.напряжение бортовой сети. 3.рабочую температуру двигателя. 4.температуру воздуха снаружи машины. 5.изменение яркости дисплея в зависимости от включенного габаритного освещения (день/ночь). Дополнительно, компьютер обладает следующими сервисными возможностями: 1.калибровка штатного датчика уровня топлива. 2.установка уровня подсветки дисплея для режимов день/ночь. 3.изменение поправочного коэффициента инерционности показаний уровня топлива. Все калибровки прибора производятся программно. Для измерения температуры необходима установка собственных датчиков dallas ds18b20. В основе устройства лежит микроконтроллер AVR ATMega8 производства фирмы ATMEL. Для измерения напряжения бортовой сети предусмотрен отдельный контакт, который можно подключить непосредственно к аккумулятору или замку зажигания. В качестве индикатора был выбран алфавитно-цифровой ЖК индикатор фирмы МЭЛТ МТ-16S2H, который с успехом можно заменить на любой другой, совместимый с HD44780. Статья на сайте: Бортовой миникомпьютер В архиве схема, фьюзы для прошивания, файлы lcd.hex и lcd.epp, описание работы с менюшками. avr_lcd.rar
  5. Здравствуйте. Прошу помощи в написании программы на ардуино. Пробую делать небольшой домашний проект. Суть такова, есть датчик температуры DS18B20, ардуинка, семисегментный индикатор net3631аs, 74hc595. Хочется сделать небольшой термометр с отображением температуры на дисплее. Сначала решил промоделировать в протеусе это все дело. Слепил скетч из частей которые нарыл в интернете и увидел, что неверно отображаются значения на индикаторах, точнее отображается какая-то ерунда. Потом решил попробовать это все дело вживую на макетной плате - результат тот же. Прошу помощи у спецов. В терминал отсылаются значение температуры правильные, такие как задал в протеусе на датчике. Далее разбиваю это число на 2 символа (пока на 2) и пытаюсь отображать их по очереди на индикаторе, здесь то и начинаются проблемы. В протеуса выбрал три отдельных индикатора с общим катодом, чтобы промоделировать работу в общем. Пробовал таким же методом отображать просто числа на индикаторе и все было прекрасно, как протеусе так и на макетной плате.Не понимаю в чем проблема. Проект в Протеусе и код к ардуинке прикрепляю. Заранее благодарю. tee.7z
  6. Всем привет.Есть такая проблема.Делаю терморегулятор.Есть программа написанная на СИ и есть схема в протеусе. Все вроде компилируется и ошибок нигде не выдает.Но не работает приборчик.И походу нет данных с датчика температуры.Помогите найти ошибку.!!!!Очень надо.В архиве есть все исходники. /* * Application1.c * Author: Александр */ #define F_CPU 4000000UL #include<avr/io.h> #include<avr/interrupt.h> #include<util/delay.h> #define PORTB_MASK 0x01 // zdes ispolzuem PB0 kak liniju dannih dlja datcika #define GISTERESIS 30 void port_ini(void) { PORTB=0x00; DDRB=0xFF; } //---Функци посылки RESET PULSE - датчику----------------- unsigned char present_ds18b20(void) { unsigned char res; DDRB|= PORTB_MASK; // Далее такого рода конструкция означает // DDRB = DDRB | PORTB_MASK, т.е. DDRB = (xxxxxxxx | 00000001) = xxxxxxx1 _delay_ms(485); //Pause 480mks DDRB&=~PORTB_MASK; // Далее такого рода конструкция означает // DDRB = DDRB & ~PORTB_MASK, т.е. DDRB = (xxxxxxxx & 11111110) = xxxxxxx0 _delay_us(65); //Pause 70mks if ((PINB&PORTB_MASK) == 0x00) // Если в PB0 0 , т.е. получен ответ от датчика present и возвращаем 1 res=1; //if present, res=1 else res=0; // else возвращаем 0 _delay_ms(420); //pause 410mks return res; } //----------Функция шлет датчику побитно комманду command------ void send_ds18b20(unsigned char command) { unsigned char i, data; data=command; for(i=0;i<8;i++) { if ((data&0x01)==0x01) { // Если бит 1 - Шлем бит = 1 DDRB|=PORTB_MASK; // liniju v 0 (старт посылки) _delay_us(2); //pause 6mks DDRB&=~PORTB_MASK; // liniju v 1 - na vhod (шлем бит=1 и стоп посылки) _delay_us(65); //pause 64mks } else { //Если бит 0 - Шлем бит 0 DDRB|=PORTB_MASK; // liniju v 0 (старт посылки и шлем бит 0) _delay_us(60); //pause 60mks DDRB&=~PORTB_MASK; // liniju v 1 - na vhod (стоп посылки) _delay_us(10); //pause 10mks } data=data>>1; // сдвигаем посылаемый байт на бит вправо для посылки следующего бита и так все 8 бит шлем. } } //---------Функция приема 2-х байт температуры от датчика // температура хранится в 2-х байтной temperature unsigned int receive_ds18b20(void) { unsigned char i; unsigned int temperature=0; for(i=0;i<16;i++) { DDRB|=PORTB_MASK; // liniju v 0 (старт приема) _delay_us(6); //Pause 6mks DDRB&=~PORTB_MASK; // liniju v 1 - na vhod _delay_us(9); //Pause 9mks , т.е. на 15 мкс считываем полученный бит if ((PINB & PORTB_MASK)==0x00) temperature&=~_BV(i); //If recived 0 // если бит 0 записываем в i-ую позицию temperature бит 0, ~_BV(i) тоже самое что ~(1<<i) else { temperature|=_BV(i); //If recived 1 // если бит 1 записываем в i-ую позицию temperature бит 1, _BV(i) тоже самое что (1<<i) } _delay_us(55); //Pause 55mks } return temperature; // возвращаем 2 байта температуры } char ASCII_high; // переменная для старшей цифры температуры для вывода на дисплей char ASCII_low; // переменная для младшей цифры температуры для вывода на дисплей char * decTab = "0123456789"; // массив где номеру его элемента соответсвует цифра в ASCII (это для вывода на дисплей) // функция принимает значение value и адресса high и high записывает в // в эти адресса код в Ascii . // например у нас в детятичной системе 15 , для вывода на дисплей // мы должны послать байт '1' и байт '5' во т15 - это value // 1 - хранится по адрессу high, 5 по адрессу low void decByte2asciiPair(char value, char * high, char * low) { *high = decTab[ value/10 ]; *low = decTab[ value%10 ]; } //--------------------LCD------------------------------------------ // задержки #define WAIT_1ms _delay_ms(1); #define WAIT_10ms _delay_ms(10); // Макроопределения E - PC0 , RS - PC1 , RW - PC2 #define E PC0 #define RS PC1 #define RW PC2 // - шлем комманду на дисплей void SEND_COM(int sys_com) { PORTC &= ~(1<<E) & ~(1<<RW) & ~(1<<RS); //E=0,RW=0 (peredaem),RS=0(komanda) WAIT_1ms PORTC = (PORTC |(1<<E)) & ~(1<<RW) & ~(1<<RS); //E=1,RW=0 (peredaem),RS=0(komanda) WAIT_1ms PORTD = sys_com; WAIT_1ms PORTC &= ~(1<<E) & ~(1<<RW) & ~(1<<RS); //E=0,RW=0 (peredaem),RS=0(komanda) WAIT_10ms // posle posilki komandi nuzno podozdat vremja i ne slat }// шлем данные на дисплей void SEND_DATA(int sym_com) { PORTC = (PORTC |(1<<RS)) & ~(1<<E) & ~(1<<RW); //E=0,RW=0 (peredaem),RS=1(dannie) WAIT_1ms PORTC = ( PORTC |(1<<RS)|(1<<E) ) & ~(1<<RW); //E=1,RW=0 (peredaem),RS=1(dannie) WAIT_1ms PORTD = sym_com; WAIT_1ms PORTC = (PORTC |(1<<RS)) & ~(1<<E) & ~(1<<RW); //E=0,RW=0 (peredaem),RS=1(dannie) WAIT_10ms // posle posilki komandi nuzno podozdat vremja i ne slat }// инициализация дисплея void LCD_init(void) { SEND_COM(0b00110000);// 8 bit 1 srtroka razmer simvola 5x8 SEND_COM(0b00000001);// ustanovka 0-adres i ocistka ekrana SEND_COM(0b00000110);//increment adressa , t.e. kazdi sled simvol v sled znakomesto zapisetsa SEND_COM(0b00001100);// vklucit ekran SEND_DATA('1'); // risuem nacalnie ustanovki SEND_DATA('5'); SEND_DATA('.'); SEND_DATA('0'); SEND_COM(0b00010100);// sdvig kursora vpravo SEND_DATA('O'); SEND_DATA('F'); SEND_DATA('F'); SEND_COM(0b00010100);// sdvig kursora vpravo SEND_DATA('X'); SEND_DATA('X'); SEND_DATA('.'); SEND_DATA('X'); } //--------Обработчик прерывания по таймеру T0 ---------------- volatile char button0_state=0; // переменная-флаг нажантия кнопки 0 volatile char button1_state=0; // переменная-флаг нажантия кнопки 1 ISR(TIMER0_OVF_vect) { static int count_buttons_reading=0; // переменная для отсчета 40-ka интревалов по 4 мс static int count_button0_yea=0; // переменная для подсчета количесва нажатий кнопки 0 в интервале 4*40 ms static int count_button0_no=0; // переменная для подсчета количесва отжатий кнопки 0 в интервале 4*40 ms static int count_button1_yea=0; // переменная для подсчета количесва нажатий кнопки 1 в интервале 4*40 ms static int count_button1_no=0; // переменная для подсчета количесва отжатий кнопки 0 в интервале 4*40 ms count_buttons_reading++; // прошло 4 мс , подсчитываем if ( !((PINC>>PC3)&0x01) ) // если нажата кнопка 0 count_button0_yea++; // подсчитываем нажатие else // если отжата кнопка 0 count_button0_no++; // подсчитываем отжатие if ( !((PINC>>PC4)&0x01) ) // тоже самое для кнопки 1 count_button1_yea++; else count_button1_no++; if ( count_buttons_reading==40 ) // resenie o sostoinii prinimaetsa cerez 40*4=160ms { if(count_button0_yea>count_button0_no) // если по прошествию 40-ka 4-ех милисекундных интервало нажатий больше отжатий button0_state=1; // считаем что кнопка нажата else button0_state=0; // в проивном случае считаем что кнопка отжата if(count_button1_yea>count_button1_no) // аналогично для кнопки 1 button1_state=1; else button1_state=0; count_buttons_reading=0; // сброс всех счетчиков для следующего цикла из 40-ка 4 мс интервалов count_button0_yea=0; count_button0_no=0; count_button1_yea=0; count_button1_no=0; } } // функция настройки таймере T0 на прерывание по переполнению void Timer0Init(unsigned char prescaller,unsigned char int_mode) { TCCR0=prescaller; // taimer zapuskaetsa kak tolko v TCCR0 zadadut predddelitel(CS00-CS02) TIMSK=int_mode;// razr-zapr prerivanija zdes tolko po perepolneniju } //---------------Функция чтения температуры от дачтчика-------- unsigned int read_temp(void) { unsigned int temp; SREG&=~(1<<7); // globalno zaprescaem prerivanija // код который пойдет ниже нельзя прерывать так как шина 1 Wire очень чувсвительна к временным интервалам //------------------START preobrazovanija while(!present_ds18b20()); // zdem пока нет otveta present от датчика send_ds18b20(0xcc); // если дождались послыаем команду тгнорирования адресса (если 1 датчик на шине то так проще просо работать) send_ds18b20(0x44); // шлем команду на старт преоращования _delay_ms(750); // zdem preobrazovanije не менее 750 мс //---------CITAEM DANNIE--------- while(!present_ds18b20()); // zdem пока нет otveta present от датчика send_ds18b20(0xcc); // если дождались послыаем команду игнорирования адресса (если 1 датчик на шине то так проще просо работать) send_ds18b20(0xbe); // посылаем команду чтения температуры temp = receive_ds18b20(); // читаем 2 байта SREG|=(1<<7); // globalno opjat razrecaem prerivanija return temp; // возвращаем 2 прочитанных байта температуры } #define HIGH_TEMP 300 // верхний предел температуры здесь и далее имеется ввиду формат 30.0 #define LOW_TEMP 150 // нижний предел температуры здесь и далее имеется ввиду формат 15.0 // намприер 15.5 будет 155 signed int temperatura_tek=LOW_TEMP; // по умолчанию нижний предел температуры signed int temperatura_tek_pred=LOW_TEMP; // по умолчанию нижний предел предыдущей текущей температуры unsigned int temperatura_ust=LOW_TEMP; // по умолчанию нижний предел температуры int main(void) { char i; unsigned int receive_temp;// temperaura ot dancika PORTB&=~PORTB_MASK; // otklucaem vnutrennjuu podtjazku ot vhoda PB0 DDRB&=~PORTB_MASK; // poka nastraivaem na vhod liniju dannih, s ucetom vnesney podtazki tam 1 DDRC |= (1<<E) | (1<<RS) | (1<<RW); // na vihod linii upr ekranom PORTC &= ~(1<<E) & ~(1<<RS) & ~(1<<RW); // obnuljaem DDRC &= ~(1<<PC3) & ~(1<<PC4); // PC3 i PC4 na vhod dla knopok PORTC |= (1<<PC3) | (1<<PC4); // na PC3 i PC4 vklucaem vnutrennie podtjazki DDRC |= (1<<PC5) ; // PC5 na vihod dlja upravlenija optoparoy (u nas diod) PORTC |= (1<<PC5) ; // PC5 =1 ; po sheme ten viklucen/svetodiod ne gorit Timer0Init( (1<<CS00) | (1<<CS01),1<<TOIE0);// preriv po taymeru0 po perepolmeniju na 4 ms nastraivaem // делитель 64, (64/4000000)*256=0.004с SREG|=(1<<7); // globalno razrecaem prerivanija LCD_init(); // начальная инициализация LCD while (1) // beskonecniy cikl { //********************Проверяем и обрабатываем кнопку + с выводом на экран ************************* if (button0_state==1) // если нажата кнопка увеличения температуры { button0_state=0; // sbrasivaem , t.e. obrabotali nazatie knopki temperatura_ust = temperatura_ust + 5; if (temperatura_ust > HIGH_TEMP) // проверка за выход из диапазона temperatura_ust=LOW_TEMP; SEND_COM(0b00000010);// ustanovka v 0-j address LCD (с 0-ой позиции дисплея у нас находится эта температура) decByte2asciiPair((char)(temperatura_ust/10),&ASCII_high,&ASCII_low); // perevodim v aski celiju cast temperaturi // (например 15.5 , у нас 155. / это целочисленное деление, значит 155/5=15, то что надо! Значит переводим 15 в '1' и '5') SEND_DATA(ASCII_high); // vivodim celluji cast temperatiri SEND_DATA(ASCII_low); decByte2asciiPair((char)(temperatura_ust%10),&ASCII_high,&ASCII_low); // perevodim v aski celiju cast temperaturi (например 15.5 , у нас 155. / - целочисленное деление, значит 155/5=15, то что надо!) // (например 15.5 , у нас 155. % это остаток от деление, значит 155%5=5, то что надо! Значит переводим 05 в '0' и '5') SEND_COM(0b00010100);// sdvig kursora vpravo SEND_DATA(ASCII_low); // vivodim drobniju cast temperaturi } //********************Проверяем и обрабатываем кнопку - с выводом на экран ************************* if (button1_state==1) // если нажата кнопка уменшения температуры { button1_state=0; // sbrasivaem , t.e. obrabotali nazatie knopki temperatura_ust = temperatura_ust - 5; if (temperatura_ust < LOW_TEMP ) // проверка за выход из диапазона temperatura_ust=HIGH_TEMP; decByte2asciiPair((char)(temperatura_ust/10),&ASCII_high,&ASCII_low); // perevodim v aski celiju cast temperaturi // (например 15.5 , у нас 155. / это целочисленное деление, значит 155/5=15, то что надо! Значит переводим 15 в '1' и '5') SEND_COM(0b00000010);// ustanovka v 0-j address LCD (на -ой позиции дисплея у нас находится эта температура) SEND_DATA(ASCII_high); // vivodim celluji cast temperatiri SEND_DATA(ASCII_low); decByte2asciiPair((char)(temperatura_ust%10),&ASCII_high,&ASCII_low); // perevodim v aski celiju cast temperaturi (например 15.5 , у нас 155. / - целочисленное деление, значит 155/5=15, то что надо!) // (например 15.5 , у нас 155. % это остаток от деление, значит 155%5=5, то что надо! Значит переводим 05 в '0' и '5') SEND_COM(0b00010100);// sdvig kursora vpravo SEND_DATA(ASCII_low); // vivodim drobniju cast temperaturi } // запомнили предыдущую температуру temperatura_tek_pred = temperatura_tek; //*********** Получаем 2 байта температуры от датчика и переводим ее в нужный формат ************************* receive_temp=read_temp(); // получаем 2 байта температуры от датчика (0-ой бит =1 - 0.5, 0 - 0.0 десятая часть) temperatura_tek = ((receive_temp>>1)*10 ); // присваеваем температуре текущей целую часть температуры от датчика переведенную в нужный нам формат, // т.е. если например 15.5 станет 15*10 =150 if (receive_temp & 0x01) // если дробная часть 0.5 - то (т.е. 0-й бит равен 1) temperatura_tek = temperatura_tek+5; // то 15+5 = 155 (т.е. 15.5) //****** Выводим на экран температуру от датчика**************************** decByte2asciiPair((char)(temperatura_tek/10),&ASCII_high,&ASCII_low); // perevodim v aski celiju cast temperaturi SEND_COM(0b00000010);// ustanovka v 0-j address LCD for (i=0;i<9;i++) SEND_COM(0b00010100);// sdvig kursora vpravo на - 7 позиций (с 7-й позиции у нас находится на дисплее эта температура) SEND_DATA(ASCII_high); // vivodim celluji cast temperatiri na ekran SEND_DATA(ASCII_low); decByte2asciiPair((char)(temperatura_tek%10),&ASCII_high,&ASCII_low); SEND_COM(0b00010100);// sdvig kursora vpravo SEND_DATA(ASCII_low); // vivodim drobniju cast temperaturi //************* Сравниваем температуру текущую и требуемую c гистерезисом и принимаем решение а ключении тэна с выводдом ON - OFF на экран if ((temperatura_tek-temperatura_tek_pred)>0) { // если температура растет if ( temperatura_tek <= (temperatura_ust + GISTERESIS)) // esli neobhodimo povisat temperaturu? { PORTC &= ~(1<<PC5) ; // да PC5 =0 ; po sheme ten vklucen/svetodiod gorit SEND_COM(0b00000010);// ustanovka v 0-j address LCD for (i=0;i<5;i++) SEND_COM(0b00010100);// sdvig kursora vpravo на - 5 позиций (с 5-й позиции у нас находится слово ON) SEND_DATA('O'); SEND_DATA('N'); SEND_DATA(' '); } else { PORTC |= (1<<PC5) ; // нет PC5 =1 ; po sheme ten viklucen/svetodiod ne gorit SEND_COM(0b00000010);// ustanovka v 0-j address LCD for (i=0;i<5;i++) SEND_COM(0b00010100);// sdvig kursora vpravo на - 5 позиций (с 5-й позиции у нас находится слово OFF) SEND_DATA('O'); SEND_DATA('F'); SEND_DATA('F'); } } if ((temperatura_tek-temperatura_tek_pred)<0) { // если температура убывает if ( temperatura_tek > (temperatura_ust - GISTERESIS)) // esli neobhodimo ponizat temperaturu? { PORTC |= (1<<PC5) ; // нет PC5 =1 ; po sheme ten viklucen/svetodiod ne gorit SEND_COM(0b00000010);// ustanovka v 0-j address LCD for (i=0;i<5;i++) SEND_COM(0b00010100);// sdvig kursora vpravo на - 5 позиций (с 5-й позиции у нас находится слово OFF) SEND_DATA('O'); SEND_DATA('F'); SEND_DATA('F'); } else { PORTC &= ~(1<<PC5) ; // да PC5 =0 ; po sheme ten vklucen/svetodiod gorit SEND_COM(0b00000010);// ustanovka v 0-j address LCD for (i=0;i<5;i++) SEND_COM(0b00010100);// sdvig kursora vpravo на - 5 позиций (с 5-й позиции у нас находится слово ON) SEND_DATA('O'); SEND_DATA('N'); SEND_DATA(' '); } }} projectC.7z
  7. Добрый вечер, помогите разобраться с кодом. Делаю термометр, с возможностью, выставления температуры срабатывания рэлле с помощью энкодера. Проблемы следующие. Не срабатывает реле, и отклик на энкодер идет слишком долго. То есть пару раз провернешь и только потом переменная увеличивается. По отдельности проекты работали. Общий код: #include <mega8.h> int NewState,OldState,upState,Temp,downState,count_1; // unsigned char trig; float temper; #asm .equ __lcd_port=0x12 ;PORTD #endasm #include <lcd.h> #include <stdio.h> #include <delay.h> // 1 Wire Bus functions #asm .equ __w1_port=0x18 ;PORTB .equ __w1_bit=2 #endasm #include <1wire.h> #include <ds18b20.h> #pragma warn- /* eeprom */ eeprom int temp_eep; #pragma warn+ interrupt [TIM1_COMPA] void timer1_compa_isr(void) { NewState=PINB & 0b00000011; if(NewState!=OldState) { switch(OldState) { case 2: { if(NewState == 3) upState++; if(NewState == 0) downState++; break; } case 0: { if(NewState == 2) upState++; if(NewState == 1) downState++; break; } case 1: { if(NewState == 0) upState++; if(NewState == 3) downState++; break; } case 3: { if(NewState == 1) upState++; if(NewState == 2) downState++; break; } } OldState=NewState; } if(trig==1) // если флаг активен { if(OldState==NewState) // если энкодер в покое то увеличиваем счетчик {count_1++; if(count_1==5000) // если счетчик дотикал до 5 секунд {temp_eep=Temp; // пишем данные в еепром count_1=0; //обнуляем счетчик trig=0; // обнуляем флаг } } } TCNT1H=0x00; TCNT1L=0x00; } void main(void) { char lcd_buf[17]; char lcd_buf2[17]; // Input/Output Ports initialization // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=P State0=P PORTB=0x03; DDRB=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 1000,000 kHz // Mode: CTC top=OCR1A // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer 1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: On // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x0A; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x03; OCR1AL=0xE8; OCR1BH=0x00; OCR1BL=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x10; // Global enable interrupts #asm("sei") lcd_init(16); w1_init(); ds18b20_init(0,-20,50,DS18B20_12BIT_RES); Temp=temp_eep; //Выгружаем данные из памяти while (1) { if (upState >= 4) { Temp++; upState = 0; trig=1; // ставим флаг } if (downState >= 4) { Temp--; downState = 0; trig=1; // ставим флаг } temper=ds18b20_temperature(0); if (temper<=Temp) {PINC.1=1;} else {PINC.1=0;} sprintf(lcd_buf,"t=%.1f\xdf""C",temper); ////0b 99 sprintf(lcd_buf2,"Temp=%d\xdf""C",Temp); lcd_clear(); lcd_gotoxy(0,0); lcd_puts(lcd_buf); lcd_gotoxy(0,1); lcd_puts(lcd_buf2); delay_ms(10); }; } Проект термометра: #include <mega8.h> #include <delay.h> // 1 Wire Bus functions #asm .equ __w1_port=0x18 ;PORTB .equ __w1_bit=2 #endasm #include <1wire.h> #include <ds18b20.h> // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x12 ;PORTD #endasm #include <lcd.h> #include <stdio.h> char lcd_buf[17]; void main(void) { float temper; lcd_init(16); w1_init(); ds18b20_init(0,-20,50,DS18B20_12BIT_RES); while(1) { temper=ds18b20_temperature(0); sprintf(lcd_buf,"t=%.1f\xdfC",temper); lcd_clear(); lcd_puts(lcd_buf); if (temper<=18) {PINC.1=1;} delay_ms(1500); }; } При сравнении переменных temper<=temp ничего не происходит. пробовал Temp заменить числом как во втором примере, тоже ноль реакции. Второй пример работает. Компилятор ошибок не выдает. Пишу в CV AVR. Схема собрана в железе.
  8. Подскажите, где можно найти датащит на интегральный датчик температуры DS18B20 на русском языке. Или чем отличается DS18B20 от DS1820 ?
  9. Здравствуйте. В общем тема избитая но не получается хоть убей. Есть 1 датчик ds18b20 микроконтроллер ATmega8515. Программирую в CodevisionAVR. Между линией данных DQ и плюсом питания поставил резистор на 4.7кОМ. Пишу,копирую программы для того чтобы сделать хоть термометр, а упорно микроконтроллер не видит датчика. Думал уже что датчик не рабочий купил второй, все равно не работает мой термометр. Вот пример программ. #include <mega8515.h> //библиотека ввода\вывода #include <delay.h> //библиотека задержки #asm //сообщаем куда подключен датчик .equ __w1_port=0x1b; PORTA .equ __w1_bit=0 #endasm #asm //сообщаем куда подключён экран PORTC .equ __lcd_port=0x15 #endasm #include <lcd.h> //библиотека для LCD #include <1wire.h> //библиотека работы с 1Wire #include <ds18b20.h> //библиотека для работы с датчиком ds18b20 #include <stdio.h> char lcd_buffer[33]; //масив с данными для экрана void main(void) { unsigned char devices; //переменная в которой количество присоеденённых датчиков int temp; //переменная для хранения температуры lcd_init(16); //инициилизация LCD, и говорим что он на 16 символов devices=w1_init(); //ищим датчики while(devices>0) //бесконечный цикл, если датчик подключон { temp=ds18b20_temperature(0); //читаем температуру if (temp>1000){ //если датчик выдаёт больше 1000 temp=4096-temp; //отнимаем от данных 4096 temp=-temp; //и ставим знак "минус" } sprintf(lcd_buffer,"t=%i.%u\xdfC",temp,temp%1); //записуемв масив для экрана температуру и всё такое lcd_clear(); //чистим дисплей перед выводом lcd_puts(lcd_buffer); //выводим масив на LCD delay_ms(500); //ждём 500мс }; } Хотя судя по всему неправильно подключен датчик. Но почему непонятно. Датчик подключен выводом GND к минусу DQ к выводу микроконтроллера, VDD к плюсу, причем выводы DQ и VDD соединены через резистор на 4.7 кОМ. На проводе DQ микроконтроллер выдает напряжение 5 вольт тестером мерял. Может кто знает в чем проблема, я уже чуть ли не с бубном прыгал. Номинал резисторов тоже кстати менял, чет не помогает.
  10. Есть ли аналог DS18B20 с меньшей погрешностью? Наверняка в промышленности используются более точные датчики (иногда 0.5 градусов большая погрешность).
  11. Вот пишу на асме код под термометр. Работаю в протеусе 8.3. Reset идет удачно, отправка данных тоже, но вот с получение получается не очень. Вот такая поочередность отправки команд Отправляю 0xcc 0x44 Задержка в 750 0xcc 0xbe и получаю данные После 0xbe вроде как нету зарежки ) Поетому формирую сигнал для получения А вот уже датчик отвечает. Только вот в чем беда - при любой температуре эпюра остается неизменной. Может кто знает в чем беда?
  12. Ds18B20 Lcd16X2

    Здравствуйте! AVR'щики помогите с проектом. Требуется вывести на LCD 16х2 данные с DS18b20,а именно ROM код и температуру. Примерно так.
  13. Продаю терморегулятор для инкубатора. диапазон температуры от +24 до +51 С. Цена указана без блока питания и без корпуса. Размер без блока питания 110х60 мм Точность измерения температуры - 0.1 С Питание терморегулятора 9-12 V. Питание нагрузки которое Вам подходит (max 600 V). Мощность коммутируемой нагрузки 800 Вт. При отключение от сети регулятора, настройки температуры сохраняются. В данном терморегуляторе применен датчик DS18B20, управляет всем этим PIC16F628A Звоните, пишите. Регулятор очень хороший, за время использования ни разу не подвел. Отправлю новой почтой, интаймом. Цена 250 гривен. Также возможно изготовление терморегуляторов для бойлера.
  14. О подключении мощной нагрузки к Arduino через MOSFET-транзистор. Управление вентилятором при помощи ШИМ. Увеличение частоты ШИМ на Arduino. Создание простой системы управления кулером в зависимости от температуры (применен сенсор DS18B20) Работа с DS18B20 Статьи про ШИМ Таблица значений регистров для повышения частоты ШИМFAN_PWM.zip FAN_Temperature.zip OneWire.zip irl3705n.pdf 4_Wire_PWM_Spec.pdf
  15. Радио-удлинитель датчика температуры DS18B20 с помощью этого комплекта любой "градусник" можно превратить в "с радиодатчиком" собрано на STM32F100C4 и радиомодулях RFM70-73 дальность.. по прямой 50м. "со стенками" от окна и "по комнате". так что бы не тянуть провод датчика через комнату на улицу. Цена комплекта 22$
  16. Помогите найти схему радиоудлинителя для термодатчиков DS18B20 на радилмодулях к примеру на RCR-433-MPR. Есть готовые но цена кусается
  17. Добрый день уважаемые форумчане! Все время применял готовые библиотеки для температурного датчика, теперь настало время когда появилась необходимость детально разобраться в работе этого датчика. Все понятно , кроме этой таблицы: http://electronix.ru...e=post&id=79824 На форумах вычитал что целая часть хранится в младшей тетраде старшего байта и в старшей тетраде младшего байта , а дробная часть в младшей тетраде младшего байта. Если из целой частью все понятно , то из дробной появляются вопросы.... Вопрос как по пунктам получить из двух байтового регистра температуру с десятыми долями и еще из знаком? Пока вижу только такое: temp1 = read_1w(); temp2 = read_1w(); temp1=temp1 & 0x0F; // целая 1 часть temp3=temp2 & 0x0F; // дробная часть temp2=temp2 >> 4; // целая вторая часть temp1= temp1 << 4; temp1 = | temp2; printf("%d,%d" , temp1 , temp3) так вот значение дробной части не соответствует даташит... И еще этот пример не выведет отрицательной температуры, будет ошибка.
  18. Привет всем! Начал недавно програмировать мк. Сначало начал со светодиодов, теперь перешел на термометры. Гдето в интернете нашел исходник для термометра, немного переделав код под свои нужды он у меня заработал. Дальше захотелось больше, подключить два датчика температуры, но с этим возникли проблемы... Собствено вот код термометра: #include <mega8.h> #include <delay.h> #asm .equ __w1_port=0x18; PORTB; .equ __w1_bit=3; #endasm #include <1wire.h> #include <ds18b20.h> int temper; int number = 0; int number1 = 0; int number2 = 0; int i=0; interrupt [TIM1_COMPA] void timer1_compa_isr(void) { PORTB.0=0; PORTB.1=0; if(i==0) { number=number1; PORTB.1=1; i++; } else { number=number2; PORTB.0=1; i=0; } switch(number) { case 0:{PORTD=0x3F; break;} // 11000000 case 1:{PORTD=0x6; break;} // 11111001 case 2:{PORTD=0x5B; break;} // 10100100 case 3:{PORTD=0x4F; break;} // 10110000 case 4:{PORTD=0x66; break;} // 10011001 case 5:{PORTD=0x6D; break;} // 10010010 case 6:{PORTD=0x7D; break;} // 10000010 case 7:{PORTD=0x7; break;} // 11111000 case 8:{PORTD=0x7F; break;} // 10000000 case 9:{PORTD=0x6F; break;} // 10010000 } } void main(void) { PORTB=0xFF; DDRB=0xFF; PORTD=0xC0; DDRD=0xFF; TCCR1A=0x00; TCCR1B=0x0A; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x10; OCR1AL=0x46; TIMSK=0x10; w1_init(); #asm("sei") PORTC=0x00; DDRC=0xFF; while (1) { temper=ds18b20_temperature(0); if (temper>1000) { temper=4096.0-temper; temper=-temper; } number1= temper/10; number2= temper%10; delay_ms(500); if (temper>30) {PORTC.1=1; } if (temper<30) {PORTC.1=0; } } Теперь к этому коду нужно добавить следующие: 1. При неиспраности датчика выводить 1Er или 2Er, а если оба неисправны Err 2. Собственно подключить второй датчик. 3. Добавить сравнение температур, если t1>t2 PORTC.1=1, если меньше то выключен 3. Выводить информацию с датчиков поочередно: t1, t2, разность температур t1 и t2.
  19. Добрый день. Товарищи помогите написать прогу в pic simulator ide для двух датчиков ds18b20, подключенных последовательно на одну шину. Не могу разобраться, как принимать и отправлять биты на эти датчики. Питание НЕ паразитное. Микроконтроллер 16f877a, датчики подключены к выходу c0. Заранее спасибо
  20. Доброго времени суток. Разрабатываю систему сбора информации отопительной теплосети. Для начала решил отладить термодатчики, температуру нужно измерять в трубах, и на. Пределов измерения и точности DS18B20 вполне хватает плюс дешевизна и отсутствие надобности в калибровке сыграли свою роль. Первый датчик установлен на улице под козырьком. Сама микросхема напаяна на стеклотекстолит параллельно линиям питания припаян керамический конденсатор емкостью 8мкФ, все это хозяйство залито лаком. Второй датчик вместе с конденсатором залитый в эпоксидную смолу. Этот датчик опущен в металлический стакан вваренный в трубу. Стакан заполнен машинным маслом. Все выводы микросхемы DS18B20 заизолированы, и к трубе ни каким образом не прикасаются (см. рис.). Основным управляющим элементом в схеме служит ATmega8 программирую на CodeVisionAVR... На шину 1-Wire подключено два датчика DS18B20, общая длинна провода приблизительно 100м. Провод витая пара категории 5Е (экранированный). Опрос выполняется раз в минуту. Устройство работает круглосуточно начиная с октября прошлого года. Приблизительно через полтора месяца после начала эксплуатации начал сбоить датчик из трубы (передавал -9999) и через сутки вовсе перестал работать. Я подумал всякое бывает, может брак… закатал я новый датчик в эпоксидку опустил в трубу и на этом все закончилось. При прозвонке дохлого я выяснил, что вышел из строя вывод данных (давно это было не помню) у него было одинаковое сопротивление в прямом и обратном направлении. Приблизительно через полтора месяца история повторилась и именно с датчиком в трубе. Результаты прозвонки приведены в таблице. Я так же решил прозвонить первый датчик из трубы и оказалось, что он рабочий я решил перепроверить подключил к контроллеру. Четыре дня без выключения датчик проработал без единого сбоя. А теперь вопросы: 1) Чем обусловлены чудеса с воскрешением первого датчика из трубы? 2) Почему два раза под ряд вышел из строя датчик из трубы а не на улице ведь датчики работают на одной шине? 3) Может ли это происходить из-за относительно высокой температуры в трубе (50 – 80С)? 4) Может из за частого опроса датчиков? 5) Эпоксидная смола в подогретом состоянии ни каким образом не может стать проводником? 6) Возможен ли вариант выхода из строя датчика через статическое электричество? ежедневно по трубе протекают тонны воды. http://www.alldatasheet.com/datasheet-pdf/pdf/58557/DALLAS/DS18B20.html
  21. Термометр На Pic16F628A

    Собрал термометр по схеме http://cxem.net/mc/mc33.php,Контроллер прошился нормально,всё б хорошо если б.Когда включаешь питание на индикаторе 0.1до тех пор пока не возьмёшся за контакты датчика пальцами тогда показывает как положено.Кто сталкивался с таким подскажите как решить эту проблемку?Хочется сей девайс в машинку вместо штатного показометра температуры.
  22. Вот по этой статье собрал девайс, и столкнулся с рядом проблем. 1)при температуре между 31-32°С я вижу на дисплее -225. 2) Гдето около 14°С показывает -63. 3)Температуру ниже 10°С не показывает вообще.Искал другие программы, и у них есть тоже свои недостатки, но ниже 10°С не показывает любая программа.Помогите, дайте совет по устранению данной проблемы
  23. Вопросы По At89S52

    1.Мне нужно управлять с помощью МК столбиком из 20 светодиодов используя не более 5 портов МК. Как это можно сделать ? 2.Как измерить температуру датчиком DS18B20 с помощью микроконтроллера AT89S52 ? (нужен пример кода на ассемблере).
  24. Здравствуйте. Решил изучать микроконтроллеры - пока знаний очень мало. Решил что первый проект хочу сделать - датчик температуры. После некоторых раздумий, решил что контроллер будет ATMega8. Для работы с самим железом у меня ничего нету (кроме паяльника, но им особо пользоваться не хочется ), и я не очень понимаю что мне нужно. Есть такая штука, но, я так понимаю надо будет этот шлейф как-то подключать к самому микроконтроллеру. Как это лучше организовать? Вроде продаются такие платы, где много дырочек (я с ними не работал ) я так понимаю, это на такой плате можно будет легко подключить программатор к мк? Как я понимая, датчику температуры (DS18B20) нужна будет термопара для измерений. Подойдёт ли для этого обычная термопара от мультиметра?
  25. Вопрос По Датчику Ds18B20

    Здравствуйте! Нужно подключить температурный датчик к GPS треккеру. В инструкции на трекер сказано следующее: В моем случае будет использоваться 1 датчик, т.е. значение конфигурационных регистров: Th=0; Tl=172. Как я понимаю, по дефолту значение Th=0; Tl=0. Прав ли я? Если да, то вопрос, кто может перепрошить датчик в Днепропетровске?