Ds18s20 + Динамический Led Индикатор...

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик

Сообщение КАШАК »

Как организовать измерение температуры датчиком DS18B20 и динамическую индикацию? При использовании стандартной библиотеки CodeVision при измерении температуры индикация прекращается, как этого избежать?
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Контактная информация:
Реклама
Потрогал лапой паяльник
Сообщения: 399
Зарегистрирован: Сб авг 08, 2009 23:02:57
Откуда: Ростов-на-Дону

Сообщение driver_gv »

КАШАК писал(а):Как организовать измерение температуры датчиком DS18B20 и динамическую индикацию? При использовании стандартной библиотеки CodeVision при измерении температуры индикация прекращается, как этого избежать?
Рабочий проект со схемой и исходниками http://www.picping.narod.ru/termo.htm
__________________
Все, что нельзя запрограммировать на ассемблере, приходится паять
Контактная информация:
Реклама
IM1
Грызет канифоль
Аватара пользователя
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

Сообщение IM1 »

КАШАК писал(а):Как организовать измерение температуры датчиком DS18B20 и динамическую индикацию?
Вопрос, конечно, интересный. Почему-то первый раз вижу такой (может просмотрел). Ведь 1wire синхронный интерфейс, в отличие от i2c, особо не постоишь. Приходится жертвовать либо качеством индикации (подмигивание) либо достоверностью данных.
Лично я делал так: обновление индикации было задано через каждые 3мс, операции с 1wire, которые не укладывались в этот период, принудительно разбивались на отрезки заведомо меньшие 3мс в тех местах, где 1wire может "постоять". К примеру, чтение температуры происходило в 4 этапа. Таким образом и индикация получалась идеально чистая получалась и данные не повреждались.
driver_gv писал(а):Рабочий проект со схемой и исходниками http://www.picping.narod.ru/termo.htm
Уважаемый driver_gv, не могли бы Вы в двух словах пояснить суть Вашего метода, а то фразы типа: "покажем индикатор полностью за 9 проходов" не совсем понятны.
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

КАШАК писал(а):При использовании стандартной библиотеки CodeVision при измерении температуры индикация прекращается, как этого избежать?
... динамическая индикация подразумевает использование прерываний. Самая длительная процедура для Ds18s20 - это сброс. Занимает около 1мс. При этом ответ МК получает где то за 650мкс. Поэтому если делать без особых "извращений", то при тиках таймера на частоте ниже 1КГц - все должно работать. Посмотрите есть ли запрет прерываний в стандартной библиотеке CodeVision при работе с Ds18s20 - ИМХО дело как раз в прерываниях.
Реклама
Эиком - электронные компоненты и радиодетали
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик

Сообщение КАШАК »

Вот так работает без мигания:

Код: Выделить всё

/*****************************************************
Chip type           : ATmega16
Program type        : Application
Clock frequency     : 8,000000 MHz
Memory model        : Small
External RAM size   : 0
Data Stack size     : 256
*****************************************************/

#include <mega16.h>

#asm
   .equ __w1_port=0x18 ;PORTB
   .equ __w1_bit=0
#endasm
#include <ds1820.h>

unsigned char digits[13]={
//0bHGFEDCBA
  0b00111111,       // 0
  0b00000110,       // 1
  0b01011011,       // 2
  0b01001111,       // 3
  0b01100110,       // 4
  0b01101101,       // 5
  0b01111101,       // 6
  0b00000111,       // 7
  0b01111111,       // 8
  0b01101111,       // 9
  0b01000000,       // -
  0b01100011,       // °
  0b00000000        //
};

#define MAX_DS1820 8

unsigned char rom_code[MAX_DS1820][9];

unsigned char devices=0, i=0;
int temp=0;

int d1=0, d2=0, d3=0, d4=0;
int a=0, b=0;

void tem(void)
{
 devices=w1_search(0xf0,rom_code);

 if(devices>0){
    if(devices>1){i++;
        if(i>devices){i=0;}
    }else{i=0;}

    temp=ds1820_temperature_10(&rom_code[i][0]);    // Чтение температуры
    if (temp>1000){                                 // если датчик выдаёт больше 1000
    temp=4096-temp;                                 // отнимаем от данных 4096
    d1=10;                                          // и ставим знак "минус"
    }else{
    d1=12;
    }
    temp=temp/10;

    d2=temp/10;
    d3=temp%10;
    d4=11;
    }
}

interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
    b++;

    PORTA=0;
    switch (a){
    case 1: PORTC=0b00001110; PORTA=digits[d4]; break;       //подаём питание на разряд 1
    case 2: PORTC=0b00001101; PORTA=digits[d3]; break;       //подаём питание на разряд 2
    case 3: PORTC=0b00001011; PORTA=digits[d2]; break;       //подаём питание на разряд 3
    case 4: PORTC=0b00000111; PORTA=digits[d1]; a=0; break;  //подаём питание на разряд 4
    }
    a++;
}

void main(void)
{
PORTA=0x00; DDRA=0xFF;

PORTB=0x00; DDRB=0x00;

PORTC=0x00; DDRC=0xFF;

PORTD=0x00; DDRD=0xFF;

TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

TCCR1A=0x00;
TCCR1B=0x0B;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x02;
OCR1AL=0x71;
OCR1BH=0x00;
OCR1BL=0x00;

ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

MCUCR=0x00;
MCUCSR=0x00;

TIMSK=0x10;

ACSR=0x80;
SFIOR=0x00;

devices=w1_search(0xf0,rom_code);

#asm("sei")

while (1)
      {
    if(b==200){     // Опрос датчиков раз в секунду
      tem();
      b=0;
    }
      };
}
Таймер тикает каждые 5мс.
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Контактная информация:
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

КАШАК писал(а):При использовании стандартной библиотеки CodeVision при измерении температуры индикация прекращается, как этого избежать?
КАШАК писал(а):Вот так работает без мигания:
... так в чем проблема то?
Реклама
Мудрый кот
Аватара пользователя
Сообщения: 1800
Зарегистрирован: Вт окт 05, 2010 01:08:57

Сообщение O-LED »

Вот тут мне подсказали как помирить дс1820 и дин индикацию - http://radiokot.ru/forum/viewtopic.php?f=20&t=37594

driver_gv а если выкинуть лишнее :roll:
Вложения
termo.GIF
(26.06 КБ) 442 скачивания
KIT
Контактная информация:
Мудрый кот
Аватара пользователя
Сообщения: 1800
Зарегистрирован: Вт окт 05, 2010 01:08:57

Сообщение O-LED »

driver_gv даже вот так :roll:
Вложения
termo.GIF
(24.86 КБ) 450 скачиваний
KIT
Контактная информация:
IM1
Грызет канифоль
Аватара пользователя
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

Сообщение IM1 »

ChipKiller писал(а):
КАШАК писал(а):При использовании стандартной библиотеки CodeVision при измерении температуры индикация прекращается, как этого избежать?
... динамическая индикация подразумевает использование прерываний. Самая длительная процедура для Ds18s20 - это сброс. Занимает около 1мс. При этом ответ МК получает где то за 650мкс. Поэтому если делать без особых "извращений", то при тиках таймера на частоте ниже 1КГц - все должно работать. Посмотрите есть ли запрет прерываний в стандартной библиотеке CodeVision при работе с Ds18s20 - ИМХО дело как раз в прерываниях.
Как все здорово у Вас и ловко получается. А взять карандашик и посчитать, никак? Ладно, я помогу: временной слот определен стандартом от 60 до 120 мкс, промежуток между слотами от 1 мкс до бесконечности. Берем за слот с учетом промежутков 120 мкс, так как надо и другие вещи программой делать, например клавиши опрашивать или температуру регулировать. Теперь возьмем две необходимые в хозяйстве команды и посчитаем их длительность: match_rom 8bit +64 bit ROM code =72bit*120=8640 мкс=8,64 мс; Read Scratchpad 8bit +72bit data bytes=80bit*120=9600 мкс=9,6 мс. Что скажет на это Ваше ИМХО? Есть конечно путь к сокращению времени, например каждый датчик вешать на отдельный вывод МК и не считать CRC. Но это не совсем айс, да и недостоверные данные, эт на любителя :) .
КАШАК писал(а):Таймер тикает каждые 5мс.
5*4=20 мс = 50 Гц. С таким периодом обновления будут очень заметно мерцание. ИМХО
Потрогал лапой паяльник
Сообщения: 399
Зарегистрирован: Сб авг 08, 2009 23:02:57
Откуда: Ростов-на-Дону

Сообщение driver_gv »

IM1 писал(а):Как все здорово у Вас и ловко получается. А взять карандашик и посчитать, никак? Ладно, я помогу: временной слот определен стандартом от 60 до 120 мкс, промежуток между слотами от 1 мкс до бесконечности. Берем за слот с учетом промежутков 120 мкс, так как надо и другие вещи программой делать, например клавиши опрашивать или температуру регулировать. Теперь возьмем две необходимые в хозяйстве команды и посчитаем их длительность: match_rom 8bit +64 bit ROM code =72bit*120=8640 мкс=8,64 мс; Read Scratchpad 8bit +72bit data bytes=80bit*120=9600 мкс=9,6 мс.
Подход неверен. Кто сказал ,что во время обмена нельзя вклинить обработку динамической индикации.

Динамическая индикация организовывается по прерыванию таймера 2-3 мс.
На время общения по шине 1-Wire запрещаются прерывания при обработке 8 бит, потом снова разрешаются.
Получаем байтовый обмен со средним временем работы с шиной 500-600 микросеунд при запрещенном прерывании. В паузах между байтами, по таймеру если пришло время, обрабатывается индикатор. Ничего не мерцает.
__________________
Все, что нельзя запрограммировать на ассемблере, приходится паять
Контактная информация:
IM1
Грызет канифоль
Аватара пользователя
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

Сообщение IM1 »

driver_gv писал(а):
IM1 писал(а):Как все здорово у Вас и ловко получается. А взять карандашик и посчитать, никак? Ладно, я помогу: временной слот определен стандартом от 60 до 120 мкс, промежуток между слотами от 1 мкс до бесконечности. Берем за слот с учетом промежутков 120 мкс, так как надо и другие вещи программой делать, например клавиши опрашивать или температуру регулировать. Теперь возьмем две необходимые в хозяйстве команды и посчитаем их длительность: match_rom 8bit +64 bit ROM code =72bit*120=8640 мкс=8,64 мс; Read Scratchpad 8bit +72bit data bytes=80bit*120=9600 мкс=9,6 мс.
Подход неверен. Кто сказал ,что во время обмена нельзя вклинить обработку динамической индикации.

Динамическая индикация организовывается по прерыванию таймера 2-3 мс.
На время общения по шине 1-Wire запрещаются прерывания при обработке 8 бит, потом снова разрешаются.
Получаем байтовый обмен со средним временем работы с шиной 500-600 микросеунд при запрещенном прерывании. В паузах между байтами, по таймеру если пришло время, обрабатывается индикатор. Ничего не мерцает.
А прочитайте мой пост (Вс фев 06, 2011 15:35:15) в этой теме, я как раз и говорил о том же самом. Только надо ограничивать кол-во байтов принудительно, а не просто играться разрешением-запрещением прерывания. Представьте, что длина байта 600 мкс, Вы запретили прерывания, а через 100 мкс пришел запрос от таймера и обработать Вы его сможете только через 500 мкс, когда разрешите прерывание, вот Вам и мерцание. Вы, кстати, не ответили о сути Вашего метода и фразы типа: "покажем индикатор полностью за 9 проходов".
А последний мой пост, который Вы цитировали, это ответ ChipKiller-у про "1 мс макс. длительности", не более того.
Потрогал лапой паяльник
Сообщения: 399
Зарегистрирован: Сб авг 08, 2009 23:02:57
Откуда: Ростов-на-Дону

Сообщение driver_gv »

IM1 писал(а):Вы, кстати, не ответили о сути Вашего метода и фразы типа: "покажем индикатор полностью за 9 проходов".
Надо читать за три прохода,
сначала был 9-разрядный индикатор. (часы+ температура)
В каждом проходе зажигаем только 1 знакоместо. В итоге за три прохода будут пройдены все знакоместа.
IM1 писал(а):Представьте, что длина байта 600 мкс, Вы запретили прерывания, а через 100 мкс пришел запрос от таймера и обработать Вы его сможете только через 500 мкс, когда разрешите прерывание, вот Вам и мерцание
Никто не мешает после обработки одного байта на шине дождаться прерывания, а потом продолжить.
__________________
Все, что нельзя запрограммировать на ассемблере, приходится паять
Контактная информация:
IM1
Грызет канифоль
Аватара пользователя
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

Сообщение IM1 »

driver_gv писал(а):Надо читать за три прохода,
сначала был 9-разрядный индикатор. (часы+ температура)
Понял, спасибо.
driver_gv писал(а): Никто не мешает после обработки одного байта на шине дождаться прерывания, а потом продолжить.
Никто не мешает. Вот мы и перешли к моему методу, просто у Вас получается частный случай: 1 такт индикации=1 байт 1wire. 10 байт=20-30 мс.
А почему бы и нет!
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

IM1 писал(а):Как все здорово у Вас и ловко получается. А взять карандашик и посчитать, никак? Ладно, я помогу: временной слот определен стандартом от 60 до 120 мкс, промежуток между слотами от 1 мкс до бесконечности. Берем за слот с учетом промежутков 120 мкс, так как надо и другие вещи программой делать, например клавиши опрашивать или температуру регулировать. Теперь возьмем две необходимые в хозяйстве команды и посчитаем их длительность: match_rom 8bit +64 bit ROM code =72bit*120=8640 мкс=8,64 мс; Read Scratchpad 8bit +72bit data bytes=80bit*120=9600 мкс=9,6 мс.
IM1 писал(а):Вот мы и перешли к моему методу
.... действительно метод ФЛЕЙМА легко узнаваем :)))
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик

Сообщение КАШАК »

У меня при 5мс мерцания не заметно, сейчас устройство собрано на макетке,отлично работает :)
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Друзья мои! как же вы задолбали одним и тем же!

запомните раз и навсегда и давайте почитать нижеследующие строки всем, кто начнет изучать 1-wire:
критически важным интервалом времени для гарантированно надежного обмена по 1-wire (на стандартной скорости) является интервал в 15-17 микросекунд. обратите внимание - МИКРОсекунд, не МИЛЛИ!!!! поэтому задержка динамической индикации на столь короткий интервал (путем обязательного запрета всех прерываний на это время) будет абсолютно незаметна!

для обмена по 1-wire не требуется запрещать прерывания на бОльший интервал!

ваши проблемы в том, что вы слепо доверяете CodeVision, и ленитесь ручками написать свои собственные функции для работы с 1-wire. а ведь это совсем не сложно! к тому же есть просто МОРЕ отличных, грамотно составленных готовых библиотек!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик

Сообщение КАШАК »

А где такие библиотеки взять?
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

КАШАК писал(а):А где такие библиотеки взять?
в караганде.

лично я раз 40 давал разные ссылки на этом форуме. кроме меня это делали еще не меньше десятка человек. а кроме этого есть еще гугл - вас там забанили? у меня терпения меньше, чем у гугла повторять стопервый раз одно и то же...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик

Сообщение КАШАК »

Перед тем как спросить, я уже искал в гугле...
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

КАШАК писал(а):Перед тем как спросить, я уже искал в гугле...
так поищите на форуме.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»