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

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

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

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

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

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

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

 
Опции темы
Непрочитано 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.RU
 
Регистрация: 13.06.2005
Адрес: РК г.Павлодар
Сообщений: 866
Сказал спасибо: 99
Сказали Спасибо 216 раз(а) в 140 сообщении(ях)
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;idevices;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_INT0void ext_int0_isr(void)
{
// Приплюсуем 1 к счетчику оборотов если был получен сигнал от датчика на вентиляторе
  
RPM_count++;
}

// Прерывание по таймеру 125кгц/125 = 1000 кгц
interrupt [TIM0_OVFvoid 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;idevices;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;j8;j++)
           {
           
sprintf(lcd_buffer,"%02X ",rom_code[i][j]);
           
lcd_puts(lcd_buffer);
           if (
j==3lcd_gotoxy(0,1);
           };
       
delay_ms(500);
       };
   }
else
   { 
     
lcd_gotoxy(0,1);
     
lcd_putsf("NO DS18b20 DEVICES!!!");
     while (
1); /* Залипнем навсегда если ничего не было подключено */
   
}
/* Поставим каждый датчик в режим измерения с 12ти битной точностью */
for (i=0;idevices;)
    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;idevices;i++)
          {
          
//В данном варианте первые 4 датчика обзаываются как CPU GPU NB Case. Дополнительные датчики, 
          //которые еще были налеплены на порт С обзываются как T1, T2, T3 и так далеее

           
if (i3
            {
              
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_INT0void ext_int0_isr(void)
{
// Приплюсуем 1 к счетчику оборотов если был получен сигнал от датчика на вентиляторе
  
RPM_count++;
}

// Прерывание по таймеру 125кгц/125 = 1000 кгц
interrupt [TIM0_OVFvoid 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;idevices;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;j8;j++)
           {
           
sprintf(lcd_buffer,"%02X ",rom_code[i][j]);
           
lcd_puts(lcd_buffer);
           if (
j==3lcd_gotoxy(0,1);
           };
       
delay_ms(500);
       };
   }
else
   { 
     
lcd_gotoxy(0,1);
     
lcd_putsf("NO DS18b20 DEVICES!!!");
     while (
1); /* Залипнем навсегда если ничего не было подключено */
   
}
/* Поставим каждый датчик в режим измерения с 12ти битной точностью */
for (i=0;idevices;)
    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;idevices;i++)
          {
          
//В данном варианте первые 4 датчика обзаываются как CPU GPU NB Case. Дополнительные датчики, 
          //которые еще были налеплены на порт С обзываются как T1, T2, T3 и так далеее

           
if (i3
            {
              
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
Сообщений: 312
Сказал спасибо: 119
Сказали Спасибо 69 раз(а) в 36 сообщении(ях)
123ksn на пути к лучшему
По умолчанию Re: Atmega8 термометр

Мужики, может кто реализовал описанный в коде функционал средствами Ардуино? Может поделитесь скетчем?
123ksn вне форума  
Непрочитано 09.12.2014, 20:47  
akegor
Гуру портала
 
Аватар для akegor
 
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,861
Сказал спасибо: 2,532
Сказали Спасибо 11,773 раз(а) в 5,897 сообщении(ях)
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, время: 07:46.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot