Проблема с ds1820...

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Проблема с 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 КБ) 1455 скачиваний
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: Проблема с ds1820...

Сообщение КАШАК »

Вообще никаких идей?...
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Проблема с ds1820...

Сообщение ChipKiller »

КАШАК писал(а):Если вызов функции чтения температуры из цикла перенести в таймер, то чтение происходит нормально, но индикация пропадает :cry:
КАШАК писал(а): Вообще никаких идей?..
"идея" и ответ содержатся в первом вопросе - проблема в прерываниях.
ksv82
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Пт мар 18, 2011 12:41:09

Re: Проблема с ds1820...

Сообщение ksv82 »

Чего то я не понял, в библиотечке 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
Родился
Сообщения: 15
Зарегистрирован: Пн мар 15, 2010 18:00:02
Откуда: Свердловская область. ГО Сухой Лог
Контактная информация:

Re: Проблема с ds1820...

Сообщение Alex-Electron »

Здравствуйте, КАШАК. Я как-то делал термометр, но на Atmega48, тогда ещё не использовал сдвиговый регистр, а развесил всё прямо на МК (есть моделька для Протеуса). Код получился довольно компактный, для работы с датчиком нашёл какую-то библиотеку, она была великовата и я её поправил. Если вам нужно, могу скинуть свой проектик (на Си) (коменты имеются) + модель для Протеуса. Тестил в реале - работает безотказно.

З.Ы. Если что, пишите в ЛК.
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: Проблема с ds1820...

Сообщение КАШАК »

Насчет проверки наличия датчиков: это только часть программы, потом добавится проверка и чтение с двух датчиков :) Но пока она и с одного читать не хочет... Только никак не могу понять, почему эта программа работала с обычной динамической индикацией, а с 74HC164 не хочет? Ведь "тики" таймера и прерывания остались прежними...
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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]);
    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 раз.
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

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
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Проблема с ds1820...

Сообщение ChipKiller »

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

PS. на схеме избыточно подключение линий PC0..7 достаточно использовать PC0..3
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: Проблема с ds1820...

Сообщение КАШАК »

А так вообще ничего не выводит... Т.е. можно аноды индикаторов запараллелить?
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Проблема с ds1820...

Сообщение ChipKiller »

КАШАК писал(а):Т.е. можно аноды индикаторов запараллелить?
... конечно - ведь вывод идет в одной процедуре (т.е. PORTC0..3 идет и на место PORTC4..7)
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: Проблема с ds1820...

Сообщение КАШАК »

Ясно, только придется транзисторы поставить, сейчас схему перепаяю :) А что делать с измерением температуры?..
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Проблема с ds1820...

Сообщение ChipKiller »

вот пример из "закромов", как с помощью всего 4-х выводов управлять 6-ти разрядным семисегментным индикатором

КАШАК писал(а):А что делать с измерением температуры?..
... я же говорил - точку останова в процедуру индикации и ловим баг....
Вложения
tn13_ds18b20.PNG
(16.1 КБ) 731 скачивание
Последний раз редактировалось ChipKiller Вс мар 27, 2011 17:10:26, всего редактировалось 1 раз.
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: Проблема с ds1820...

Сообщение КАШАК »

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

Re: Проблема с ds1820...

Сообщение IM1 »

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

Re: Проблема с ds1820...

Сообщение zhu4er »

Посмотрите у меня на сайте примеры термометров, там же и исходники в CVAVR найдёте: http://zhu4er.narod.ru/moi_razrabotki/ может что и получится
Даже у стен есть уши...
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Проблема с ds1820...

Сообщение ChipKiller »

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

Re: Проблема с ds1820...

Сообщение IM1 »

ChipKiller писал(а):... нулю равны Ваши знания в применении Протеуса.
Оба-на, зачем же так грубо и безапелляционно?
ChipKiller писал(а):Добавление транзисторов для управления разрядами индикатора ни как не отразится на отлаженном коде программы.
А ректификационной колонны и ветряного генератора?
Вы уж как-то намекайте, я же не могу знать, о чем думает Ваша левая пятка.
Транзистор вроде как бы инвертирует, надеюсь это в Ваши знания входит?
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: Проблема с ds1820...

Сообщение КАШАК »

Может кто-нибудь помочь разобраться моей проблемой? Я уже 2 дня мучаюсь и все никак... :cry:
Опыт растет прямо пропорционально выведенному из строя оборудованию...
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: Проблема с ds1820...

Сообщение uk8amk »

>>Если вызов функции чтения температуры из цикла перенести в таймер, то чтение происходит нормально, но индикация пропадает

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

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

Вернуться в «Микроконтроллеры и ПЛИС»