Например TDA7294

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

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

Автор:  КАШАК [ Вс мар 27, 2011 02:01:03 ]
Заголовок сообщения:  Re: Проблема с ds1820...

Вообще никаких идей?...

Автор:  ChipKiller [ Вс мар 27, 2011 08:47:05 ]
Заголовок сообщения:  Re: Проблема с ds1820...

КАШАК писал(а):
Если вызов функции чтения температуры из цикла перенести в таймер, то чтение происходит нормально, но индикация пропадает :cry:
КАШАК писал(а):
Вообще никаких идей?..
"идея" и ответ содержатся в первом вопросе - проблема в прерываниях.

Автор:  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...

Насчет проверки наличия датчиков: это только часть программы, потом добавится проверка и чтение с двух датчиков :) Но пока она и с одного читать не хочет... Только никак не могу понять, почему эта программа работала с обычной динамической индикацией, а с 74HC164 не хочет? Ведь "тики" таймера и прерывания остались прежними...

Автор:  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-ти разрядным семисегментным индикатором

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

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

Автор:  КАШАК [ Вс мар 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 дня мучаюсь и все никак... :cry:

Автор:  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/