Ds18s20 + Динамический Led Индикатор...
- Сообщения: 1303
- Зарегистрирован: Вс апр 19, 2009 17:20:22
- Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Как организовать измерение температуры датчиком DS18B20 и динамическую индикацию? При использовании стандартной библиотеки CodeVision при измерении температуры индикация прекращается, как этого избежать?
Опыт растет прямо пропорционально выведенному из строя оборудованию...
- Реклама
Рабочий проект со схемой и исходниками http://www.picping.narod.ru/termo.htmКАШАК писал(а):Как организовать измерение температуры датчиком DS18B20 и динамическую индикацию? При использовании стандартной библиотеки CodeVision при измерении температуры индикация прекращается, как этого избежать?
__________________
Все, что нельзя запрограммировать на ассемблере, приходится паять
Все, что нельзя запрограммировать на ассемблере, приходится паять
Вопрос, конечно, интересный. Почему-то первый раз вижу такой (может просмотрел). Ведь 1wire синхронный интерфейс, в отличие от i2c, особо не постоишь. Приходится жертвовать либо качеством индикации (подмигивание) либо достоверностью данных.КАШАК писал(а):Как организовать измерение температуры датчиком DS18B20 и динамическую индикацию?
Лично я делал так: обновление индикации было задано через каждые 3мс, операции с 1wire, которые не укладывались в этот период, принудительно разбивались на отрезки заведомо меньшие 3мс в тех местах, где 1wire может "постоять". К примеру, чтение температуры происходило в 4 этапа. Таким образом и индикация получалась идеально чистая получалась и данные не повреждались.
Уважаемый driver_gv, не могли бы Вы в двух словах пояснить суть Вашего метода, а то фразы типа: "покажем индикатор полностью за 9 проходов" не совсем понятны.driver_gv писал(а):Рабочий проект со схемой и исходниками http://www.picping.narod.ru/termo.htm
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
... динамическая индикация подразумевает использование прерываний. Самая длительная процедура для Ds18s20 - это сброс. Занимает около 1мс. При этом ответ МК получает где то за 650мкс. Поэтому если делать без особых "извращений", то при тиках таймера на частоте ниже 1КГц - все должно работать. Посмотрите есть ли запрет прерываний в стандартной библиотеке CodeVision при работе с Ds18s20 - ИМХО дело как раз в прерываниях.КАШАК писал(а):При использовании стандартной библиотеки CodeVision при измерении температуры индикация прекращается, как этого избежать?
- Сообщения: 1303
- Зарегистрирован: Вс апр 19, 2009 17:20:22
- Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Вот так работает без мигания:
Таймер тикает каждые 5мс.
Код: Выделить всё
/*****************************************************
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;
}
};
}Опыт растет прямо пропорционально выведенному из строя оборудованию...
- Реклама
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
КАШАК писал(а):При использовании стандартной библиотеки CodeVision при измерении температуры индикация прекращается, как этого избежать?
... так в чем проблема то?КАШАК писал(а):Вот так работает без мигания:
- Сообщения: 1800
- Зарегистрирован: Вт окт 05, 2010 01:08:57
Вот тут мне подсказали как помирить дс1820 и дин индикацию - http://radiokot.ru/forum/viewtopic.php?f=20&t=37594
driver_gv а если выкинуть лишнее
driver_gv а если выкинуть лишнее
- Вложения
-
- termo.GIF
- (26.06 КБ) 442 скачивания
KIT
Как все здорово у Вас и ловко получается. А взять карандашик и посчитать, никак? Ладно, я помогу: временной слот определен стандартом от 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. Но это не совсем айс, да и недостоверные данные, эт на любителяChipKiller писал(а):... динамическая индикация подразумевает использование прерываний. Самая длительная процедура для Ds18s20 - это сброс. Занимает около 1мс. При этом ответ МК получает где то за 650мкс. Поэтому если делать без особых "извращений", то при тиках таймера на частоте ниже 1КГц - все должно работать. Посмотрите есть ли запрет прерываний в стандартной библиотеке CodeVision при работе с Ds18s20 - ИМХО дело как раз в прерываниях.КАШАК писал(а):При использовании стандартной библиотеки CodeVision при измерении температуры индикация прекращается, как этого избежать?
5*4=20 мс = 50 Гц. С таким периодом обновления будут очень заметно мерцание. ИМХОКАШАК писал(а):Таймер тикает каждые 5мс.
Подход неверен. Кто сказал ,что во время обмена нельзя вклинить обработку динамической индикации.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 проходов".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 микросеунд при запрещенном прерывании. В паузах между байтами, по таймеру если пришло время, обрабатывается индикатор. Ничего не мерцает.
А последний мой пост, который Вы цитировали, это ответ ChipKiller-у про "1 мс макс. длительности", не более того.
Надо читать за три прохода,IM1 писал(а):Вы, кстати, не ответили о сути Вашего метода и фразы типа: "покажем индикатор полностью за 9 проходов".
сначала был 9-разрядный индикатор. (часы+ температура)
В каждом проходе зажигаем только 1 знакоместо. В итоге за три прохода будут пройдены все знакоместа.
Никто не мешает после обработки одного байта на шине дождаться прерывания, а потом продолжить.IM1 писал(а):Представьте, что длина байта 600 мкс, Вы запретили прерывания, а через 100 мкс пришел запрос от таймера и обработать Вы его сможете только через 500 мкс, когда разрешите прерывание, вот Вам и мерцание
__________________
Все, что нельзя запрограммировать на ассемблере, приходится паять
Все, что нельзя запрограммировать на ассемблере, приходится паять
Понял, спасибо.driver_gv писал(а):Надо читать за три прохода,
сначала был 9-разрядный индикатор. (часы+ температура)
Никто не мешает. Вот мы и перешли к моему методу, просто у Вас получается частный случай: 1 такт индикации=1 байт 1wire. 10 байт=20-30 мс.driver_gv писал(а): Никто не мешает после обработки одного байта на шине дождаться прерывания, а потом продолжить.
А почему бы и нет!
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
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мс мерцания не заметно, сейчас устройство собрано на макетке,отлично работает 
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Друзья мои! как же вы задолбали одним и тем же!
запомните раз и навсегда и давайте почитать нижеследующие строки всем, кто начнет изучать 1-wire:
критически важным интервалом времени для гарантированно надежного обмена по 1-wire (на стандартной скорости) является интервал в 15-17 микросекунд. обратите внимание - МИКРОсекунд, не МИЛЛИ!!!! поэтому задержка динамической индикации на столь короткий интервал (путем обязательного запрета всех прерываний на это время) будет абсолютно незаметна!
для обмена по 1-wire не требуется запрещать прерывания на бОльший интервал!
ваши проблемы в том, что вы слепо доверяете CodeVision, и ленитесь ручками написать свои собственные функции для работы с 1-wire. а ведь это совсем не сложно! к тому же есть просто МОРЕ отличных, грамотно составленных готовых библиотек!
запомните раз и навсегда и давайте почитать нижеследующие строки всем, кто начнет изучать 1-wire:
критически важным интервалом времени для гарантированно надежного обмена по 1-wire (на стандартной скорости) является интервал в 15-17 микросекунд. обратите внимание - МИКРОсекунд, не МИЛЛИ!!!! поэтому задержка динамической индикации на столь короткий интервал (путем обязательного запрета всех прерываний на это время) будет абсолютно незаметна!
для обмена по 1-wire не требуется запрещать прерывания на бОльший интервал!
ваши проблемы в том, что вы слепо доверяете CodeVision, и ленитесь ручками написать свои собственные функции для работы с 1-wire. а ведь это совсем не сложно! к тому же есть просто МОРЕ отличных, грамотно составленных готовых библиотек!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 1303
- Зарегистрирован: Вс апр 19, 2009 17:20:22
- Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
А где такие библиотеки взять?
Опыт растет прямо пропорционально выведенному из строя оборудованию...
в караганде.КАШАК писал(а):А где такие библиотеки взять?
лично я раз 40 давал разные ссылки на этом форуме. кроме меня это делали еще не меньше десятка человек. а кроме этого есть еще гугл - вас там забанили? у меня терпения меньше, чем у гугла повторять стопервый раз одно и то же...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 1303
- Зарегистрирован: Вс апр 19, 2009 17:20:22
- Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Перед тем как спросить, я уже искал в гугле...
Опыт растет прямо пропорционально выведенному из строя оборудованию...
так поищите на форуме.КАШАК писал(а):Перед тем как спросить, я уже искал в гугле...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!


