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

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

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

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

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

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

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

 
Опции темы
Непрочитано 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.RU
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 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
Сообщений: 10,018
Сказал спасибо: 936
Сказали Спасибо 2,270 раз(а) в 1,565 сообщении(ях)
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
Сообщений: 10,018
Сказал спасибо: 936
Сказали Спасибо 2,270 раз(а) в 1,565 сообщении(ях)
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.RU
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 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.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
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.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) - тоже странно - какой смысл на байт маску из всех единиц накладывать?
_Артём_ вне форума  
Сказали "Спасибо" _Артём_
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, время: 09:28.


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