Форум РадиоКот https://radiokot.ru/forum/ |
|
Проблема с ds1820... https://radiokot.ru/forum/viewtopic.php?f=20&t=45400 |
Страница 1 из 2 |
Автор: | КАШАК [ Вс мар 27, 2011 01:12:57 ] | ||
Заголовок сообщения: | Проблема с ds1820... | ||
Есть вот такая схема: Она не хочет читать температуру с ds1820. Вот код программы: Код: /***************************************************** 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> #include <delay.h> #asm .equ __w1_port=0x18 ;PORTB .equ __w1_bit=0 #endasm #include <1wire.h> #include <ds1820.h> flash char buf[24] = { // массив с цифрами //ABCDEFGH 0b00000011, //0 0b10011111, //1 0b00100101, //2 0b00001101, //3 0b10011001, //4 0b01001001, //5 0b01000001, //6 0b00011111, //7 0b00000001, //8 0b00001001, //9 0b00111001, //° 0b11111101, //- 0b11111111, // 0b00000010, //0. 0b10011110, //1. 0b00100100, //2. 0b00001100, //3. 0b10011000, //4. 0b01001000, //5. 0b01000000, //6. 0b00011110, //7. 0b00000000, //8. 0b00001000, //9. 0b00111000 //°. }; int digit_out[8], cur_dig; int temp, t, devices; int d1=0, d2=0, d3=0, d4=0, d5=0, d6=0, d7=0, d8=0; void tem(void) { if(devices>0){ temp=ds1820_temperature_10(0); temp=temp/10; if(temp>1000){ teьз=temp-4096; d1=11; }else{ d1=12; } d2=temp/10; d3=temp%10; d4=23; } } void hc164_wr(unsigned char dig1, unsigned char dig2){ //подпрограмма вывода данных в регистр unsigned char a; for(a=0; a<8; a++){ //цикл для вывода 8 бит данных из массива PORTD.1=buf[dig1] & 1<<a; //выводим в линию DATA1 текущий бит PORTD.0=buf[dig2] & 1<<a; //выводим в линию DATA2 текущий бит PORTD.2=0; //опускаем линию CLK в лог.0 PORTD.2=1; //поднимаем линию CLK в лог.1 } } interrupt [TIM1_COMPA] void timer1_compa_isr(void) { t++; digit_out[0]=d1; digit_out[1]=d2; digit_out[2]=d3; digit_out[3]=d4; digit_out[4]=d5; digit_out[5]=d6; digit_out[6]=d7; digit_out[7]=d8; switch (cur_dig){ case 0: PORTC=0; hc164_wr(digit_out[cur_dig], digit_out[cur_dig+4]); PORTC=0b00010001; break; case 1: PORTC=0; hc164_wr(digit_out[cur_dig], digit_out[cur_dig+4]); PORTC=0b00100010; break; case 2: PORTC=0; hc164_wr(digit_out[cur_dig], digit_out[cur_dig+4]); PORTC=0b01000100; break; case 3: PORTC=0; hc164_wr(digit_out[cur_dig], digit_out[cur_dig+4]); PORTC=0b10001000; break; } cur_dig++; if(cur_dig>3){cur_dig=0;} } void main(void) { PORTA=0x00; DDRA=0x00; PORTB=0x00; DDRB=0x00; PORTC=0x00; DDRC=0xFF; PORTD=0x00; DDRD=0x07; TCCR0=0x00; TCNT0=0x00; OCR0=0x00; TCCR1A=0x00; TCCR1B=0x0B; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0xFA; OCR1BH=0x00; OCR1BL=0x00; ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00; MCUCR=0x00; MCUCSR=0x00; TIMSK=0x10; ACSR=0x80; SFIOR=0x00; devices=w1_init(); #asm("sei") while (1) { if(t>=500){tem(); t=0;} // Читаем температуру раз в секунду }; } Все время светится 85 или что-то непонятное, в протеусе все работает нормально. Без 74HC164, тоже работало нормально. Если вызов функции чтения температуры из цикла перенести в таймер, то чтение происходит нормально, но индикация пропадает ![]()
|
Автор: | КАШАК [ Вс мар 27, 2011 02:01:03 ] |
Заголовок сообщения: | Re: Проблема с ds1820... |
Вообще никаких идей?... |
Автор: | ChipKiller [ Вс мар 27, 2011 08:47:05 ] |
Заголовок сообщения: | Re: Проблема с ds1820... |
КАШАК писал(а): Если вызов функции чтения температуры из цикла перенести в таймер, то чтение происходит нормально, но индикация пропадает ![]() КАШАК писал(а): Вообще никаких идей?.. "идея" и ответ содержатся в первом вопросе - проблема в прерываниях.
|
Автор: | ksv82 [ Вс мар 27, 2011 09:42:00 ] |
Заголовок сообщения: | Re: Проблема с ds1820... |
Чего то я не понял, в библиотечке ds1820.h функция ds1820_temperature_10() сама преобразование запускает в термометре или это нужно делать принудительно? Если сама, то надо порыскать на тему того, как она это делает - в случае когда у вас постоянно выводится +85С, судя по всему, температура считывается(но, все таки в этом тоже стоит убедится - оторвать градусник и посмотреть что будет. Если ничего не изменится то.. дело было не в бобине:) ), но конвертирование температуры никто почему то не запускает и градусник выдает постоянно исходное значение температуры, которое в нем всегда находится при включении. Кстати на счет оторвать градусник... зря вы в своей программе проверяете его наличие только при включении. А что будет если он отвалится? Лучше кажый раз смотреть есть ли что на линии... а еще лучше найти datasheet на датчик - там все прекрасно описано, есть и блок -схема оптимального алгоритма обмена данными и последовательность комманд, и куча другой полезной информации... Блин.... чего то я торможу. Вы в курсе что такое протокол 1-wire? Если нет, то советую прочесть - http://radiokot.ru/articles/13/ Отличное руководство, сам когда писал программку на асме им пользовался. Так вот, для 1-wire огромное значение имеет задержка даже на 30-40мкс. Вот выставили вы шину в 0, приготовились читать значение на шине, а тут БАЦ и всунулось прерывание. Вот и конец всей посылке. А вот на счет таймера я как то не понял - TCCR1B=0x0B; Зачем Waveform Generation Mode включать? При настройке регистров лучше все писать в виде TCCR1B =(1 << CS11) | (1 << CS10); компилятор один хрен все к виду TCCR1B=0x0B переделает, но читабельность возрастает на порядок. |
Автор: | Alex-Electron [ Вс мар 27, 2011 11:12:50 ] |
Заголовок сообщения: | Re: Проблема с ds1820... |
Здравствуйте, КАШАК. Я как-то делал термометр, но на Atmega48, тогда ещё не использовал сдвиговый регистр, а развесил всё прямо на МК (есть моделька для Протеуса). Код получился довольно компактный, для работы с датчиком нашёл какую-то библиотеку, она была великовата и я её поправил. Если вам нужно, могу скинуть свой проектик (на Си) (коменты имеются) + модель для Протеуса. Тестил в реале - работает безотказно. З.Ы. Если что, пишите в ЛК. |
Автор: | КАШАК [ Вс мар 27, 2011 14:40:09 ] |
Заголовок сообщения: | Re: Проблема с ds1820... |
Насчет проверки наличия датчиков: это только часть программы, потом добавится проверка и чтение с двух датчиков ![]() |
Автор: | ChipKiller [ Вс мар 27, 2011 15:06:05 ] |
Заголовок сообщения: | Re: Проблема с ds1820... |
КАШАК писал(а): Только никак не могу понять, почему эта программа работала с обычной динамической индикацией, а с 74HC164 не хочет? Ведь "тики" таймера и прерывания остались прежними... ... для начала "подчистите" код - напримерКод: switch (cur_dig){ можно записатьcase 0: PORTC=0; hc164_wr(digit_out[cur_dig], digit_out[cur_dig+4]); PORTC=0b00010001; break; case 1: PORTC=0; hc164_wr(digit_out[cur_dig], digit_out[cur_dig+4]); PORTC=0b00100010; break; case 2: PORTC=0; hc164_wr(digit_out[cur_dig], digit_out[cur_dig+4]); PORTC=0b01000100; break; case 3: PORTC=0; hc164_wr(digit_out[cur_dig], digit_out[cur_dig+4]); PORTC=0b10001000; break; } Код: switch (cur_dig){ PORTC=0; hc164_wr(digit_out[cur_dig], digit_out[cur_dig+4]); case 0: PORTC=0b00010001; break; case 1: PORTC=0b00100010; break; case 2: PORTC=0b01000100; break; case 3: PORTC=0b10001000; } ... а чтобы найти ошибку - поставьте BreakPoint в функцию вывода |
Автор: | КАШАК [ Вс мар 27, 2011 16:23:45 ] |
Заголовок сообщения: | Re: Проблема с ds1820... |
ChipKiller писал(а): КАШАК писал(а): Только никак не могу понять, почему эта программа работала с обычной динамической индикацией, а с 74HC164 не хочет? Ведь "тики" таймера и прерывания остались прежними... ... для начала "подчистите" код - напримерКод: switch (cur_dig){ можно записатьcase 0: PORTC=0; hc164_wr(digit_out[cur_dig], digit_out[cur_dig+4]); PORTC=0b00010001; break; case 1: PORTC=0; hc164_wr(digit_out[cur_dig], digit_out[cur_dig+4]); PORTC=0b00100010; break; case 2: PORTC=0; hc164_wr(digit_out[cur_dig], digit_out[cur_dig+4]); PORTC=0b01000100; break; case 3: PORTC=0; hc164_wr(digit_out[cur_dig], digit_out[cur_dig+4]); PORTC=0b10001000; break; } Код: switch (cur_dig){ PORTC=0; hc164_wr(digit_out[cur_dig], digit_out[cur_dig+4]); PORTC=0b00010001; break; case 0: PORTC=0b00010001; break; case 1: PORTC=0b00100010; break; case 2: PORTC=0b01000100; break; case 3: PORTC=0b10001000; } ... а чтобы найти ошибку - поставьте BreakPoint в функцию вывода Если так написать, то программа не работает, выводится только первая цифра на кждом из двух индикаторов... |
Автор: | ChipKiller [ Вс мар 27, 2011 16:30:42 ] |
Заголовок сообщения: | Re: Проблема с ds1820... |
КАШАК писал(а): Если так написать, то программа не работает, выводится только первая цифра на кждом из двух индикаторов... ... поправил верхнюю строкуPS. на схеме избыточно подключение линий PC0..7 достаточно использовать PC0..3 |
Автор: | КАШАК [ Вс мар 27, 2011 16:49:13 ] |
Заголовок сообщения: | Re: Проблема с ds1820... |
А так вообще ничего не выводит... Т.е. можно аноды индикаторов запараллелить? |
Автор: | ChipKiller [ Вс мар 27, 2011 16:55:54 ] |
Заголовок сообщения: | Re: Проблема с ds1820... |
КАШАК писал(а): Т.е. можно аноды индикаторов запараллелить? ... конечно - ведь вывод идет в одной процедуре (т.е. PORTC0..3 идет и на место PORTC4..7)
|
Автор: | КАШАК [ Вс мар 27, 2011 16:57:37 ] |
Заголовок сообщения: | Re: Проблема с ds1820... |
Ясно, только придется транзисторы поставить, сейчас схему перепаяю ![]() |
Автор: | ChipKiller [ Вс мар 27, 2011 17:00:13 ] | ||
Заголовок сообщения: | Re: Проблема с ds1820... | ||
вот пример из "закромов", как с помощью всего 4-х выводов управлять 6-ти разрядным семисегментным индикатором КАШАК писал(а): А что делать с измерением температуры?.. ... я же говорил - точку останова в процедуру индикации и ловим баг....
|
Автор: | КАШАК [ Вс мар 27, 2011 17:08:32 ] |
Заголовок сообщения: | Re: Проблема с ds1820... |
Спасибо за схему, обязательно попробую, просто сейчас на макетке спаяна схема, представленная выше ![]() |
Автор: | IM1 [ Вс мар 27, 2011 18:32:08 ] |
Заголовок сообщения: | Re: Проблема с ds1820... |
ChipKiller писал(а): вот пример из "закромов", как с помощью всего 4-х выводов управлять 6-ти разрядным семисегментным индикатором Если только для общего развития, а практическая ценность схемы равна нулю.Ведь ток дешифратора 74HC155 по ДШ всего 4 мА. Делим на количество разрядов: 4/6=0,7 мА средний ток на разряд. Если горит 8 и "зпт", то делим еще на 8: 0,7/8=0,09 мА средний ток на сегмент. Конечно в безлунную ночь можно будет что-то прочитать, а днем ни-ни, даже с черной накидкой. |
Автор: | zhu4er [ Вс мар 27, 2011 18:34:21 ] |
Заголовок сообщения: | Re: Проблема с ds1820... |
Посмотрите у меня на сайте примеры термометров, там же и исходники в CVAVR найдёте: http://zhu4er.narod.ru/moi_razrabotki/ может что и получится |
Автор: | ChipKiller [ Вс мар 27, 2011 20:02:24 ] |
Заголовок сообщения: | Re: Проблема с ds1820... |
IM1 писал(а): Если только для общего развития, а практическая ценность схемы равна нулю. ... нулю равны Ваши знания в применении Протеуса. Данная схема успешно работает. Добавление транзисторов для управления разрядами индикатора ни как не отразится на отлаженном коде программы. Если желание собрать набор глюков, то можно "возмущаться" и в отсутствии конденсаторов в схеме.
|
Автор: | IM1 [ Вс мар 27, 2011 20:25:36 ] |
Заголовок сообщения: | Re: Проблема с ds1820... |
ChipKiller писал(а): ... нулю равны Ваши знания в применении Протеуса. Оба-на, зачем же так грубо и безапелляционно?ChipKiller писал(а): Добавление транзисторов для управления разрядами индикатора ни как не отразится на отлаженном коде программы. А ректификационной колонны и ветряного генератора? Вы уж как-то намекайте, я же не могу знать, о чем думает Ваша левая пятка. Транзистор вроде как бы инвертирует, надеюсь это в Ваши знания входит? |
Автор: | КАШАК [ Пн мар 28, 2011 00:32:59 ] |
Заголовок сообщения: | Re: Проблема с ds1820... |
Может кто-нибудь помочь разобраться моей проблемой? Я уже 2 дня мучаюсь и все никак... ![]() |
Автор: | uk8amk [ Пн мар 28, 2011 09:18:30 ] |
Заголовок сообщения: | Re: Проблема с ds1820... |
>>Если вызов функции чтения температуры из цикла перенести в таймер, то чтение происходит нормально, но индикация пропадает Как и выше сказали, на время обращения к датчику необходимо блокировать прерывания. При входе в таймер все прерывания блокируются автоматически, поэтому происходит успешное считывание. Надо сделать так: #asm("cli") temp=ds1820_temperature_10(0); #asm("sei") При таком подходе индикация будет пропадать на 750мс - время преобразования температуры. Чтобы избавится от этого недостатка вам придется расковырять встроенную в CVAVR библиотеку и функцию измерения разбить на части(маленькие функции): 1)отключение прерываний, запуск измерения, включение прерываний 2)подождать 750мс 3)откл. прерываний, считвание показаний, вкл. прерываний |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |