Страница 1 из 1

DS18S20 и AtTiny2313. Проблема с получением температуры.

Добавлено: Чт июл 01, 2010 07:41:58
Васька серый
Приветствую Собратья!
Возникла проблемка со связкой DS18S20 и AtTity2313 в терморегуляторе.
IMG_0721.jpg
(14.56 КБ) 697 скачиваний

Датчик висит на нулевом бите порта D.
Контроллер находит 1 датчик, но при получении температуры с него определяет температуру 127 (на изменение температуры не реагирует).
Пробовал менять датчик, результат тот же.
Скидываю частоту с 4х до 1мГц, датчик не заводится, температура - 25.
Однако в предыдущей конструкции все замечательно работало. Где собака порылась?

Код

Код: Выделить всё

/*****************************************************
Chip type               : ATtiny2313
AVR Core Clock frequency: 4,000000 MHz
Memory model            : Tiny
External RAM size       : 0
Data Stack size         : 32
*****************************************************/

#asm
    .equ __w1_port=0x12 // PORTD
    .equ __w1_bit=0        // нулевой бит
#endasm

#include <tiny2313.h>
#include <ds1820.h>

flash char buf[13] = {     
0b01011111, //0
0b00010010, //1
0b00101111, //2
0b00111011, //3
0b01110010, //4
0b01111001, //5
0b01111101, //6
0b00010011, //7
0b01111111, //8
0b01111011, //9
0b00100000, //-
0b01101100, //t
0b01001101  //C
};
unsigned char rom_codes[1][9], t = 0, t0 = 0, t1 = 0, cd = 0, devices = 0;

void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

PORTA=0x00;
DDRA=0xff;

PORTB=0x00;
DDRB=0xff;

PORTD=0x00;
DDRD =0xff;

// Timer/Counter 0 initialization
// Clock value: Timer 0 Stopped
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 1 initialization
// Clock value: Timer1 Stopped
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Universal Serial Interface initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
USICR=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;

devices = w1_search(0xf0, rom_codes);
#asm("sei");

while (1)
      {
      // не запрещаю прерывания, тк таймеры и ИНТы отключены
      t = ds1820_temperature_10(&rom_codes[0][0])/10;
     
      t0 = t / 10;
      t1 = t % 10;
          switch (cd){
              case 0:{PORTD.4 = 1; PORTD.5 = 1; PORTD.6 = 1; PORTB = buf[t0]; PORTD.6 = 0; break;}; 
              case 1:{PORTD.4 = 1; PORTD.5 = 1; PORTD.6 = 1; PORTB = buf[t1]; PORTD.5 = 0; break;}; 
          }       
      cd++;                       
      if (cd == 2) cd = 0;
      };
}

Re: DS18S20 и AtTiny2313. Проблема с получением температуры.

Добавлено: Чт июл 01, 2010 09:59:23
zhu4er
Васька серый писал(а):Приветствую Собратья!
Возникла проблемка со связкой DS18S20 и AtTity2313 в терморегуляторе.
IMG_0721.jpg

Датчик висит на нулевом бите порта D.
Контроллер находит 1 датчик, но при получении температуры с него определяет температуру 127 (на изменение температуры не реагирует).
Пробовал менять датчик, результат тот же.
Скидываю частоту с 4х до 1мГц, датчик не заводится, температура - 25.
Однако в предыдущей конструкции все замечательно работало. Где собака порылась?

Код

Код: Выделить всё

/*****************************************************
Chip type               : ATtiny2313
AVR Core Clock frequency: 4,000000 MHz
Memory model            : Tiny
External RAM size       : 0
Data Stack size         : 32
*****************************************************/

#asm
    .equ __w1_port=0x12 // PORTD
    .equ __w1_bit=0        // нулевой бит
#endasm

#include <tiny2313.h>
#include <ds1820.h>

flash char buf[13] = {     
0b01011111, //0
0b00010010, //1
0b00101111, //2
0b00111011, //3
0b01110010, //4
0b01111001, //5
0b01111101, //6
0b00010011, //7
0b01111111, //8
0b01111011, //9
0b00100000, //-
0b01101100, //t
0b01001101  //C
};
unsigned char rom_codes[1][9], t = 0, t0 = 0, t1 = 0, cd = 0, devices = 0;

void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

PORTA=0x00;
DDRA=0xff;

PORTB=0x00;
DDRB=0xff;

PORTD=0x00;
DDRD =0xff;

// Timer/Counter 0 initialization
// Clock value: Timer 0 Stopped
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 1 initialization
// Clock value: Timer1 Stopped
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Universal Serial Interface initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
USICR=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;

devices = w1_search(0xf0, rom_codes);
#asm("sei");

while (1)
      {
      // не запрещаю прерывания, тк таймеры и ИНТы отключены
      t = ds1820_temperature_10(&rom_codes[0][0])/10;
     
      t0 = t / 10;
      t1 = t % 10;
          switch (cd){
              case 0:{PORTD.4 = 1; PORTD.5 = 1; PORTD.6 = 1; PORTB = buf[t0]; PORTD.6 = 0; break;}; 
              case 1:{PORTD.4 = 1; PORTD.5 = 1; PORTD.6 = 1; PORTB = buf[t1]; PORTD.5 = 0; break;}; 
          }       
      cd++;                       
      if (cd == 2) cd = 0;
      };
}


1. Скольки разрядный у тебя индикатор? Схемку бы посмотреть...
2. Какая индикация, статическая или динамическая (кажется статическая)
3. Опиши строчки case0, case1, что делают PORTD.6 и PORTD.5?
4. Если температура небудет вылазить за 100 градусов предлагаю вообще не делить температуру, а прям так и выводить. Точку можно просто включить и не выключать.
5. А где проверка отрицательной температуры? Или её не собираешься мерять?

Re: DS18S20 и AtTiny2313. Проблема с получением температуры.

Добавлено: Чт июл 01, 2010 20:38:46
Васька серый
1) индикация 3х разрядная (старший разряд для отображения режима) и 2 разряда на температуру. схема во вложении
2) индикация динамическая, просто я упростил прогу, оставил только получение и вывод температуры. в таком варианте будет конечно мигать, но в реальном устройстве вывод в таймере. в главом цикле только получение температуры
3) переменная cd - номер семисегментника для вывода. в данном варианте заюзаны только 2 разряда
4) температура 0 - 99гр.
5) отрицательную мерить не планирую, добавлю по мере надобности.

Порылся в архивах форума нашел пост о той же проблеме что и у меня (отображение 127 гр). там решилось включеним датчика по трехпроводной схеме. можно глупый вопрос? а это как? у меня тоже он по трем проводам подключен.


лапы к индикатору так развел только чтобы печатку было проще развести.
diagram.JPG
(107.07 КБ) 586 скачиваний

Re: DS18S20 и AtTiny2313. Проблема с получением температуры.

Добавлено: Чт июл 01, 2010 22:21:02
zhu4er
Всё ясно, что дело тёмно...
на твоём бы месте, я бы пересмотрел модуль индикации... посмотри как у меня реализовано. Правда без коментов, но по каждой строчке дам пояснения:
termo99.c
(3.34 КБ) 505 скачиваний

Пробуй, авось поможет.

Re: DS18S20 и AtTiny2313. Проблема с получением температуры.

Добавлено: Пт июл 02, 2010 06:01:40
Васька серый
спасибо. по индикации проблем нет.
единственное что попробовал, и не помогло, это

Код: Выделить всё

if (t > 1000) t = 4095 - t;


дело не темное, я лишь упростил код, чтобы было понятнее :))
выкладываю исходник целиком.
1.c
(6.48 КБ) 189 скачиваний

Re: DS18S20 и AtTiny2313. Проблема с получением температуры.

Добавлено: Пт июл 02, 2010 06:40:05
Васька серый
zhu4er писал(а):Пробуй, авось поможет.

сделал по образу и подобию, подвязал свой порт

Код: Выделить всё

#include <1wire.h>               
#include <ds18b20.h>

int t = 0;
unsigned char dv = 0;

dv = w1_init();
t = ds18b20_temperature(0);
if (t > 1000) t = 4096 - t;


теперь температура замерла на +15 гр и не шевелится. датчик определяется (в dv единичка)

Re: DS18S20 и AtTiny2313. Проблема с получением температуры.

Добавлено: Сб июл 03, 2010 19:31:16
zhu4er
Васька серый писал(а):
zhu4er писал(а):Пробуй, авось поможет.

сделал по образу и подобию, подвязал свой порт

Код: Выделить всё

#include <1wire.h>               
#include <ds18b20.h>

int t = 0;
unsigned char dv = 0;

dv = w1_init();
t = ds18b20_temperature(0);
if (t > 1000) t = 4096 - t;


теперь температура замерла на +15 гр и не шевелится. датчик определяется (в dv единичка)


правильно подвисла :) ты используешь какой датчик? 18B20 или 18S20?
вот тебе пример моего терморегулятора для инкубатора(только я использовал шесть индикаторов. Три на реальную температуру и три на заданную)

termoreg3.c
(3.84 КБ) 339 скачиваний


Здесь уже с коментами! Но проверку на минусовую температуру я удалил - инкубатор ведь всё таки :)

ПС: у тебя должна быть вот такая книга CodeVisionAVR Пособие для начинающих М.Б.Лебедев 2008 если нет, то скачай - оооочень много полезного

Re: DS18S20 и AtTiny2313. Проблема с получением температуры.

Добавлено: Вс июл 04, 2010 05:31:33
Васька серый
спасибо. датчик DS18S20.
Попробовал получить указанным способом, возвращает девятку. Единственное что изменил это нижний и верхний предел (0 и 99 соотв.). Менял разрядность с 12 на 9 бит - результат тот же.
переписал сохранение контрольной температуры в eeprom, так как это сделано у вас. и поставил книжку на закачку :beer:

Re: DS18S20 и AtTiny2313. Проблема с получением температуры.

Добавлено: Пн июл 05, 2010 00:56:54
zhu4er
Васька серый писал(а):спасибо. датчик DS18S20.
Попробовал получить указанным способом, возвращает девятку. Единственное что изменил это нижний и верхний предел (0 и 99 соотв.). Менял разрядность с 12 на 9 бит - результат тот же.
переписал сохранение контрольной температуры в eeprom, так как это сделано у вас. и поставил книжку на закачку :beer:

так вот если ты скачал книгу, то должен понять, что функции получения температуры для датчиков 18В20 и 18S20 разные
в моём случае датчик 18В20 обслуживается функцией ds18b20_temperature(0) она показывает реальную температуру поэтому я её умножаю на 10
а у тебя функция уже выдаёт результат умноженный на 10
попробуй не делить на 10 свою температуру и вместо строчек
t0=t/10
t1=t%10
подставить мою функцию получения сотен, десятков, и единиц, и в операторе свич кейс в каждом контейнере зажигать не все индикаторы сразу, а по одному, например вот так:
// индикация
switch (cd){
case 0:{PORTD.4 = 1; PORTD.5 = 0; PORTD.6 = 0; PORTB = buf[t0]; break;}; //первая цифра
case 1:{PORTD.4 = 0; PORTD.5 = 1; PORTD.6 = 0; PORTB = buf[t1]; break;}; //вторая цифра
case 2:{PORTD.4 = 0; PORTD.5 = 0; PORTD.6 = 1; PORTB = buf[t2]; break;}; //третья цифра
}
cd++;
if (cd == 3) cd = 0;

дальше советую тебе динамическую индикацию сделать не по прерыванию таймера, а в цикле как у меня, потому что связка свич кейс слишком жирная по времени для прерывания работы программы...
и ещё не маловажный момент не храни свой массив с цифирками во флеш памяти!!! А то после энного количества обращений (особенно при динамической индикации) память может отказать!
дальше, если у тебя обыкновенные кнопки, то лучше через внешние прерывания их не пускать(работать будут, но глючно - проверял не однократно)...
и на последок... мммм
тип переменной к которой присваиваешь температуру смени на unsigned int

ПС: книжка должна некоторые моменты тебе прояснить

Re: DS18S20 и AtTiny2313. Проблема с получением температуры.

Добавлено: Пн июл 05, 2010 09:32:16
metan
zhu4er писал(а):и ещё не маловажный момент не храни свой массив с цифирками во флеш памяти!!! А то после энного количества обращений (особенно при динамической индикации) память может отказать!

Можно поподробнее об этом?
Я всегда считал что хранение констант в памяти программ ничуть не опасно, ведь при этом обращение к ней не более часто чем обращение просто к командам самой программы.
А по теме, недавно сделал градусник на базе системы, предложенной заслуженно популярным автором Danko:
http://radiokot.ru/circuit/digital/home/61/
Там все доступно, аккуратно и понятно выполнено. Работает кстати и с DS18B20 и DS18S20

Re: DS18S20 и AtTiny2313. Проблема с получением температуры.

Добавлено: Пн июл 05, 2010 10:27:39
Danko
zhu4er писал(а):не храни свой массив с цифирками во флеш памяти!!!

два вопроса: можно ссылочку на источник с рекомендациями. Желательно апноут.

второе: Вы уверены, что компилятор при оптимизации не поместит константы во флэш?
Вы не путаете хранение переменных в EEPROM ?

Re: DS18S20 и AtTiny2313. Проблема с получением температуры.

Добавлено: Пн июл 05, 2010 10:57:24
ВНН
Ненужно путать механизмы чтение и запись EEPROM .
Открываем первуд страницу PDF и читаем.
Endurance: 100,000 Write/Erase Cycles
Долговечность : 100,000 Записей/Стераний.
Поро чтение речи не идет

Re: DS18S20 и AtTiny2313. Проблема с получением температуры.

Добавлено: Пн июл 05, 2010 21:47:56
Aheir
Млин, народ, вы ваще правила читаете? Автор выкладывает длиннющий листинг, который просто из соображений здравого смысла нужно оформлять вложением.. Второй все это цитирует...

Закрыто, ибо дубль... Поиск-то зачем, а?