Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

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

 
Опции темы

Помогите разобраться с кодом на СИ для ATmega8

Непрочитано 01.08.2012, 16:48  
Dimitrij
Временная регистрация
 
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
Dimitrij на пути к лучшему
По умолчанию Помогите разобраться с кодом на СИ для 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 вне форума  
Сказали "Спасибо" Dimitrij
warel (29.06.2019)
Непрочитано 01.08.2012, 17:39  
ut1wpr
Почётный гражданин KAZUS.RUN
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию Re: Помогите разобраться с кодом на СИ для ATmega8

Вопросы. Причем, в отличие от вашего, весьма конкретные.
  1. Кто написал эту программу?
  2. Если авторство не ваше - почему не обратились к автору?
  3. Для чего вы привели полный текст программы?
  4. Что делать с этим текстом?
И последний вопрос. Как вы считаете, для чего создаются и существуют форумы? Важно услышать именно ваше личное мнение.
__________________
С уважением,
Vic / ut1wpr
ut1wpr вне форума  
Сказали "Спасибо" ut1wpr
warel (29.06.2019)
Непрочитано 01.08.2012, 17:39  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: Помогите разобраться с кодом на СИ для ATmega8

Не вижу никакой зависимости . В симуляторе прогоняли ?
Или вместо датчиков временно эмуляторы ...
__________________
Осторожно , злой кот
dosikus вне форума  
Сказали "Спасибо" dosikus
warel (29.06.2019)
Непрочитано 01.08.2012, 20:20  
Dimitrij
Временная регистрация
 
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
Dimitrij на пути к лучшему
По умолчанию Re: Помогите разобраться с кодом на СИ для ATmega8

Сообщение от ut1wpr Посмотреть сообщение
Вопросы. Причем, в отличие от вашего, весьма конкретные......
И последний вопрос. Как вы считаете, для чего создаются и существуют форумы? Важно услышать именно ваше личное мнение.
Форумы создаются, чтобы помогать друг другу, а не задавать ненужные вопросы. А программу написал я и прошу помощи.
Сообщение от dosikus
Не вижу никакой зависимости . В симуляторе прогоняли ?.
В том то и дело, что в симуляторе (Proteus) все нормально. Если зависимости никакой нет, может сменить Mega8 ма Mega16 или Mega32?
Dimitrij вне форума  
Сказали "Спасибо" Dimitrij
warel (29.06.2019)
Непрочитано 01.08.2012, 20:23  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: Помогите разобраться с кодом на СИ для ATmega8

Dimitrij, Сначала попробуйте что я вам предложил - вместо датчиков эмуляторы .
Может все нормально ?
__________________
Осторожно , злой кот
dosikus вне форума  
Сказали "Спасибо" dosikus
warel (29.06.2019)
Непрочитано 01.08.2012, 21:26  
st__1
Заблокирован
 
Регистрация: 31.12.2011
Сообщений: 726
Сказал спасибо: 32
Сказали Спасибо 223 раз(а) в 162 сообщении(ях)
st__1 на пути к лучшему
По умолчанию Re: Помогите разобраться с кодом на СИ для ATmega8

Сообщение от Dimitrij Посмотреть сообщение
А программу написал я и прошу помощи.
Как написали - так и работает...
Напишите правильно, и работать будет правильно...
Перепмсывайте заново... с нуля... гляди и понимание придёт...
Вам и задавали вопросы потому, что странная она вся... как на неё не смотри...
st__1 вне форума  
Сказали "Спасибо" st__1
warel (29.06.2019)
Непрочитано 01.08.2012, 21:56  
Dimitrij
Временная регистрация
 
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
Dimitrij на пути к лучшему
По умолчанию Re: Помогите разобраться с кодом на СИ для ATmega8

Сообщение от st__1 Посмотреть сообщение
Напишите правильно, и работать будет правильно...
Если бы я был уверен в правильности,то не спрашивал бы на форуме.
Сообщение от dosikus Посмотреть сообщение
вместо датчиков эмуляторы
Спасибо, попробую.
Dimitrij вне форума  
Сказали "Спасибо" Dimitrij
warel (29.06.2019)
Непрочитано 01.08.2012, 23:41  
ut1wpr
Почётный гражданин KAZUS.RUN
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию Re: Помогите разобраться с кодом на СИ для ATmega8

Сообщение от Dimitrij Посмотреть сообщение
Если зависимости никакой нет, может сменить Mega8 ма Mega16 или Mega32?
Ну а это при чем? Стека в ОЗУ недостаточно в восьмерке? Быть не может. Тогда зачем бесполезные движения вдоль и поперек по "железу". Не в нем дело. Гляньте на степени оптимизации в компиляторе, на фазе написания программ и при первичной отладке лучше всего оптимизацию отключать вообще.
__________________
С уважением,
Vic / ut1wpr
ut1wpr вне форума  
Сказали "Спасибо" ut1wpr
warel (29.06.2019)
Непрочитано 02.08.2012, 00:09  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Помогите разобраться с кодом на СИ для ATmega8

PHP код:
while (1)
      {
      static unsigned long counter = 0;
      static unsigned long count = 0;
      pwm();              //функция подсветки LCD
      
      counter++;
      if (counter ›= 600000) 
Оно точно работает хоть как-нибудь?
omercury вне форума  
Сказали "Спасибо" omercury
warel (29.06.2019)
Непрочитано 02.08.2012, 00:39  
_Артём_
Гражданин KAZUS.RUN
 
Регистрация: 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) - тоже странно - какой смысл на байт маску из всех единиц накладывать?
_Артём_ вне форума  
Сказали "Спасибо" _Артём_
warel (29.06.2019)
 
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите разобраться с таймером в Atmega8 artyomugr Микроконтроллеры, АЦП, память и т.д 83 21.07.2011 16:18
Помогите разобраться с кодом _grey_ Микроконтроллеры, АЦП, память и т.д 1 23.07.2010 19:16
mega8 помогите разобраться с кодом AGAT0365 Микроконтроллеры, АЦП, память и т.д 10 27.05.2010 16:08
Помогите разобраться с кодом Micro C for AVR deeman30rus Электроника - это просто 7 09.02.2010 11:46
помогите с кодом для АВР. язык си. Curt_atmel-proger Микроконтроллеры, АЦП, память и т.д 13 23.08.2007 20:53


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


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