Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
12.02.2010, 02:33
|
|
Прохожий
Регистрация: 03.02.2010
Сообщений: 4
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
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);
};
};
} |
Подскажите как это сделать.
Заранее спасибо.
|
|
|
|
12.02.2010, 07:57
|
|
Гражданин KAZUS.RU
Регистрация: 13.06.2005
Адрес: РК г.Павлодар
Сообщений: 866
Сказал спасибо: 99
Сказали Спасибо 216 раз(а) в 140 сообщении(ях)
|
Re: Atmega8 термометр
Если LCD четырехстрочный, то перед каждым новым выводом сместить курсор на следующую строку.
void lcd_gotoxy(unsigned char x, unsigned char y)
__________________
Не ошибается лишь тот, кто ни чего не делает!
|
|
|
|
12.02.2010, 11:58
|
|
Прохожий
Регистрация: 03.02.2010
Сообщений: 4
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Atmega8 термометр
Сообщение от woroba
|
Если LCD четырехстрочный, то перед каждым новым выводом сместить курсор на следующую строку.
void lcd_gotoxy(unsigned char x, unsigned char y)
|
Я просто не силен в "Си" поэтому и обратился за помощью,если кому то не трудно изменить кусок кода и выложить здесь,буду благодарен.
|
|
|
|
12.02.2010, 14:37
|
|
Вид на жительство
Регистрация: 14.10.2009
Сообщений: 338
Сказал спасибо: 35
Сказали Спасибо 92 раз(а) в 73 сообщении(ях)
|
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);
};
|
Вот и всего делов.....
|
|
|
|
13.02.2010, 18:40
|
|
Вид на жительство
Регистрация: 14.10.2009
Сообщений: 338
Сказал спасибо: 35
Сказали Спасибо 92 раз(а) в 73 сообщении(ях)
|
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);
};
};
}
|
Если где синтаксис напортачил, эскьюзи муа, поправьте.
ЗЫ не забывайте говорить спасибо
|
|
|
Эти 10 пользователя(ей) сказали Спасибо MasterMushi за это сообщение:
|
|
|
16.02.2010, 10:42
|
|
Прохожий
Регистрация: 03.02.2010
Сообщений: 4
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
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, остальные датчики показывают номально
|
|
|
|
17.02.2010, 19:42
|
|
Прохожий
Регистрация: 03.02.2010
Сообщений: 4
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Atmega8 термометр
Сообщение от Gizmors
|
В протеусе на первом датчике выдает ошибку "CPU=-9999*C, остальные датчики показывают номально
|
Вопрос снят, ошибку нашел.
Еще раз спасибо "MasterMushi" за проделанную работу
|
|
|
|
27.11.2010, 19:07
|
|
Прохожий
Регистрация: 27.11.2010
Сообщений: 1
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Atmega8 термометр
Цитата:
|
В протеусе на первом датчике выдает ошибку "CPU=-9999*C, остальные датчики показывают номально
Вопрос снят, ошибку нашел.
|
Для меня также отображает CPU=-9999,
скажи мне, где было ошибкой.
Большое спасибо за ответ.
|
|
|
|
09.12.2014, 19:11
|
|
Вид на жительство
Регистрация: 09.10.2012
Сообщений: 327
Сказал спасибо: 124
Сказали Спасибо 71 раз(а) в 38 сообщении(ях)
|
Re: Atmega8 термометр
Мужики, может кто реализовал описанный в коде функционал средствами Ардуино? Может поделитесь скетчем?
|
|
|
|
09.12.2014, 20:47
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,907
Сказал спасибо: 2,543
Сказали Спасибо 11,818 раз(а) в 5,924 сообщении(ях)
|
Re: Atmega8 термометр
Вас наличие кирпичей избавило от нужды знать как что устроено? Программа ведь не в кодах, а нормальный сишный текст. Почему не хотите самостоятельно перетащить в Абдурину? "Не царское это дело - с контроллерами разбираться, лучше кубики, как дите малое, поскладываю" Так, да?
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
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, время: 11:49.
|
|