ТермомЭтр Помогите с созданием прошивки на Cи

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
shev377
Открыл глаза
Сообщения: 48
Зарегистрирован: Пт янв 29, 2010 21:34:59

ТермомЭтр Помогите с созданием прошивки на Cи

Сообщение shev377 »

Знаний в создании прошивок на мк -> 0, Асамблёр вообще дрова, а вот си ещё более менее понятно....
Вобщем возникла задача, создать термореле с цифровой индикацией, для переносного холодильника
есть мк от Atmel, Mega32в корпусе Dip,
термодатчик цифровой DS18B20 с точностью 0.5 C
4 семисегментных индикатора с общим минусом
есть ещё реле и оптрон.

Нужно всё это объединить,
В чём проблема скажете Вы? На сайте полно схем градусников? В том, что половина из них на PIC, и в том что прошивки на АСМе...

Только что появилась схема (я не художник, поэтому не судите строго :) )
Картинка очень широкая коты будут ругаться, ссылка

На выводе хочу получить что-то типо этого
Изображение


Алгоритм я понимаю такой:
1)Инициализация, настройка портов на ввод вывод
2)Объявление переменных
temp (куда будет записываться инф с датчика)
relestatus (включить реле или нет)
ind1 (значение первого индикатора, - или ничего)
ind2 (Значение второго инд, 0-9)
ind3 (Значение третьего инд, 0-9)
inddp(точка, всегда вкл)
ind4 (Значение четвёртого инд, 0-9)

3)temp=0.0
4)получить переменную temp с датчика (UART?)
5)если temp<0 выключить реле
если temp>4 включить реле
6)Разбить переменную temp на ind1 ind2 ind3 ind4 и вывод их на индикаторы (хотя я не уверен, что нужно разбивать)


Помогите коты добрые, с написанием прошивки по этому, или Вашему алгаритму!
Мяу! на СИ!
Вложения
вывод.png
(4.56 КБ) 1565 скачиваний
схема.gif
(79.44 КБ) 774 скачивания
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: ТермомЭтр Помогите с созданием прошивки на Cи

Сообщение Аlex »

А чем Вам ПИК не подходит ? Всё равно Вам не писать прогу. Купили, прошили, собрали и радуемся :)
Реклама
shev377
Открыл глаза
Сообщения: 48
Зарегистрирован: Пт янв 29, 2010 21:34:59

Re: ТермомЭтр Помогите с созданием прошивки на Cи

Сообщение shev377 »

тем что пика у меня нет, и тем, что те прошивки не удовлетворяют каким-то условиям схемы.

кстати семисегментики у меня с общим анодом, ошибся



http://my-avr.at.ua/publ/1-1-0-11
вот интересная конструкция, то там без индикации, и она не будет работать при минусе






О нашёл! Даже на СИ!
http://aes.at.ua/publ/prostoj_termometr ... 32-1-0-270


Сейчас упрощу схему, поковыряю прошивку, ПОПРОБУЮ адаптировать для MegИ32 и выложу на всеобщий суд!

---
Большая прошивка..... И много непонятных функций...
Аватара пользователя
zhu4er
Вымогатель припоя
Сообщения: 544
Зарегистрирован: Пт июн 04, 2010 17:40:13
Откуда: Непокорный город-герой Севастополь

Re: ТермомЭтр Помогите с созданием прошивки на Cи

Сообщение zhu4er »

shev377 писал(а):тем что пика у меня нет, и тем, что те прошивки не удовлетворяют каким-то условиям схемы.

кстати семисегментики у меня с общим анодом, ошибся



http://my-avr.at.ua/publ/1-1-0-11
вот интересная конструкция, то там без индикации, и она не будет работать при минусе






О нашёл! Даже на СИ!
http://aes.at.ua/publ/prostoj_termometr ... 32-1-0-270


Сейчас упрощу схему, поковыряю прошивку, ПОПРОБУЮ адаптировать для MegИ32 и выложу на всеобщий суд!

---
Большая прошивка..... И много непонятных функций...
Если хочешь могу скинуть свою прогу на Си для термометра, тока там у меня три индикатора и точность 1 градус. Всё на Атмеге8. Есть прога терморегулятора для инкубатора на Тини2313, но там нету минуса и он на ЖК. Там с коментами - можно использовать как обучалку! А вообще почитай тут(4 страницы более 40 примеров): http://my-avr.at.ua/publ/1-1-1
Последний раз редактировалось zhu4er Чт июн 10, 2010 18:26:13, всего редактировалось 1 раз.
Даже у стен есть уши...
Реклама
Эиком - электронные компоненты и радиодетали
shev377
Открыл глаза
Сообщения: 48
Зарегистрирован: Пт янв 29, 2010 21:34:59

Re: ТермомЭтр Помогите с созданием прошивки на Cи

Сообщение shev377 »

конечно хочу, будет почва для размышлений

В общем начну тему заново, (покрасивее нарисовал схему без линии питания, итак очевидно, прилагаю кусок прошивки по теме):

Есть схема, запутана и много лишнего
Изображение
есть к ней прошивка
код

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

[size=50]/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.5 Professional
Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 
Version : 
Date    : 15.10.2008
Author  : Yurik                           
Company : Hardlock                        
Comments: 


Chip type           : ATtiny2313
Clock frequency     : 8,000000 MHz
Memory model        : Tiny
External SRAM size  : 0
Data Stack size     : 32
*****************************************************/

#include <tiny2313.h>
#include <kbd.h>

// 1 Wire Bus functions
#asm
   .equ __w1_port=0x12 ;PORTD
   .equ __w1_bit=6
#endasm
#include <1wire.h>
#include <delay.h>

#define LED_delay 150    

#define Cathode
//#define Anode

#define heat              //точка отображается если T < Tуст.
//#define cold            //точка отображается если T > Tуст.
     
BYTE byDisplay[4];        // буфер данных, для вывода на экран     

BOOLEAN Updating;  
BOOLEAN Minus;  
BOOLEAN LoadOn; 

BYTE Counter = 0;  
BYTE View = 0; 

WORD Tnew;        
WORD T_LoadOn;
BYTE DeltaT;

eeprom WORD eeT_LoadOn = 1280;   //1280 = +28°C 1140 = +14°C 
eeprom BYTE eeDeltaT = 10;       //1°C

//температура для удобства представлена так:
// - до 1000 = отрицательная
// - 1000 = 0
// - больше 1000 = положительная
// - 0,1°С = 1
//---------------------------------
//-55°C = 450
//-25°C = 750
//-10.1°C = 899
//0°C = 1000
//10.1°C = 1101
//25°C = 1250
//85°C = 1850
//125°C = 2250       


BYTE byCharacter[15] = {0xFA,     //0
                0x82,   //1
 	        0xB9,   //2
	        0xAB,	//3 
	        0xC3,     //4 
	        0x6B,     //5 
	        0x7B,     //6
                0xA2,    //7 
                0xFB,      //8
                0xEB,      //9 
                0x00,      //blank   
                0x01,     //-
                0x70,     //t
                0x9B,     //d
                0x58      //L
                }; 



/************************************************************************\
\************************************************************************/
void PrepareData(unsigned int Data)
{
    BYTE i;
    unsigned int D, D1;        
    D = Data;                           
    
    if (D >= 1000) //если Температура больше нуля
    {
      D = D - 1000;  
      Minus = 0;
    }
    else
    {
      D = 1000 - D; 
      Minus = 1;
    }          
    D1 = D;
    
    //Преобразуем в десятичное представление
    for(i=0; i<4; i++)
    {
       byDisplay[3-i] = D % 10;
       D /= 10;
    }
    
    if (D1 < 100)
    {
      byDisplay[0] = 10;
      byDisplay[1] = 10;

      goto exit;
    }   
    if ((D1 >= 100) & (D1 <1000))
    {
      byDisplay[0] = 10;
      goto exit;
    }
                    
exit:  
  if (View == 2)
  {
    byDisplay[0] = 13;     
  }
    
}

/************************************************************************\
  Вывод экранного буфера на дисплей.
      Вход:  -
      Выход: -
\************************************************************************/
void ShowDisplayData(void)
{                      
 #ifdef Cathode                     
 
  PORTB = byCharacter[byDisplay[0]];
  if (Minus)
  {
    PORTB = PINB | 0b00000001;
  }                           
  #ifdef heat
  if (LoadOn)
  #endif
  
  #ifdef cold
  if (!LoadOn)
  #endif
  {
    PORTB = PINB | 0b00000100;
  }           
  if (View == 1)
  {
    PORTB = PINB | 0b00001000;
  }
  PORTD.5 = 0;
  delay_us(LED_delay);
  PORTD.5 = 1;    
     
  PORTB = byCharacter[byDisplay[1]];
  PORTD.1 = 0;
  delay_us(LED_delay);
  PORTD.1 = 1;
      
  PORTB = byCharacter[byDisplay[2]] | 0b00000100;
  PORTD.0 = 0;
  delay_us(LED_delay);
  PORTD.0 = 1;
      
  PORTB = byCharacter[byDisplay[3]];
  PORTD.4 = 0;
  delay_us(LED_delay);
  PORTD.4 = 1;
#endif

#ifdef Anode
  PORTB = ~byCharacter[byDisplay[0]];  
  if (Minus)
  {
    PORTB = PINB & 0b11111110;
  }                           
  #ifdef heat
  if (LoadOn)
  #endif
  
  #ifdef cold
  if (!LoadOn)
  #endif
  {
    PORTB = PINB & 0b11111011;
  }           
  if (View == 1)
  {
    PORTB = PINB & 0b11110111;
  } 
  PORTD.5 = 1;
  delay_us(LED_delay);
  PORTD.5 = 0;    
     
  PORTB = ~byCharacter[byDisplay[1]];
  PORTD.1 = 1;
  delay_us(LED_delay);
  PORTD.1 = 0;
      
  PORTB = ~byCharacter[byDisplay[2]] & 0b11111011;
  PORTD.0 = 1;
  delay_us(LED_delay);
  PORTD.0 = 0;
      
  PORTB = ~byCharacter[byDisplay[3]];
  PORTD.4 = 1;
  delay_us(LED_delay);
  PORTD.4 = 0;
#endif
 
  
  }


/************************************************************************\
  Обновление дисплея.
      Вход:  -
      Выход: -
\************************************************************************/
void RefreshDisplay(void)
{                                
  WORD Data; 
  switch (View)
  {
    case 0:
      Data = Tnew; 
      if (T_LoadOn != eeT_LoadOn)
        eeT_LoadOn = T_LoadOn;
      if (DeltaT != eeDeltaT)
        eeDeltaT = DeltaT;
    break;
    case 1:
      Data = T_LoadOn;
    break;
        
    case 2:
      Data = DeltaT + 1000; 
    break;
  }
      
  PrepareData(Data);      
}

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{                
// Reinitialize Timer 0 value
TCNT0=0xBF;

ScanKbd();
}

// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
  BYTE t1;
  BYTE t2;
  BYTE i; 
  WORD Temp;
  WORD T;
  BYTE Ff;
// Reinitialize Timer 1 value
TCNT1H=0x8F;
TCNT1L=0xD1;
// Place your code here 
w1_init();   
for (i=0; i<11; i++)
  {
    ShowDisplayData();
  }
w1_write(0xCC);               
for (i=0; i<11; i++)
  {
    ShowDisplayData();
  }
Updating = !Updating;
if (Updating)
{
  w1_write(0xBE);  
  for (i=0; i<11; i++)
  {
    ShowDisplayData();
  }
  t1=w1_read();   //LSB 
  for (i=0; i<11; i++)
  {
    ShowDisplayData();
  }
  t2=w1_read();   //MSB      
  
  // значения из даташита (для проверки раскоментировать нужное значение)

  //+125°C
  //t2 = 0b00000111; //MSB
  //t1 = 0b11010000; //LSB
  
  //+85°C
  //t2 = 0b00000101; //MSB
  //t1 = 0b01010000; //LSB
  
  //+25.0625°C
  //t2 = 0b00000001; //MSB
  //t1 = 0b10010001; //LSB
  
  //+10.125°C
  //t2 = 0b00000000; //MSB
  //t1 = 0b10100010; //LSB
  
  //+0.5°C
  //t2 = 0b00000000; //MSB
  //t1 = 0b00001000; //LSB
  
  //0°C
  //t2 = 0b00000000; //MSB
  //t1 = 0b00000000; //LSB
  
  //-0.5°C
  //t2 = 0b11111111; //MSB
  //t1 = 0b11111000; //LSB
  
  //-10.125°C
  //t2 = 0b11111111; //MSB
  //t1 = 0b01011110; //LSB
  
  //-25.0625°C
  //t2 = 0b11111110; //MSB
  //t1 = 0b01101111; //LSB
  
  //-55°C
  //t2 = 0b11111100; //MSB
  //t1 = 0b10010000; //LSB

  
  
  
  Ff = (t1 & 0x0F);
  t2 = t2 << 4; 
  t1 = t1 >> 4;
  T = (t2 & 0xF0) | (t1 & 0x0F);    
  
  if (T & 0b10000000) //если отрицательная температура
  { 
    Ff = ~Ff + 1;
    Ff = Ff & 0b00001111; 
    
    if (!Ff)
    {
      T--;
    }   
    
    Tnew = 1000 - (((~T & 0xFF) * 10) + (Ff * 10 / 16));
  }
  else
  { 
    Tnew = 1000 + (T * 10) + ((Ff * 10) / 16);
  }     
}
else
{
  w1_write(0x44);  
} 


Temp = T_LoadOn + DeltaT;  

if ((Tnew >= Temp) & (LoadOn)) //Off
{
  PORTD.3 = 1;
  PORTD.2 = 0;              
  LoadOn = 0;
}             

Temp = T_LoadOn;             

if ((Tnew <= Temp) & (!LoadOn)) //On
{
  PORTD.3 = 0;
  PORTD.2 = 1;
  LoadOn = 1;  
} 

if (Counter > 0)
{
  Counter --;
}  
else
{
  View = 0;
}
RefreshDisplay();

}

// Declare your global variables here

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

        //Разряд DDRx - определяет направление передачи данных (0 - вход, 1 - выход).
        //Разряд PORTx - если вывод определен выходом (DDRx = 1), то:
        //         если установлена 1 - то на выводе устанавливается лог. 1
        //         если установлена 0 - то на выводе устанавливается лог. 0
        //    если вывод определен входом (DDRx = 0), то PORTx - определяет состояние подтягивающего резистора (при PORTx = 1 резистор подключен)
        //Разряд PINx - доступен только для чтения и содержит физическое значение вывода порта
        
        PORTA=0b00000011;
        DDRA= 0b00000000;
        
        PORTB=0b00000000;
        DDRB= 0b11111111;
        
         
        #ifdef Cathode  
          PORTD=0b01110111;
          DDRD= 0b00111111;
        #endif
        
        #ifdef Anode  
          PORTD=0b01000100;
          DDRD= 0b00111111;
        #endif


PORTD.3 = 1;
PORTD.2 = 0;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 8000,000 kHz
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x05;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 7,813 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x04;
TCNT1H=0x03;
TCNT1L=0xD1;
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=0x82;

// 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
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;

// 1 Wire Bus initialization
Tnew = 1000;  

if (eeT_LoadOn == 0xFFFF)
  eeT_LoadOn = 1280;
if (DeltaT == 0xFF)
  DeltaT = 10; 
  
T_LoadOn = eeT_LoadOn;
DeltaT = eeDeltaT;   

RefreshDisplay();

w1_init();
w1_write(0xCC);
w1_write(0x44);  

KbdInit();

// Global enable interrupts
#asm("sei")

while (1)
      {
      // Place your code here
      #asm("cli");
      ShowDisplayData();
      #asm("sei"); 
      };  
                          
}[/size]

Это мне всё слишком сложно, мне не нужны обработчики кнопок, и код для водонагревателя мне тоже не нужен.
Есть нужная мне схема, Но нет прошивки,

Т,Е. помогите мне упростить Тамашнюю прошивку под мою схему,
Конкретные изменения в схеме,
1)Индикатор подключен по другому:
а. Индикатор с общим анодом (плюсом)
б. Другие порты
анод1индикатора PA0
анод2индикатора PA1
анод3индикатора PA2
анод4индикатора PA3

катодAиндикаторов PC0
катодBиндикаторов PC1
катодCиндикаторов PC2
катодDиндикаторов PC3
катодEиндикаторов PC4
катодFиндикаторов PC5
катодGиндикаторов PC6
катодHиндикаторов PC7

2) реле подключено к порту PD7, чтобы оно замкнулось, на PD7 должно оказаться +5v
3)убраны элементы управления, нет необходимости менять режимы, теперь алгоритм постоянен в прошивке,
Если t<2 снять с PD7 +5v
Если t>6 подать на PD7 +5V
Те будет поддерживаться температура от 2 до 6
Последний раз редактировалось shev377 Пн июн 14, 2010 12:16:15, всего редактировалось 1 раз.
Реклама
Аватара пользователя
zhu4er
Вымогатель припоя
Сообщения: 544
Зарегистрирован: Пт июн 04, 2010 17:40:13
Откуда: Непокорный город-герой Севастополь

Re: ТермомЭтр Помогите с созданием прошивки на Cи

Сообщение zhu4er »

Держи и думай :)
Принципиалка.JPG
Для бойлера
(75.19 КБ) 510 скачиваний
boiler.c
Прога для бойлера
(5.04 КБ) 425 скачиваний
termoreg.c
Для инкубатора на ЖК
(3.36 КБ) 402 скачивания
termo99.c
Градусник уже год как использую
(3.44 КБ) 430 скачиваний
Даже у стен есть уши...
Реклама
shev377
Открыл глаза
Сообщения: 48
Зарегистрирован: Пт янв 29, 2010 21:34:59

Re: ТермомЭтр Помогите с созданием прошивки на Cи

Сообщение shev377 »

спасибо конечно, но на минусе всё это без существенной доработки не заработает
shev377
Открыл глаза
Сообщения: 48
Зарегистрирован: Пт янв 29, 2010 21:34:59

Re: ТермомЭтр Помогите с созданием прошивки на Cи

Сообщение shev377 »

Решил писать с нуля, помогите с функцией получения данных с датчика в переменную, и преобразованием в систему СИ (градусы цельсия) (на СИ)
ctpexhih
Встал на лапы
Сообщения: 119
Зарегистрирован: Пн окт 05, 2009 20:01:20

Re: ТермомЭтр Помогите с созданием прошивки на Cи

Сообщение ctpexhih »

Держи. Сам пробовал организовать по уарт общение в 18В20, но там не получилось почему-то из-за неподходящих временных интервалов, хотя делал все по апноту официальному, и скорость уарт правильно настраивал, но не получалось, хоть убей. Когда сам руками сделал функции - заработало. Если у вас будут проблему с получением данных, то попробуйте поиграть с задержками в функциях чтения бита в приложенном файле. Да, и еще необходимо в бит порта, к которому подключен датчик, записать лог 0. В приложенной программе этого нет, т.к. это только кусок большой программы.

P.S. Еще забыл сказать, что программа писалась для MSP430, но переделать для AVR проблем не составит.
Вложения
1-wire.txt
(4.9 КБ) 285 скачиваний
shev377
Открыл глаза
Сообщения: 48
Зарегистрирован: Пт янв 29, 2010 21:34:59

Re: ТермомЭтр Помогите с созданием прошивки на Cи

Сообщение shev377 »

Почти закончил написание прошивки, и печатку уже сделал,
вопрос,
я точно знаю что есть библиотека для работы с динамической индикацией LED, где её можно найти,
Видел просто когда-то, в неё посылаются настройки LED Индикатора, и текст

где можно найти урок динамической индикации на СИ на 4 сегмента с общим анодом (! 8 транзисторов лишние ставить не собираюсь),
а то всякая хрень попадается.
shev377
Открыл глаза
Сообщения: 48
Зарегистрирован: Пт янв 29, 2010 21:34:59

Re: ТермомЭтр Помогите с созданием прошивки на Cи

Сообщение shev377 »

Всё до чего дописался, так и не написал функцию дробления числа temp на отдельные цифры digit_out1 digit_out2 digit_out3 digit_out4
просьба просмотреть явные ошибки

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


#include <mega8.h>               //библиотека ввода\вывода
#include <delay.h>               //библиотека задержки


DDRB.0=1 //здесь катоды, сегменты дисплея, порт определён на выход... А точно так нужно?
DDRB.1=1 //здесь катоды, сегменты дисплея, порт определён на выход... А точно так нужно?
DDRB.2=1 //здесь катоды, сегменты дисплея, порт определён на выход... А точно так нужно?
DDRB.3=1 //здесь катоды, сегменты дисплея, порт определён на выход... А точно так нужно?
DDRB.4=1 //здесь катоды, сегменты дисплея, порт определён на выход... А точно так нужно?
DDRB.5=1 //здесь катоды, сегменты дисплея, порт определён на выход... А точно так нужно?
DDRB.6=1 //здесь катоды, сегменты дисплея, порт определён на выход... А точно так нужно?
DDRB.7=1 //здесь катоды, сегменты дисплея, порт определён на выход... А точно так нужно?


DDRD.0=1 //здесь анод 1, порт определён на выход... А точно так нужно?
DDRD.1=1 //здесь анод 2, порт определён на выход... А точно так нужно?
DDRD.2=1 //здесь анод 3, порт определён на выход... А точно так нужно?
DDRD.3=1 //здесь анод 4, порт определён на выход... А точно так нужно?


DDRD.6=0 //здесь датчик, порт на вход

DDRA.0=1 //здесь реле, порт на выход









#asm                             //сообщаем куда подключен датчик, D6 порт
        .equ __w1_port=0x15; PORTD
        .equ __w1_bit=6
#endasm                  

#include <1wire.h>               //библиотека работы с 1Wire
#include <ds18b20.h>             //библиотека для работы с датчиком ds18b20
#include <stdio.h>               //





//Массив с числами для вывода
      unsigned char digits[] = {

//0
0b01010000,
//1
0b11011011,
//2
0b01100010,.
//3
0b01001010,
 //4
0b11001001,
//5
0b01001100,
//6
0b01000100, 
//7
0b11011010,
//8
0b01000000, 
//9
0b01001000,
//минус
0b11101111,
//пусто
0b11111111,
//градус
0b11101000
};




void main(void)                  
{
unsigned char devices;         //переменная в которой количество присоеденённых датчиков
int temp;                        //переменная для хранения температуры
devices=w1_init();               //ищим датчики
while(devices>0)                 //бесконечный цикл, если датчик подключон
      {

          temp=ds18b20_temperature(0);  //читаем температуру  
          if (temp>1000){               //если датчик выдаёт больше 1000
             temp=4096-temp;            //отнимаем от данных 4096
             temp=-temp;                //и ставим знак "минус"
          }



//реле

if (temp>6){               //если датчик выдаёт больше 6 градусов подать на реле плюс 5 вольт
PORTA.0=1
}

if (temp<3){               //если датчик выдаёт больше 3 градусов снять с реле плюс 5 вольт
PORTA.0=0
}





//вывод на индикатор temp



//Здесь функция дробления числа temp на digit_out1 digit_out2 digit_out3 digit_out4
//при этом число может быть как и одноразрядным так и трёхразрядным с минусом.



//вывод digit_out1 digit_out2 digit_out3 digit_out4
//Функция обработки прерывания от Таймера 0
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
switch (cursor)
{
case 0:{PORTD=0b0000010;break;};
case 1:{PORTD=0b0010000;break;};
case 2:{PORTD=0b0000100;break;};
case 3:{PORTD=0b0001000;break;};
}
PORTB=digits[digit_out[cursor]];
 cursor++;
if (cursor==4) cursor=0;
}







//delay_ms(500);              ждём 500мс, прокомментировал, delay нельзя применять в прерываниях


      };
}


shev377
Открыл глаза
Сообщения: 48
Зарегистрирован: Пт янв 29, 2010 21:34:59

Re: ТермомЭтр Помогите с созданием прошивки на Cи

Сообщение shev377 »

немного поменял код,
Буду писать разбивание вручную, но зато 200% будет работать,
( по принципу если число -10 то
digit1 = -
digit2 = 1
digit 3=0
digit 4 =
)
Напишу явасрипт который мне напишет красивый словарик для этих целей, от -30 до +50.


Посмотрите пож нет ли ещё ошибок?
и ещё вопрос, как округлить число до целых? так temp=(char)temp ?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18670
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: ТермомЭтр Помогите с созданием прошивки на Cи

Сообщение ARV »

shev377 писал(а):Всё до чего дописался, так и не написал функцию дробления числа temp на отдельные цифры digit_out1 digit_out2 digit_out3 digit_out4
вам не кажется, что вы тут сами с собой беседуете? странно, правда?
на счет перевода числа в символы я писал специальную статью, ссылки на которую давал на этом форуме не один раз. исходники для работы с 1-wire имеются так же у меня на сайте (WinAVR, но портировать на ваш любимый CVAVR не проблема).
рекомендую вам все-таки ознакомиться с тем, что уже сделано, прежде чем изобретать велосипед самостоятельно.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
shev377
Открыл глаза
Сообщения: 48
Зарегистрирован: Пт янв 29, 2010 21:34:59

Re: ТермомЭтр Помогите с созданием прошивки на Cи

Сообщение shev377 »

1820 я благополучно сжёг неправильной полярностью,
теперь меня волнует другой вопрос:
Как подключить (код на си) DS1821 к AVR (дада, это тот самый датчик для которого нет ни одной библиотеки в интернете а с 1820.h он не рботает)
Многодневный гуглинг помог найти готовый пример
http://pinokio3000.narod.ru/sourches/Dallas_1Wire.htm
но я не понимаю как он работает=> не понимаю как его упростить чтобы он просто получал с датчика D6 температуру в temp
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18670
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: ТермомЭтр Помогите с созданием прошивки на Cи

Сообщение ARV »

shev377 писал(а):Как подключить (код на си) DS1821 к AVR (дада, это тот самый датчик для которого нет ни одной библиотеки в интернете а с 1820.h он не рботает)
вообще-то библиотек полно для 1-wire, только пользоваться надо низкоуровневыми функциями типа "послать байт - принять байт", а не высокоуровневыми типа "получить температуру". описание интерфейса есть на всех языках, библиотек - как грязи, дело за малым: напрячься и разобраться во всем этом :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
shev377
Открыл глаза
Сообщения: 48
Зарегистрирован: Пт янв 29, 2010 21:34:59

Re: ТермомЭтр Помогите с созданием прошивки на Cи

Сообщение shev377 »

Низкоуровневые функции - это для спецов
библиотек как грязи... Ну и где например искать эти библиотеки?
http://www.google.ru/#hl=ru&newwindow=1 ... aefaa405b2
Не предлагать



Ну вообще я нашёл какую-то библиотеку,
но это по моему какая-то хрень
1821 примеры!.rar
(1.3 КБ) 208 скачиваний
И ещё одну нашёл,
Похоже, то что нужно
1w1821то что надо.rar
(3.5 КБ) 204 скачивания
НО всё это, как Вы правильно отметили, для функций типа "получить байт, отправить байт", а вот как заставить эти БАЙТЫ преобразовывать в температуру...

Во втром архиве, вроде как, даже температура записывается в переменную _temperature, но не понятно как конфигурируются порты датчиков
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18670
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: ТермомЭтр Помогите с созданием прошивки на Cи

Сообщение ARV »

а чтобы байты преобразовать в температуру - надо прочитать доку на датчик - там все написано подробно. ничего сложного там нет. DS1821 вообще единственным байтом температуру выдает.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
shev377
Открыл глаза
Сообщения: 48
Зарегистрирован: Пт янв 29, 2010 21:34:59

Re: ТермомЭтр Помогите с созданием прошивки на Cи

Сообщение shev377 »

А ну да, собственно это в даташите есть
например 00000000 = 0
Всего-то 255 условий, тем более у меня разброс Т от -10 до 50, это можно и в if описать :)

Ну хорошо, как выбить этот байт из устройства?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18670
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: ТермомЭтр Помогите с созданием прошивки на Cи

Сообщение ARV »

shev377 писал(а):А ну да, собственно это в даташите есть
например 00000000 = 0
Всего-то 255 условий, тем более у меня разброс Т от -10 до 50, это можно и в if описать :)

Ну хорошо, как выбить этот байт из устройства?
1. читайте букварь по Си - какие 255 условий?!
2. читайте доку на датчик - протокол обмена там изложен подробно. есть на русском отличные статьи Ридико Л.И. ну и ваш покорный слуга отметился не раз статьями...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
shev377
Открыл глаза
Сообщения: 48
Зарегистрирован: Пт янв 29, 2010 21:34:59

Re: ТермомЭтр Помогите с созданием прошивки на Cи

Сообщение shev377 »

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

2. читайте доку на датчик - протокол обмена там изложен подробно. есть на русском отличные статьи Ридико Л.И. ну и ваш покорный слуга отметился не раз статьями...
Нифига в этом даташите нет,
Единственное что я понял, это то, что нужно читать данные из регистра AAh КАк?*?? там нифига не сказано.

А вот отсюда ничего нельзя выдрать?
http://electronix.ru/redirect.php?http: ... mostat.zip
Закрыто

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