Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

Atmega8 термометр

Непрочитано 12.02.2010, 02:33  
Gizmors
Прохожий
 
Регистрация: 03.02.2010
Сообщений: 4
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Gizmors на пути к лучшему
По умолчанию Atmega8 термометр

Добрый день.
Собрал термометр на atmege8 и ds1820 все работает только вот хотелось бы чтоб индикация температуры шла в столбец а не попеременно.
Пример:
t1=34*C
t2=44*C
t3=33*C
t4=66*C
Вот код
Код:
#include ‹mega8.h›
#include ‹stdlib.h›
#include ‹ctype.h›
#include ‹delay.h›
#include ‹string.h›
#include ‹stdio.h›

 




#asm
    .equ __w1_port=0x15
    .equ __w1_bit=0
#endasm



#asm
    .equ __lcd_port=0x12
#endasm

#include ‹lcd.h› 
#include ‹ds18b20.h›
#include ‹delay.h›
#include ‹stdio.h›

char lcd_buffer[20];

/* maximum number of DS18B20 connected to the 1 Wire bus */
#define MAX_DEVICES 8

/* DS18B20 devices ROM code storage area */
unsigned char rom_code[MAX_DEVICES][9];

main()
{
unsigned char i,j,devices;

lcd_init(20);
lcd_putsf("TEST");
delay_ms(500);
lcd_clear();

/* detect how many DS18B20 devices
   are connected to the 1 Wire bus */
devices=w1_search(0xf0,rom_code);
sprintf(lcd_buffer,"%u DS18B20\nDevice detected",devices);
lcd_puts(lcd_buffer);
delay_ms(500);

/* display the ROM codes for each device */
if (devices)
   {
   for (i=0;i‹devices;i++)
       {
       sprintf(lcd_buffer,"Device #%u ROM\nCode is:",i+1);
       lcd_clear();
       lcd_puts(lcd_buffer);
       delay_ms(2000);
       lcd_clear();
       for (j=0;j‹8;j++)
           {
           sprintf(lcd_buffer,"%02X ",rom_code[i][j]);
           lcd_puts(lcd_buffer);
           if (j==3) lcd_gotoxy(0,1);
           };
       delay_ms(500);
       };
   }
else
while (1); /* stop here if no devices were found */

/* configure each DS18B20 device for 12 bit temperature
   measurement resolution */
for (i=0;i‹devices;)
    if (!ds18b20_init(&rom_code[i++][0],20,30,DS18B20_12BIT_RES))
       {
       sprintf(lcd_buffer,"Init error for\ndevice #%u",i);
       lcd_clear();
       lcd_puts(lcd_buffer);
       while (1); /* stop here if init error */
       };

/* measure and display the temperature(s) */       
while (1)
      {
      j=1;
      for (i=0;i‹devices;i++)
          {
          sprintf(lcd_buffer,"t%u=%+.3f\xdfC",j++,ds18b20_temperature(&rom_code[i][0]));
          lcd_clear();
          lcd_puts(lcd_buffer);
          delay_ms(500);
          
          
          };
      };
}
Подскажите как это сделать.
Заранее спасибо.
Реклама:
Gizmors вне форума  
Непрочитано 12.02.2010, 07:57  
woroba
Гражданин KAZUS.RUN
 
Регистрация: 13.06.2005
Адрес: РК г.Павлодар
Сообщений: 862
Сказал спасибо: 98
Сказали Спасибо 216 раз(а) в 139 сообщении(ях)
woroba на пути к лучшему
По умолчанию Re: Atmega8 термометр

Если LCD четырехстрочный, то перед каждым новым выводом сместить курсор на следующую строку.

void lcd_gotoxy(unsigned char x, unsigned char y)
__________________
Не ошибается лишь тот, кто ни чего не делает!
woroba вне форума  
Непрочитано 12.02.2010, 11:58  
Gizmors
Прохожий
 
Регистрация: 03.02.2010
Сообщений: 4
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Gizmors на пути к лучшему
По умолчанию Re: Atmega8 термометр

Сообщение от woroba Посмотреть сообщение
Если LCD четырехстрочный, то перед каждым новым выводом сместить курсор на следующую строку.

void lcd_gotoxy(unsigned char x, unsigned char y)
Я просто не силен в "Си" поэтому и обратился за помощью,если кому то не трудно изменить кусок кода и выложить здесь,буду благодарен.
Gizmors вне форума  
Непрочитано 12.02.2010, 14:37  
MasterMushi
Вид на жительство
 
Регистрация: 14.10.2009
Сообщений: 338
Сказал спасибо: 35
Сказали Спасибо 92 раз(а) в 73 сообщении(ях)
MasterMushi на пути к лучшему
По умолчанию Re: Atmega8 термометр

PHP код:

      lcd_clear();
      for (i=0;i‹devices;i++)
          {
          sprintf(lcd_buffer,"t%u=%+.3f\xdfC",j++,ds18b20_temperature(&rom_code[i][0]));
          lcd_gotoxy(0,i);
          lcd_puts(lcd_buffer);
          delay_ms(500);
          }; 
Вот и всего делов.....
MasterMushi вне форума  
Непрочитано 13.02.2010, 18:40  
MasterMushi
Вид на жительство
 
Регистрация: 14.10.2009
Сообщений: 338
Сказал спасибо: 35
Сказали Спасибо 92 раз(а) в 73 сообщении(ях)
MasterMushi на пути к лучшему
По умолчанию Re: Atmega8 термометр

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


PHP код:
/*

MEGA8 Термометр+Тахометр

Датчики температуры должны быть подключены на порт C (PORTC)
LCD экран должен быть подключен на порт B (PORTB) потому что для отсчета оборотов придется использовать аппаратные прерывания
Поэтому от кварца можно отказаться вообще!!!!!

Распиновка подключения LCD:
MEGA8  LCD
14     4
15     5
16     6
18     11
19     12
9      13
10     14
Остальные ножки на LCD подключаем по документации или схеме которая прилагалась изначально

В связи с тем, что после переноса LCD на порт B мы начинаем работать от встроенного задающего генератора на 8Mhz, 
нужно будет выставить соответствующие фьюзы
В Code Vision AVR нужно поставить галочки на таких строках: 
CKSEL0
CKSEL1
CKSEL3
SUT0
BODEN
BOOTSZ0 
BOOTSZ1

Подключаем датчик оборотов:
Желтый провод от куллера процессора должен быть подключен через n-p-n транзистор (BC547 или КТ315 да и пофигу модель вообщето)
подключен на ногу 4 нашей AtMega8

                              ------ 4я нога 
                            |/к
Желтый провод›--[ 1KOhm ]---|
                Резистор   б|\э
                              |
                              -Общий
*/

#include ‹mega8.h›
#include ‹stdlib.h›
#include ‹delay.h›
#include ‹ctype.h›
#include ‹string.h›
#include ‹stdio.h›
#asm 
    .equ __w1_port=0x15 ;//PORTC
    .equ __w1_bit=0
#endasm
#asm
    .equ __lcd_port=0x18 ;//PORTB
#endasm

#include ‹lcd.h› 
#include ‹ds18b20.h›

char lcd_buffer[20],i,j,devices;
unsigned int RPM_1sec=1000; // Переменная для отсчета 1й секунды
unsigned int RPM_count=1; //Счетчик оборотов
unsigned int RPM_show=1; //Переменная для отображения подсчета


/* maximum number of DS18B20 connected to the 1 Wire bus */
#define MAX_DEVICES 8

/* DS18B20 devices ROM code storage area */
unsigned char rom_code[MAX_DEVICES][9];

//Внешнее прерывание для отсчета оборотов
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Приплюсуем 1 к счетчику оборотов если был получен сигнал от датчика на вентиляторе
  RPM_count++;
}

// Прерывание по таймеру 125кгц/125 = 1000 кгц
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0=0x7D;
if (!RPM_1sec--)
  { //1 раз в секунду обновляем показания оборотов
    RPM_show=RPM_count;
    RPM_count=0;
    RPM_1sec=1000;
  }
}

void system_init(void)
{
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x04; //Подключаем подтягивающий резистор на INT0 для надежного считывания оборотов
DDRD=0x00;
// Clock value: 125,000 kHz
TCCR0=0x03;
TCNT0=0x7D; //Переполнять таймер с частотой 1khz
//При переполнении выпадать в прерывание
TIMSK=0x01;
// Включим внешние прерывания
// INT0: On
// INT0 режим: Падение сигналла на ножке в 0
// INT1: Off
GICR|=0x40;
MCUCR=0x00;
GIFR=0x40;
lcd_init(20); //LCD 4 строки по 20
lcd_putsf("MEGA8 DISPLAY");
delay_ms(1000);
lcd_clear();
//Заставим работать все прерывания
#asm("sei")
}


main()
{

system_init();

/* detect how many DS18B20 devices
   are connected to the 1 Wire bus */
devices=w1_search(0xf0,rom_code);
sprintf(lcd_buffer,"%u DS18B20\nDevice detected",devices);
lcd_puts(lcd_buffer);
delay_ms(2000);

/* Покажем ROM коды на каждое из обнаруженных устройств */
if (devices)
   {
   for (i=0;i‹devices;i++)
       {
       sprintf(lcd_buffer,"Device #%u ROM\nCode is:",i+1);
       lcd_clear();
       lcd_puts(lcd_buffer);
       delay_ms(2000);
       lcd_clear();
       for (j=0;j‹8;j++)
           {
           sprintf(lcd_buffer,"%02X ",rom_code[i][j]);
           lcd_puts(lcd_buffer);
           if (j==3) lcd_gotoxy(0,1);
           };
       delay_ms(500);
       };
   }
else
   { 
     lcd_gotoxy(0,1);
     lcd_putsf("NO DS18b20 DEVICES!!!");
     while (1); /* Залипнем навсегда если ничего не было подключено */
   }
/* Поставим каждый датчик в режим измерения с 12ти битной точностью */
for (i=0;i‹devices;)
    if (!ds18b20_init(&rom_code[i++][0],20,30,DS18B20_12BIT_RES))
       {
       sprintf(lcd_buffer,"Init error for\ndevice #%u",i);
       lcd_clear();
       lcd_puts(lcd_buffer);
       while (1); /* Залипаем при ошибках перевода в нужный режим точности*/
       };

/* measure and display the temperature(s) */       
while (1)
      {
      j=1;
      //lcd_clear(); если мы постоянно по циклу пишем одно на другое то и очищать экран не надо. миганий не будет!!!
      for (i=0;i‹devices;i++)
          {
          //В данном варианте первые 4 датчика обзаываются как CPU GPU NB Case. Дополнительные датчики, 
          //которые еще были налеплены на порт С обзываются как T1, T2, T3 и так далеее

           if (i›3) 
            {
              sprintf(lcd_buffer,"T%u=%+.3f\xdfC   ",j++,ds18b20_temperature(&rom_code[i][0]));
              lcd_gotoxy(0,i-4);
            }
          else  lcd_gotoxy(0,i);
          if (!i)
            sprintf(lcd_buffer,"CPU=%+.3f\xdfC PRM=%u     ",ds18b20_temperature(&rom_code[i][0]),RPM_show);
          if (i==1)
            sprintf(lcd_buffer,"GPU=%+.3f\xdfC   ",ds18b20_temperature(&rom_code[i][0]));
          if (i==2)
            sprintf(lcd_buffer,"NB=%+.3f\xdfC   ",ds18b20_temperature(&rom_code[i][0]));
          if (i==3)
            sprintf(lcd_buffer,"CASE=%+.3f\xdfC   ",ds18b20_temperature(&rom_code[i][0]));
          lcd_puts(lcd_buffer);
          delay_ms(1000);
          };
      };
} 
Если где синтаксис напортачил, эскьюзи муа, поправьте.

ЗЫ не забывайте говорить спасибо
MasterMushi вне форума  
Эти 10 пользователя(ей) сказали Спасибо MasterMushi за это сообщение:
123ksn (08.12.2014), akselerometr (19.02.2010), Baloo_76 (16.02.2010), Cyber_RAT (31.07.2010), dundel1 (10.12.2014), Evg_55 (10.12.2014), Gizmors (14.02.2010), gladun5 (10.12.2014), grbizly (15.06.2010), mastergid (15.02.2010)
Непрочитано 16.02.2010, 10:42  
Gizmors
Прохожий
 
Регистрация: 03.02.2010
Сообщений: 4
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Gizmors на пути к лучшему
По умолчанию Re: Atmega8 термометр

Сообщение от MasterMushi Посмотреть сообщение
По просьбе трудящихся переписал код.
Теперь мы умеем считать обороты, показывать красиво температуру для главных устройств компутера


PHP код:
/*

MEGA8 Термометр+Тахометр

Датчики температуры должны быть подключены на порт C (PORTC)
LCD экран должен быть подключен на порт B (PORTB) потому что для отсчета оборотов придется использовать аппаратные прерывания
Поэтому от кварца можно отказаться вообще!!!!!

Распиновка подключения LCD:
MEGA8  LCD
14     4
15     5
16     6
18     11
19     12
9      13
10     14
Остальные ножки на LCD подключаем по документации или схеме которая прилагалась изначально

В связи с тем, что после переноса LCD на порт B мы начинаем работать от встроенного задающего генератора на 8Mhz, 
нужно будет выставить соответствующие фьюзы
В Code Vision AVR нужно поставить галочки на таких строках: 
CKSEL0
CKSEL1
CKSEL3
SUT0
BODEN
BOOTSZ0 
BOOTSZ1

Подключаем датчик оборотов:
Желтый провод от куллера процессора должен быть подключен через n-p-n транзистор (BC547 или КТ315 да и пофигу модель вообщето)
подключен на ногу 4 нашей AtMega8

                              ------ 4я нога 
                            |/к
Желтый провод›--[ 1KOhm ]---|
                Резистор   б|\э
                              |
                              -Общий
*/

#include ‹mega8.h›
#include ‹stdlib.h›
#include ‹delay.h›
#include ‹ctype.h›
#include ‹string.h›
#include ‹stdio.h›
#asm 
    .equ __w1_port=0x15 ;//PORTC
    .equ __w1_bit=0
#endasm
#asm
    .equ __lcd_port=0x18 ;//PORTB
#endasm

#include ‹lcd.h› 
#include ‹ds18b20.h›

char lcd_buffer[20],i,j,devices;
unsigned int RPM_1sec=1000; // Переменная для отсчета 1й секунды
unsigned int RPM_count=1; //Счетчик оборотов
unsigned int RPM_show=1; //Переменная для отображения подсчета


/* maximum number of DS18B20 connected to the 1 Wire bus */
#define MAX_DEVICES 8

/* DS18B20 devices ROM code storage area */
unsigned char rom_code[MAX_DEVICES][9];

//Внешнее прерывание для отсчета оборотов
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Приплюсуем 1 к счетчику оборотов если был получен сигнал от датчика на вентиляторе
  RPM_count++;
}

// Прерывание по таймеру 125кгц/125 = 1000 кгц
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0=0x7D;
if (!RPM_1sec--)
  { //1 раз в секунду обновляем показания оборотов
    RPM_show=RPM_count;
    RPM_count=0;
    RPM_1sec=1000;
  }
}

void system_init(void)
{
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x04; //Подключаем подтягивающий резистор на INT0 для надежного считывания оборотов
DDRD=0x00;
// Clock value: 125,000 kHz
TCCR0=0x03;
TCNT0=0x7D; //Переполнять таймер с частотой 1khz
//При переполнении выпадать в прерывание
TIMSK=0x01;
// Включим внешние прерывания
// INT0: On
// INT0 режим: Падение сигналла на ножке в 0
// INT1: Off
GICR|=0x40;
MCUCR=0x00;
GIFR=0x40;
lcd_init(20); //LCD 4 строки по 20
lcd_putsf("MEGA8 DISPLAY");
delay_ms(1000);
lcd_clear();
//Заставим работать все прерывания
#asm("sei")
}


main()
{

system_init();

/* detect how many DS18B20 devices
   are connected to the 1 Wire bus */
devices=w1_search(0xf0,rom_code);
sprintf(lcd_buffer,"%u DS18B20\nDevice detected",devices);
lcd_puts(lcd_buffer);
delay_ms(2000);

/* Покажем ROM коды на каждое из обнаруженных устройств */
if (devices)
   {
   for (i=0;i‹devices;i++)
       {
       sprintf(lcd_buffer,"Device #%u ROM\nCode is:",i+1);
       lcd_clear();
       lcd_puts(lcd_buffer);
       delay_ms(2000);
       lcd_clear();
       for (j=0;j‹8;j++)
           {
           sprintf(lcd_buffer,"%02X ",rom_code[i][j]);
           lcd_puts(lcd_buffer);
           if (j==3) lcd_gotoxy(0,1);
           };
       delay_ms(500);
       };
   }
else
   { 
     lcd_gotoxy(0,1);
     lcd_putsf("NO DS18b20 DEVICES!!!");
     while (1); /* Залипнем навсегда если ничего не было подключено */
   }
/* Поставим каждый датчик в режим измерения с 12ти битной точностью */
for (i=0;i‹devices;)
    if (!ds18b20_init(&rom_code[i++][0],20,30,DS18B20_12BIT_RES))
       {
       sprintf(lcd_buffer,"Init error for\ndevice #%u",i);
       lcd_clear();
       lcd_puts(lcd_buffer);
       while (1); /* Залипаем при ошибках перевода в нужный режим точности*/
       };

/* measure and display the temperature(s) */       
while (1)
      {
      j=1;
      //lcd_clear(); если мы постоянно по циклу пишем одно на другое то и очищать экран не надо. миганий не будет!!!
      for (i=0;i‹devices;i++)
          {
          //В данном варианте первые 4 датчика обзаываются как CPU GPU NB Case. Дополнительные датчики, 
          //которые еще были налеплены на порт С обзываются как T1, T2, T3 и так далеее

           if (i›3) 
            {
              sprintf(lcd_buffer,"T%u=%+.3f\xdfC   ",j++,ds18b20_temperature(&rom_code[i][0]));
              lcd_gotoxy(0,i-4);
            }
          else  lcd_gotoxy(0,i);
          if (!i)
            sprintf(lcd_buffer,"CPU=%+.3f\xdfC PRM=%u     ",ds18b20_temperature(&rom_code[i][0]),RPM_show);
          if (i==1)
            sprintf(lcd_buffer,"GPU=%+.3f\xdfC   ",ds18b20_temperature(&rom_code[i][0]));
          if (i==2)
            sprintf(lcd_buffer,"NB=%+.3f\xdfC   ",ds18b20_temperature(&rom_code[i][0]));
          if (i==3)
            sprintf(lcd_buffer,"CASE=%+.3f\xdfC   ",ds18b20_temperature(&rom_code[i][0]));
          lcd_puts(lcd_buffer);
          delay_ms(1000);
          };
      };
} 
Если где синтаксис напортачил, эскьюзи муа, поправьте.

ЗЫ не забывайте говорить спасибо

В протеусе на первом датчике выдает ошибку "CPU=-9999*C, остальные датчики показывают номально
Gizmors вне форума  
Непрочитано 17.02.2010, 19:42  
Gizmors
Прохожий
 
Регистрация: 03.02.2010
Сообщений: 4
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Gizmors на пути к лучшему
По умолчанию Re: Atmega8 термометр

Сообщение от Gizmors Посмотреть сообщение
В протеусе на первом датчике выдает ошибку "CPU=-9999*C, остальные датчики показывают номально
Вопрос снят, ошибку нашел.
Еще раз спасибо "MasterMushi" за проделанную работу
Gizmors вне форума  
Непрочитано 27.11.2010, 19:07  
rutek42
Прохожий
 
Регистрация: 27.11.2010
Сообщений: 1
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
rutek42 на пути к лучшему
По умолчанию Re: Atmega8 термометр

Цитата:
В протеусе на первом датчике выдает ошибку "CPU=-9999*C, остальные датчики показывают номально
Вопрос снят, ошибку нашел.
Для меня также отображает CPU=-9999,
скажи мне, где было ошибкой.

Большое спасибо за ответ.
rutek42 вне форума  
Непрочитано 09.12.2014, 19:11  
123ksn
Вид на жительство
 
Аватар для 123ksn
 
Регистрация: 09.10.2012
Сообщений: 333
Сказал спасибо: 124
Сказали Спасибо 71 раз(а) в 38 сообщении(ях)
123ksn на пути к лучшему
По умолчанию Re: Atmega8 термометр

Мужики, может кто реализовал описанный в коде функционал средствами Ардуино? Может поделитесь скетчем?
123ksn вне форума  
Непрочитано 09.12.2014, 20:47  
akegor
Гуру портала
 
Аватар для akegor
 
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: Atmega8 термометр

Вас наличие кирпичей избавило от нужды знать как что устроено? Программа ведь не в кодах, а нормальный сишный текст. Почему не хотите самостоятельно перетащить в Абдурину? "Не царское это дело - с контроллерами разбираться, лучше кубики, как дите малое, поскладываю" Так, да?
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
akegor вне форума  
Сказали "Спасибо" akegor
severvovan (10.12.2014)
 
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ATmega8 kurilka Микроконтроллеры, АЦП, память и т.д 84 06.03.2010 16:03
Котроллер дисплея на Atmega8 kosant Микроконтроллеры, АЦП, память и т.д 24 30.11.2009 20:57
Порт С в ATmega8 VVKart Микроконтроллеры, АЦП, память и т.д 2 10.11.2009 14:08
proteus, atmega8, меняю ноги в hex - не работает digitest Микроконтроллеры, АЦП, память и т.д 3 08.10.2009 13:07


Часовой пояс GMT +4, время: 05:11.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.