Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
01.08.2012, 16:48
|
|
Временная регистрация
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
|
Помогите разобраться с кодом на СИ для ATmega8
Собрал схему для измерения параметров влажности, температуры дома и на улице, давления. Все работает, но при изменении поправки на влажность (vlazhnost+=3;) изменяются и показания температуры с аналогового датчика, а при изменении поправки на температуру(temp-=4;)-изменяются и показания влажности.
В чем дело, что-то я не разберусь, знаний маловато!
Код:
|
************************************************** ***
Chip type : ATmega8
Clock frequency : 4,000000 MHz
************************************************** ***/
#include ‹mega8.h›
// 1 Wire Bus functions
#asm
.equ __w1_port=0x12; PORTD
.equ __w1_bit=0
#endasm
#include ‹1wire.h›
#include ‹ds18b20.h› //библиотека для работы с датчиком ds18b20
unsigned char rom_code[1][9]; //масив с адресами найденых датчиков
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include ‹lcd.h›
#include ‹stdio.h›
#include ‹delay.h›
#include ‹mega8_bits.h›
unsigned char devices,i; //переменная
float vlazhnost,davlenie,temp,temp1; // ……………..
char lcd_text[33];
#define TEMP_ERR_RANGE(temp) ((temp › 60) || (temp ‹ -60))
#define ADC_VREF_TYPE 0x40
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
void pwm(void) // функция подсветки LCD
{
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: Phase correct PWM top=0xFF
// OC2 output: Non-Inverted PWM
unsigned int pwm;
pwm=read_adc(0);
pwm=pwm››2;
TCCR2=0x63; OCR2 = pwm;
}
void temperature(void) // функция по работе с термо-датчиком
{ temp1 = ds18b20_temperature(&rom_code[0][0]); // читаем температуру с выбранного датчика
if (TEMP_ERR_RANGE(temp1)) temp1 = 0;
}
void pressure(void)
{
davlenie=0;
for(i=0;i‹2;i++) davlenie=read_adc(1);
davlenie = (davlenie * 5000) / 1024; // Вычисляем напряжение милливольт.
davlenie= (davlenie/5+95)/900000*750064; // Значение в мм.рт.ст. //(мрс) K=7.50064
}
void vlaznost(void)
{
vlazhnost=0;
for(i=0;i‹6;i++) vlazhnost+=read_adc(2);
vlazhnost/=6;
vlazhnost = (vlazhnost * 5000) / 1023; // Вычисляем напряжение милливольт.
vlazhnost = ((vlazhnost - 813)/32); // Значение влажности в %
vlazhnost+=3;
if (vlazhnost › 100) vlazhnost = 100;
}
void temper(void) // функция по работе с термо-датчиком
{
temp=0;
for(i=0;i‹2;i++) temp=read_adc(3);
temp=(temp*5000)/1023;
temp/=10;
temp-=4;
}
void lcd_output(void)
{
sprintf(lcd_text ,"%.1f""%%"" ", vlazhnost);
lcd_gotoxy(10,0);
lcd_puts(lcd_text); // выводим масив на LCD
sprintf(lcd_text,"%.0fmm", davlenie);
lcd_gotoxy(10,1);
lcd_puts(lcd_text); // выводим масив на LCD
sprintf(lcd_text,"%+.1fC"" ",temp);
lcd_gotoxy(0,0); // указали место на дисплее
lcd_puts(lcd_text); // выводим масив на LCD
sprintf(lcd_text,"%+.1fC"" ",temp1);
lcd_gotoxy(0,1); // указали место на дисплее
lcd_puts(lcd_text); // выводим масив на LCD
}
void main(void)
{
PORTB=0x00; // «WzAVR «Port B initialization
DDRB=0x08; //
PORTC=0x00; // «WzAVR «Port C initialization
DDRC=0x00;
PORTD=0x00; // «WzAVR «Port D initialization
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x84;
w1_init(); // Wire Bus initialization
lcd_init(16);
devices=w1_search(DS18B20_SEARCH_ROM_CMD,rom_code) ; //определим сколько устройств подключено к шине 1-Wire
ds18b20_init(0,-50,50,DS18B20_12BIT_RES); // переключения термометра в 12 битный режим
while (1)
{
static unsigned long counter = 0;
static unsigned long count = 0;
pwm(); //функция подсветки LCD
counter++;
if (counter ›= 600000)
{
counter = 0;
temperature(); //считывание температуры с DS18B20
}
count++;
if (count ›= 80000)
{
count = 0;
pressure(); //измерение давления
temper(); //измерение температуры с аналогового датчика
vlaznost(); //измерение влажности
lcd_output(); //вывод всех показаний на индикатор}
}
};
} |
|
|
|
Сказали "Спасибо" Dimitrij
|
|
|
01.08.2012, 17:39
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Помогите разобраться с кодом на СИ для ATmega8
Вопросы. Причем, в отличие от вашего, весьма конкретные. - Кто написал эту программу?
- Если авторство не ваше - почему не обратились к автору?
- Для чего вы привели полный текст программы?
- Что делать с этим текстом?
И последний вопрос. Как вы считаете, для чего создаются и существуют форумы? Важно услышать именно ваше личное мнение.
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
01.08.2012, 17:39
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,018
Сказал спасибо: 936
Сказали Спасибо 2,270 раз(а) в 1,565 сообщении(ях)
|
Re: Помогите разобраться с кодом на СИ для ATmega8
Не вижу никакой зависимости . В симуляторе прогоняли ?
Или вместо датчиков временно эмуляторы ...
__________________
Осторожно , злой кот
|
|
|
Сказали "Спасибо" dosikus
|
|
|
01.08.2012, 20:20
|
|
Временная регистрация
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
|
Re: Помогите разобраться с кодом на СИ для ATmega8
Сообщение от ut1wpr
|
Вопросы. Причем, в отличие от вашего, весьма конкретные......
И последний вопрос. Как вы считаете, для чего создаются и существуют форумы? Важно услышать именно ваше личное мнение.
|
Форумы создаются, чтобы помогать друг другу, а не задавать ненужные вопросы. А программу написал я и прошу помощи.
Сообщение от dosikus
|
Не вижу никакой зависимости . В симуляторе прогоняли ?.
|
В том то и дело, что в симуляторе (Proteus) все нормально. Если зависимости никакой нет, может сменить Mega8 ма Mega16 или Mega32?
|
|
|
Сказали "Спасибо" Dimitrij
|
|
|
01.08.2012, 20:23
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,018
Сказал спасибо: 936
Сказали Спасибо 2,270 раз(а) в 1,565 сообщении(ях)
|
Re: Помогите разобраться с кодом на СИ для ATmega8
Dimitrij, Сначала попробуйте что я вам предложил - вместо датчиков эмуляторы .
Может все нормально ?
__________________
Осторожно , злой кот
|
|
|
Сказали "Спасибо" dosikus
|
|
|
01.08.2012, 21:26
|
|
Заблокирован
Регистрация: 31.12.2011
Сообщений: 726
Сказал спасибо: 32
Сказали Спасибо 223 раз(а) в 162 сообщении(ях)
|
Re: Помогите разобраться с кодом на СИ для ATmega8
Сообщение от Dimitrij
|
А программу написал я и прошу помощи.
|
Как написали - так и работает...
Напишите правильно, и работать будет правильно...
Перепмсывайте заново... с нуля... гляди и понимание придёт...
Вам и задавали вопросы потому, что странная она вся... как на неё не смотри...
|
|
|
|
01.08.2012, 21:56
|
|
Временная регистрация
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
|
Re: Помогите разобраться с кодом на СИ для ATmega8
Сообщение от st__1
|
Напишите правильно, и работать будет правильно...
|
Если бы я был уверен в правильности,то не спрашивал бы на форуме.
Сообщение от dosikus
|
вместо датчиков эмуляторы
|
Спасибо, попробую.
|
|
|
Сказали "Спасибо" Dimitrij
|
|
|
01.08.2012, 23:41
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Помогите разобраться с кодом на СИ для ATmega8
Сообщение от Dimitrij
|
Если зависимости никакой нет, может сменить Mega8 ма Mega16 или Mega32?
|
Ну а это при чем? Стека в ОЗУ недостаточно в восьмерке? Быть не может. Тогда зачем бесполезные движения вдоль и поперек по "железу". Не в нем дело. Гляньте на степени оптимизации в компиляторе, на фазе написания программ и при первичной отладке лучше всего оптимизацию отключать вообще.
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
02.08.2012, 00:09
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Помогите разобраться с кодом на СИ для ATmega8
PHP код:
|
while (1)
{
static unsigned long counter = 0;
static unsigned long count = 0;
pwm(); //функция подсветки LCD
counter++;
if (counter ›= 600000)
|
Оно точно работает хоть как-нибудь?
|
|
|
Сказали "Спасибо" omercury
|
|
|
02.08.2012, 00:39
|
|
Гражданин KAZUS.RU
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
|
Re: Помогите разобраться с кодом на СИ для ATmega8
Сообщение от omercury
|
PHP код:
|
while (1)
{
static unsigned long counter = 0;
static unsigned long count = 0;
pwm(); //функция подсветки LCD
counter++;
if (counter ›= 600000)
|
Оно точно работает хоть как-нибудь?
|
А что не должно работать?
Как-то вроде должно, хоть и криво: почему бы от какого-нибудь таймера не синхронизироваться?
А здесь:
Код:
|
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
} |
delay_us(10) - зачем? Помогает лучшие результаты получить?
(ADC_VREF_TYPE & 0xff) - тоже странно - какой смысл на байт маску из всех единиц накладывать?
|
|
|
Сказали "Спасибо" _Артём_
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 09:28.
|
|