Например TDA7294

Форум РадиоКот • Просмотр темы - Проблема с ds1820...
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Сб авг 02, 2025 05:52:36

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Форум закрыт Эта тема закрыта, Вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 28 ]  1,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Проблема с ds1820...
СообщениеДобавлено: Вс мар 27, 2011 01:12:57 
Это не хвост, это антенна
Аватар пользователя

Карма: 6
Рейтинг сообщений: 68
Зарегистрирован: Вс апр 19, 2009 17:20:22
Сообщений: 1303
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Рейтинг сообщения: 0
Есть вот такая схема:Изображение

Она не хочет читать температуру с 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, тоже работало нормально. Если вызов функции чтения температуры из цикла перенести в таймер, то чтение происходит нормально, но индикация пропадает :cry:


Вложения:
111.jpg [206.63 KiB]
Скачиваний: 1439

_________________
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблема с ds1820...
СообщениеДобавлено: Вс мар 27, 2011 02:01:03 
Это не хвост, это антенна
Аватар пользователя

Карма: 6
Рейтинг сообщений: 68
Зарегистрирован: Вс апр 19, 2009 17:20:22
Сообщений: 1303
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Рейтинг сообщения: 0
Вообще никаких идей?...

_________________
Опыт растет прямо пропорционально выведенному из строя оборудованию...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблема с ds1820...
СообщениеДобавлено: Вс мар 27, 2011 08:47:05 
Сверлит текстолит когтями
Аватар пользователя

Карма: 4
Рейтинг сообщений: 30
Зарегистрирован: Ср янв 05, 2011 16:25:15
Сообщений: 1163
Рейтинг сообщения: 0
КАШАК писал(а):
Если вызов функции чтения температуры из цикла перенести в таймер, то чтение происходит нормально, но индикация пропадает :cry:
КАШАК писал(а):
Вообще никаких идей?..
"идея" и ответ содержатся в первом вопросе - проблема в прерываниях.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблема с ds1820...
СообщениеДобавлено: Вс мар 27, 2011 09:42:00 
Первый раз сказал Мяу!

Зарегистрирован: Пт мар 18, 2011 12:41:09
Сообщений: 25
Рейтинг сообщения: 0
Чего то я не понял, в библиотечке 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 переделает, но читабельность возрастает на порядок.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблема с ds1820...
СообщениеДобавлено: Вс мар 27, 2011 11:12:50 
Родился
Аватар пользователя

Зарегистрирован: Пн мар 15, 2010 18:00:02
Сообщений: 15
Откуда: Свердловская область. ГО Сухой Лог
Рейтинг сообщения: 0
Здравствуйте, КАШАК. Я как-то делал термометр, но на Atmega48, тогда ещё не использовал сдвиговый регистр, а развесил всё прямо на МК (есть моделька для Протеуса). Код получился довольно компактный, для работы с датчиком нашёл какую-то библиотеку, она была великовата и я её поправил. Если вам нужно, могу скинуть свой проектик (на Си) (коменты имеются) + модель для Протеуса. Тестил в реале - работает безотказно.

З.Ы. Если что, пишите в ЛК.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблема с ds1820...
СообщениеДобавлено: Вс мар 27, 2011 14:40:09 
Это не хвост, это антенна
Аватар пользователя

Карма: 6
Рейтинг сообщений: 68
Зарегистрирован: Вс апр 19, 2009 17:20:22
Сообщений: 1303
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Рейтинг сообщения: 0
Насчет проверки наличия датчиков: это только часть программы, потом добавится проверка и чтение с двух датчиков :) Но пока она и с одного читать не хочет... Только никак не могу понять, почему эта программа работала с обычной динамической индикацией, а с 74HC164 не хочет? Ведь "тики" таймера и прерывания остались прежними...

_________________
Опыт растет прямо пропорционально выведенному из строя оборудованию...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблема с ds1820...
СообщениеДобавлено: Вс мар 27, 2011 15:06:05 
Сверлит текстолит когтями
Аватар пользователя

Карма: 4
Рейтинг сообщений: 30
Зарегистрирован: Ср янв 05, 2011 16:25:15
Сообщений: 1163
Рейтинг сообщения: 0
КАШАК писал(а):
Только никак не могу понять, почему эта программа работала с обычной динамической индикацией, а с 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 в функцию вывода


Последний раз редактировалось ChipKiller Вс мар 27, 2011 16:31:09, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблема с ds1820...
СообщениеДобавлено: Вс мар 27, 2011 16:23:45 
Это не хвост, это антенна
Аватар пользователя

Карма: 6
Рейтинг сообщений: 68
Зарегистрирован: Вс апр 19, 2009 17:20:22
Сообщений: 1303
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Рейтинг сообщения: 0
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 в функцию вывода


Если так написать, то программа не работает, выводится только первая цифра на кждом из двух индикаторов...

_________________
Опыт растет прямо пропорционально выведенному из строя оборудованию...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблема с ds1820...
СообщениеДобавлено: Вс мар 27, 2011 16:30:42 
Сверлит текстолит когтями
Аватар пользователя

Карма: 4
Рейтинг сообщений: 30
Зарегистрирован: Ср янв 05, 2011 16:25:15
Сообщений: 1163
Рейтинг сообщения: 0
КАШАК писал(а):
Если так написать, то программа не работает, выводится только первая цифра на кждом из двух индикаторов...
... поправил верхнюю строку

PS. на схеме избыточно подключение линий PC0..7 достаточно использовать PC0..3


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблема с ds1820...
СообщениеДобавлено: Вс мар 27, 2011 16:49:13 
Это не хвост, это антенна
Аватар пользователя

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

_________________
Опыт растет прямо пропорционально выведенному из строя оборудованию...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблема с ds1820...
СообщениеДобавлено: Вс мар 27, 2011 16:55:54 
Сверлит текстолит когтями
Аватар пользователя

Карма: 4
Рейтинг сообщений: 30
Зарегистрирован: Ср янв 05, 2011 16:25:15
Сообщений: 1163
Рейтинг сообщения: 0
КАШАК писал(а):
Т.е. можно аноды индикаторов запараллелить?
... конечно - ведь вывод идет в одной процедуре (т.е. PORTC0..3 идет и на место PORTC4..7)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблема с ds1820...
СообщениеДобавлено: Вс мар 27, 2011 16:57:37 
Это не хвост, это антенна
Аватар пользователя

Карма: 6
Рейтинг сообщений: 68
Зарегистрирован: Вс апр 19, 2009 17:20:22
Сообщений: 1303
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Рейтинг сообщения: 0
Ясно, только придется транзисторы поставить, сейчас схему перепаяю :) А что делать с измерением температуры?..

_________________
Опыт растет прямо пропорционально выведенному из строя оборудованию...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблема с ds1820...
СообщениеДобавлено: Вс мар 27, 2011 17:00:13 
Сверлит текстолит когтями
Аватар пользователя

Карма: 4
Рейтинг сообщений: 30
Зарегистрирован: Ср янв 05, 2011 16:25:15
Сообщений: 1163
Рейтинг сообщения: 0
вот пример из "закромов", как с помощью всего 4-х выводов управлять 6-ти разрядным семисегментным индикатором

КАШАК писал(а):
А что делать с измерением температуры?..
... я же говорил - точку останова в процедуру индикации и ловим баг....


Вложения:
tn13_ds18b20.PNG [16.1 KiB]
Скачиваний: 721


Последний раз редактировалось ChipKiller Вс мар 27, 2011 17:10:26, всего редактировалось 1 раз.
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблема с ds1820...
СообщениеДобавлено: Вс мар 27, 2011 17:08:32 
Это не хвост, это антенна
Аватар пользователя

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

_________________
Опыт растет прямо пропорционально выведенному из строя оборудованию...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблема с ds1820...
СообщениеДобавлено: Вс мар 27, 2011 18:32:08 
Грызет канифоль
Аватар пользователя

Зарегистрирован: Вт фев 16, 2010 12:10:38
Сообщений: 268
Откуда: Воронеж, Россия
Рейтинг сообщения: 0
ChipKiller писал(а):
вот пример из "закромов", как с помощью всего 4-х выводов управлять 6-ти разрядным семисегментным индикатором
Если только для общего развития, а практическая ценность схемы равна нулю.
Ведь ток дешифратора 74HC155 по ДШ всего 4 мА. Делим на количество разрядов: 4/6=0,7 мА средний ток на разряд. Если горит 8 и "зпт", то делим еще на 8: 0,7/8=0,09 мА средний ток на сегмент. Конечно в безлунную ночь можно будет что-то прочитать, а днем ни-ни, даже с черной накидкой.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблема с ds1820...
СообщениеДобавлено: Вс мар 27, 2011 18:34:21 
Вымогатель припоя
Аватар пользователя

Карма: 4
Рейтинг сообщений: 33
Зарегистрирован: Пт июн 04, 2010 17:40:13
Сообщений: 544
Откуда: Непокорный город-герой Севастополь
Рейтинг сообщения: 0
Посмотрите у меня на сайте примеры термометров, там же и исходники в CVAVR найдёте: http://zhu4er.narod.ru/moi_razrabotki/ может что и получится

_________________
Даже у стен есть уши...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблема с ds1820...
СообщениеДобавлено: Вс мар 27, 2011 20:02:24 
Сверлит текстолит когтями
Аватар пользователя

Карма: 4
Рейтинг сообщений: 30
Зарегистрирован: Ср янв 05, 2011 16:25:15
Сообщений: 1163
Рейтинг сообщения: 0
IM1 писал(а):
Если только для общего развития, а практическая ценность схемы равна нулю.
... нулю равны Ваши знания в применении Протеуса. Данная схема успешно работает. Добавление транзисторов для управления разрядами индикатора ни как не отразится на отлаженном коде программы. Если желание собрать набор глюков, то можно "возмущаться" и в отсутствии конденсаторов в схеме.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблема с ds1820...
СообщениеДобавлено: Вс мар 27, 2011 20:25:36 
Грызет канифоль
Аватар пользователя

Зарегистрирован: Вт фев 16, 2010 12:10:38
Сообщений: 268
Откуда: Воронеж, Россия
Рейтинг сообщения: 0
ChipKiller писал(а):
... нулю равны Ваши знания в применении Протеуса.
Оба-на, зачем же так грубо и безапелляционно?
ChipKiller писал(а):
Добавление транзисторов для управления разрядами индикатора ни как не отразится на отлаженном коде программы.
А ректификационной колонны и ветряного генератора?
Вы уж как-то намекайте, я же не могу знать, о чем думает Ваша левая пятка.
Транзистор вроде как бы инвертирует, надеюсь это в Ваши знания входит?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблема с ds1820...
СообщениеДобавлено: Пн мар 28, 2011 00:32:59 
Это не хвост, это антенна
Аватар пользователя

Карма: 6
Рейтинг сообщений: 68
Зарегистрирован: Вс апр 19, 2009 17:20:22
Сообщений: 1303
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Рейтинг сообщения: 0
Может кто-нибудь помочь разобраться моей проблемой? Я уже 2 дня мучаюсь и все никак... :cry:

_________________
Опыт растет прямо пропорционально выведенному из строя оборудованию...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблема с ds1820...
СообщениеДобавлено: Пн мар 28, 2011 09:18:30 
Поставщик валерьянки для Кота

Карма: 16
Рейтинг сообщений: 329
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Сообщений: 2222
Откуда: Tashkent
Рейтинг сообщения: 0
>>Если вызов функции чтения температуры из цикла перенести в таймер, то чтение происходит нормально, но индикация пропадает

Как и выше сказали, на время обращения к датчику необходимо блокировать прерывания. При входе в таймер все прерывания блокируются автоматически, поэтому происходит успешное считывание. Надо сделать так:
#asm("cli")
temp=ds1820_temperature_10(0);
#asm("sei")

При таком подходе индикация будет пропадать на 750мс - время преобразования температуры. Чтобы избавится от этого недостатка вам придется расковырять встроенную в CVAVR библиотеку и функцию измерения разбить на части(маленькие функции):
1)отключение прерываний, запуск измерения, включение прерываний
2)подождать 750мс
3)откл. прерываний, считвание показаний, вкл. прерываний


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Форум закрыт Эта тема закрыта, Вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 28 ]  1,  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y