Страница 1 из 3
Ds18s20 + Динамический Led Индикатор...
Добавлено: Вс фев 06, 2011 00:03:28
КАШАК
Как организовать измерение температуры датчиком DS18B20 и динамическую индикацию? При использовании стандартной библиотеки CodeVision при измерении температуры индикация прекращается, как этого избежать?
Re: Ds18s20 + Динамический Led Индикатор...
Добавлено: Вс фев 06, 2011 01:20:57
driver_gv
КАШАК писал(а):Как организовать измерение температуры датчиком DS18B20 и динамическую индикацию? При использовании стандартной библиотеки CodeVision при измерении температуры индикация прекращается, как этого избежать?
Рабочий проект со схемой и исходниками
http://www.picping.narod.ru/termo.htm
Re: Ds18s20 + Динамический Led Индикатор...
Добавлено: Вс фев 06, 2011 15:35:15
IM1
КАШАК писал(а):Как организовать измерение температуры датчиком DS18B20 и динамическую индикацию?
Вопрос, конечно, интересный. Почему-то первый раз вижу такой (может просмотрел). Ведь 1wire синхронный интерфейс, в отличие от i2c, особо не постоишь. Приходится жертвовать либо качеством индикации (подмигивание) либо достоверностью данных.
Лично я делал так: обновление индикации было задано через каждые 3мс, операции с 1wire, которые не укладывались в этот период, принудительно разбивались на отрезки заведомо меньшие 3мс в тех местах, где 1wire может "постоять". К примеру, чтение температуры происходило в 4 этапа. Таким образом и индикация получалась идеально чистая получалась и данные не повреждались.
Уважаемый driver_gv, не могли бы Вы в двух словах пояснить суть Вашего метода, а то фразы типа: "покажем индикатор полностью за 9 проходов" не совсем понятны.
Re: Ds18s20 + Динамический Led Индикатор...
Добавлено: Вс фев 06, 2011 16:38:07
ChipKiller
КАШАК писал(а):При использовании стандартной библиотеки CodeVision при измерении температуры индикация прекращается, как этого избежать?
... динамическая индикация подразумевает использование прерываний. Самая длительная процедура для Ds18s20 - это сброс. Занимает около 1мс. При этом ответ МК получает где то за 650мкс. Поэтому если делать без особых "извращений", то при тиках таймера на частоте ниже 1КГц - все должно работать. Посмотрите есть ли запрет прерываний в стандартной библиотеке CodeVision при работе с Ds18s20 - ИМХО дело как раз в прерываниях.
Re: Ds18s20 + Динамический Led Индикатор...
Добавлено: Вс фев 06, 2011 16:57:54
КАШАК
Вот так работает без мигания:
Код: Выделить всё
/*****************************************************
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мс.
Re: Ds18s20 + Динамический Led Индикатор...
Добавлено: Вс фев 06, 2011 17:23:36
ChipKiller
КАШАК писал(а):При использовании стандартной библиотеки CodeVision при измерении температуры индикация прекращается, как этого избежать?
КАШАК писал(а):Вот так работает без мигания:
... так в чем проблема то?
Re: Ds18s20 + Динамический Led Индикатор...
Добавлено: Вс фев 06, 2011 18:01:53
O-LED
Вот тут мне подсказали как помирить дс1820 и дин индикацию -
http://radiokot.ru/forum/viewtopic.php?f=20&t=37594
driver_gv а если выкинуть лишнее

Re: Ds18s20 + Динамический Led Индикатор...
Добавлено: Вс фев 06, 2011 18:07:05
O-LED
driver_gv даже вот так

Re: Ds18s20 + Динамический Led Индикатор...
Добавлено: Вс фев 06, 2011 19:51:03
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 Гц. С таким периодом обновления будут очень заметно мерцание. ИМХО
Re: Ds18s20 + Динамический Led Индикатор...
Добавлено: Вс фев 06, 2011 20:34:13
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 микросеунд при запрещенном прерывании. В паузах между байтами, по таймеру если пришло время, обрабатывается индикатор. Ничего не мерцает.
Re: Ds18s20 + Динамический Led Индикатор...
Добавлено: Вс фев 06, 2011 21:20:35
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 мс макс. длительности", не более того.
Re: Ds18s20 + Динамический Led Индикатор...
Добавлено: Вс фев 06, 2011 21:34:50
driver_gv
IM1 писал(а):Вы, кстати, не ответили о сути Вашего метода и фразы типа: "покажем индикатор полностью за 9 проходов".
Надо читать за три прохода,
сначала был 9-разрядный индикатор. (часы+ температура)
В каждом проходе зажигаем только 1 знакоместо. В итоге за три прохода будут пройдены все знакоместа.
IM1 писал(а):Представьте, что длина байта 600 мкс, Вы запретили прерывания, а через 100 мкс пришел запрос от таймера и обработать Вы его сможете только через 500 мкс, когда разрешите прерывание, вот Вам и мерцание
Никто не мешает после обработки одного байта на шине дождаться прерывания, а потом продолжить.
Re: Ds18s20 + Динамический Led Индикатор...
Добавлено: Вс фев 06, 2011 22:23:50
IM1
driver_gv писал(а):Надо читать за три прохода,
сначала был 9-разрядный индикатор. (часы+ температура)
Понял, спасибо.
driver_gv писал(а):
Никто не мешает после обработки одного байта на шине дождаться прерывания, а потом продолжить.
Никто не мешает. Вот мы и перешли к моему методу, просто у Вас получается частный случай: 1 такт индикации=1 байт 1wire. 10 байт=20-30 мс.
А почему бы и нет!
Re: Ds18s20 + Динамический Led Индикатор...
Добавлено: Вс фев 06, 2011 22:59:39
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 писал(а):Вот мы и перешли к моему методу
.... действительно метод
ФЛЕЙМА легко узнаваем

Re: Ds18s20 + Динамический Led Индикатор...
Добавлено: Вс фев 06, 2011 23:16:28
КАШАК
У меня при 5мс мерцания не заметно, сейчас устройство собрано на макетке,отлично работает

Re: Ds18s20 + Динамический Led Индикатор...
Добавлено: Вс фев 06, 2011 23:18:51
ARV
Друзья мои! как же вы задолбали одним и тем же!
запомните раз и навсегда и давайте почитать нижеследующие строки всем, кто начнет изучать 1-wire:
критически важным интервалом времени для гарантированно надежного обмена по 1-wire (на стандартной скорости) является интервал в 15-17 микросекунд. обратите внимание - МИКРОсекунд, не МИЛЛИ!!!! поэтому задержка динамической индикации на столь короткий интервал (путем обязательного запрета всех прерываний на это время) будет абсолютно незаметна!
для обмена по 1-wire не требуется запрещать прерывания на бОльший интервал!
ваши проблемы в том, что вы слепо доверяете CodeVision, и ленитесь ручками написать свои собственные функции для работы с 1-wire. а ведь это совсем не сложно! к тому же есть просто МОРЕ отличных, грамотно составленных готовых библиотек!
Re: Ds18s20 + Динамический Led Индикатор...
Добавлено: Вс фев 06, 2011 23:27:59
КАШАК
А где такие библиотеки взять?
Re: Ds18s20 + Динамический Led Индикатор...
Добавлено: Вс фев 06, 2011 23:31:07
ARV
КАШАК писал(а):А где такие библиотеки взять?
в караганде.
лично я раз 40 давал разные ссылки на этом форуме. кроме меня это делали еще не меньше десятка человек. а кроме этого есть еще гугл - вас там забанили? у меня терпения меньше, чем у гугла повторять стопервый раз одно и то же...
Re: Ds18s20 + Динамический Led Индикатор...
Добавлено: Вс фев 06, 2011 23:51:58
КАШАК
Перед тем как спросить, я уже искал в гугле...
Re: Ds18s20 + Динамический Led Индикатор...
Добавлено: Вс фев 06, 2011 23:54:12
ARV
КАШАК писал(а):Перед тем как спросить, я уже искал в гугле...
так поищите на форуме.