реклама на сайте
подробности

 
 
> терморегулятор, помогите
Lost_Viking
сообщение Jul 30 2008, 12:01
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091



Собираю терморегулятор. Готова динамическая индикация (спасибо форумчанам). Теперь проблема с АЦП.
Цитата
/*****************************************************
Chip type : ATmega16
Clock frequency : 1,000000 MHz
*****************************************************/
#include <mega16.h>
char Dig[10]; // Массив, с кодами чисел для индикатора с общим анодом
char i=0; // счетчик для переключения анодов
char e=0; // единицы установленной температуры
char d=0; // десятки
char s=0; // сотни
char s2=0; // единицы измеренной температуры
char e2=0; // десятки
char d2=0; // сотни
char res=0; // в эту переменную поочереди записываются e,d,s или e2,d2,s2
char keys_prev=0; // две переменной для правильной работы кнопок
char keys_now=0; //
unsigned int current_temp=0; // измеренная температура
short temp2=0; // временная переменная
short set_temp=0; // установленная температура


char num (void) { // функция, для опроса клавиатуры, и вывода на катоды кода текущего разряда
if (PINB.4!=0){ // если кнопка "нагрев" не нажата, то
if ((keys_prev!=keys_now)&(PINB.0==0)) e++; // если нажата кнопка "единицы", то прибавить 1 к нулевому разряду (единицы)
if (e==10) e=0; // если результат прибавления перевалил за 9, то сбросить его в нуль
if ((keys_prev!=keys_now)&(PINB.1==0)) d++; // если нажата кнопка "десятки", то прибавить 1 к первому разряду (десятки)
if (d==10) d=0; // если результат прибавления перевалил за 9, то сбросить его в нуль
if ((keys_prev!=keys_now)&(PINB.2==0)) s++; // если нажата кнопка "сотни", то прибавить 1 к второму разряду (сотни)
if (s==3) s=0; // если результат прибавления перевалил за 9, то сбросить его в нуль
if (PINB.3==0) { // если нажата кнопка "сброс", то сбросить все разряды в нуль
e=0;
d=0;
s=0;}
switch (i) { // в зависимости от переменной i выбираем что показываем в текущий момент: единицы, десятки, или сотни
case 0:
res=e;
break;
case 1:
res=d;
break;
case 2:
res=s;
break; }
return res;}
else { // если нажата кнопка "нагрев", то

current_temp=ADCL; // в переменную записываем значение из регистра ADCL
current_temp+=((int)ADCH << 8); // прибавляем к переменной значение из регистра ADCH со сдвигом влево на 8 разрядов
current_temp=current_temp/2.5; // преобразовываем (ADCH ADCL) в температуру. Т.к. используется внутренний ИОН 2560 мВ, то 2560/1024=2.5
e2=current_temp%10; // получаем единицы измеренной температуры
temp2=current_temp/10; // промежуточная операция, для понижения степени
d2=temp2%10; // получаем десятки измеренной температуры
s2=temp2/10; // получаем сотни измеренной температуры
// в зависимости от переменной i выбираем что показываем в текущий момент времени
switch (i) {
case 0:
res=e2;
break;
case 1:
res=d2;
break;
case 2:
res=s2;
break; }
return res;


;}}

// Timer 0 output compare interrupt service routine
interrupt [TIM0_COMP] void timer0_comp_isr(void) //обработка прерывания таймера по совпадению с OCR0
{
keys_prev=keys_now; //для клавиш
keys_now=PINB; //читаем что нажато
if (i==3) i=0; //если показатель текущего разряда перевалил за 2, то зажигаем нулевой разряд
PORTC=Dig[num()]; //выставляем на катодах число, которое получаем из функции num()
switch (i) { //в зависимости от переменной i поочередно подаем питание на аноды
case 0: //если i=0, то включаем разряд для единиц
PORTD.1=1; //гасим ненужные разряды
PORTD.2=1;
PORTD.0=0; //включаем нулевой разряд, активный уровень - 0,т.к. используются p-n-p
break;
case 1: // и т.д.
PORTD.0=1;
PORTD.2=1;
PORTD.1=0;
break;
case 2:
PORTD.0=1;
PORTD.1=1;
PORTD.2=0;
break;}
i++;

}

// Declare your global variables here

void main(void)
{
PORTA=0x00;
DDRA=0x00;
PORTB=0xFF;
DDRB=0x00;
PORTC=0x00;
DDRC=0xFF;
PORTD=0x00;
DDRD=0xFF;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 0,977 kHz
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x0D;
TCNT0=0x00;
OCR0=0x03; //задаем частоту развертки. подбирал наглаз.

// Timer/Counter 1 initialization
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x02;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00; // free running режим АЦП
ADMUX=0xC0; // Внутренний источник опорного напряжения 2.56В REFS1..0=1; правое выравнивание ADLAR=0,вход ADC0
ADCSRA=0xE4; //ADEN=1(включили АЦП),ADSC=1(начали преобразование),ADATE:1(авто триггер включен),ADIE=0(прерывания от АЦП нам не нужны), делитель на 16

// заполняем массив комбинациями нулей/единиц для катодов
Dig[0] = 0xC0;
Dig[1] = 0xF9;
Dig[2] = 0xA4;
Dig[3] = 0xB0;
Dig[4] = 0x99;
Dig[5] = 0x92;
Dig[6] = 0x82;
Dig[7] = 0xF8;
Dig[8] = 0x80;
Dig[9] = 0x90;

#asm("sei") // включаем прерывания
while (1)
{
if (PINB.4==0) { // если нажата кнопка "нагрев", то
set_temp=e+d*10+s*100; // вычисляем установленную температуру, исходя из того, что в переменных e,d,s
if (current_temp<(set_temp-1)) {PORTD.3=1;}; //если текущая температура ниже установленной на 1 градус, то включаем релюшку
if (current_temp>=set_temp) {PORTD.3=0;};} //если текущая температура больше или равна установленной, то выключаем релюшку
else {PORTD.3=0;}; }; //если кнопка "нагрев" не нажата, то реле должно быть выключенным.
} // game over


почему-то в Proteus переменные e2,s2,d2 неправильно считаются. Залил в мегу - на индикаторе 409. Когда использовал прерывание АЦП, то у меня все работало. Но хочется упростить немного код (пусть хоть потребляет больше)
Схемку прилагаю.

Подскажите что не так, я уже не знаю чего делать.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Lost_Viking   терморегулятор   Jul 30 2008, 12:01
- - AHTOXA   Цитата(Lost_Viking @ Jul 30 2008, 18:01) ...   Jul 30 2008, 12:31
- - MrYuran   Кодcurrent_temp=current_temp/2.5; // преобразовыва...   Jul 30 2008, 12:40
- - domowoj   Протеус 7.2 .2 с авр работает глючно!!...   Jul 30 2008, 15:26
- - =GM=   Цитата(Lost_Viking @ Jul 30 2008, 11:01) ...   Jul 30 2008, 15:50
|- - Lost_Viking   Цитата(=GM= @ Jul 30 2008, 19:50) У вас н...   Jul 30 2008, 17:04
|- - AHTOXA   Цитата(Lost_Viking @ Jul 30 2008, 23:04) ...   Jul 30 2008, 17:31
||- - Lost_Viking   Цитата(AHTOXA @ Jul 30 2008, 21:31) А как...   Jul 30 2008, 18:56
||- - AVRdeveloper   Цитата(Lost_Viking @ Jul 30 2008, 21:56) ...   Jul 31 2008, 06:26
|||- - Lost_Viking   Цитата(AVRdeveloper @ Jul 31 2008, 10:26)...   Jul 31 2008, 10:08
|||- - AHTOXA   Цитата(Lost_Viking @ Jul 31 2008, 16:08) ...   Jul 31 2008, 10:53
|||- - Lost_Viking   Цитата(AHTOXA @ Jul 31 2008, 14:53) А в и...   Jul 31 2008, 11:19
||- - MrYuran   Цитата(Lost_Viking @ Jul 30 2008, 22:56) ...   Jul 31 2008, 06:42
||- - Lost_Viking   Цитата(MrYuran @ Jul 31 2008, 10:42) Я чт...   Jul 31 2008, 10:55
||- - MrYuran   Цитата(Lost_Viking @ Jul 31 2008, 14:55) ...   Jul 31 2008, 11:05
|- - defunct   Цитата(Lost_Viking @ Jul 30 2008, 20:04) ...   Jul 30 2008, 17:45
- - GDI   ЦитатаВ левой схеме тоже получается делитель, но е...   Jul 31 2008, 11:11
|- - defunct   Цитата(GDI @ Jul 31 2008, 14:11) Отнють н...   Jul 31 2008, 11:55
|- - xemul   Цитата(defunct @ Jul 31 2008, 15:55) Посм...   Jul 31 2008, 13:01
- - AHTOXA   Цитата(GDI @ Jul 31 2008, 17:11) Отнють н...   Jul 31 2008, 11:37
- - GDI   Хочу уточнить чтобы не было иллюзий. В левой схеме...   Jul 31 2008, 11:56
|- - defunct   Цитата(GDI @ Jul 31 2008, 14:56) P.S. Вхо...   Jul 31 2008, 12:04
|- - MrYuran   Цитата(defunct @ Jul 31 2008, 16:04) Для ...   Jul 31 2008, 12:09
|- - defunct   Цитата(MrYuran @ Jul 31 2008, 15:09) Даже...   Jul 31 2008, 12:10
- - _Pasha   Цитата(Lost_Viking @ Jul 31 2008, 14:19) ...   Jul 31 2008, 11:57
|- - Lost_Viking   Цитата(_Pasha @ Jul 31 2008, 15:57) 1. TL...   Jul 31 2008, 14:47
||- - xemul   Цитата(Lost_Viking @ Jul 31 2008, 18:47) ...   Jul 31 2008, 14:54
|||- - Lost_Viking   Цитата(xemul @ Jul 31 2008, 18:54) Это бу...   Jul 31 2008, 15:29
|||- - xemul   Цитата(Lost_Viking @ Jul 31 2008, 19:29) ...   Jul 31 2008, 17:17
|||- - Lost_Viking   Цитата(xemul @ Jul 31 2008, 21:17) Метод ...   Jul 31 2008, 21:10
|||- - xemul   Цитата(Lost_Viking @ Aug 1 2008, 01:10) ч...   Jul 31 2008, 21:29
|||- - Lost_Viking   Цитата(xemul @ Aug 1 2008, 01:29) Попробу...   Aug 4 2008, 18:56
|||- - Огурцов   Цитата(Lost_Viking @ Aug 4 2008, 18:56) В...   Aug 4 2008, 20:57
|||- - Lost_Viking   Цитата(Огурцов @ Aug 5 2008, 00:57) Бугаг...   Aug 5 2008, 07:05
||||- - xemul   Цитата(Lost_Viking @ Aug 5 2008, 11:05) В...   Aug 5 2008, 09:04
||||- - Lost_Viking   Цитата(xemul @ Aug 5 2008, 13:04) ЗЫЖ я к...   Aug 5 2008, 14:50
||||- - rezident   Цитата(Lost_Viking @ Aug 5 2008, 20:50) К...   Aug 5 2008, 15:00
||||- - Lost_Viking   Цитата(rezident @ Aug 5 2008, 19:00) Кста...   Aug 5 2008, 17:14
|||- - Tanya   Цитата(Огурцов @ Aug 5 2008, 00:57) Бугаг...   Aug 5 2008, 16:00
||- - sKWO   Цитата(Lost_Viking @ Jul 31 2008, 17:47) ...   Jul 31 2008, 17:05
||- - Lost_Viking   Цитата(sKWO @ Jul 31 2008, 21:05) очень п...   Jul 31 2008, 17:38
||- - xemul   Цитата(Lost_Viking @ Jul 31 2008, 21:38) ...   Jul 31 2008, 18:10
||- - Lost_Viking   Цитата(xemul @ Jul 31 2008, 22:10) Операц...   Jul 31 2008, 18:50
||- - Stanislav_S   Цитата(Lost_Viking @ Jul 31 2008, 23:50) ...   Jul 31 2008, 20:24
||- - xemul   Цитата(Lost_Viking @ Jul 31 2008, 22:50) ...   Jul 31 2008, 20:48
||- - rezident   Цитата(xemul @ Aug 1 2008, 02:48) Да тупо...   Jul 31 2008, 22:17
|- - domowoj   Цитата(_Pasha @ Jul 31 2008, 18:57) 1. TL...   Aug 3 2008, 06:25
|- - Lost_Viking   Цитата(domowoj @ Aug 3 2008, 10:25) 1.ТЛк...   Aug 3 2008, 14:01
- - GDI   Заглянул в даташит на atmega48_68_168, там указано...   Jul 31 2008, 12:37
- - GDI   У атмела есть апликэйшены на темы: AVR222: 8-Point...   Aug 1 2008, 06:54
- - Lost_Viking   Такс, собираю ИОН на TL431OEB. Насколько хорош это...   Aug 1 2008, 10:43
- - MrYuran   А может даласовские датчики поставить и не мучитьс...   Aug 1 2008, 10:50
|- - Lost_Viking   Цитата(MrYuran @ Aug 1 2008, 14:50) А мож...   Aug 1 2008, 13:46
|- - xemul   Цитата(Lost_Viking @ Aug 1 2008, 17:46) К...   Aug 1 2008, 14:54
|- - rezident   Цитата(Lost_Viking @ Aug 1 2008, 19:46) К...   Aug 1 2008, 15:52
|- - _Pasha   Цитата(Lost_Viking @ Aug 1 2008, 17:46) З...   Aug 1 2008, 17:30
|- - xemul   Цитата(_Pasha @ Aug 1 2008, 21:30) Какая ...   Aug 1 2008, 18:01
|- - _Pasha   Цитата(xemul @ Aug 1 2008, 22:01) ADLAR=1...   Aug 1 2008, 18:19
|- - Lost_Viking   Цитата(xemul @ Aug 1 2008, 22:01) ADLAR=1...   Aug 1 2008, 21:47
- - domowoj   Lost_Viking А мож Вам лучше DS18x20 применить, ник...   Aug 2 2008, 11:26
|- - Lost_Viking   Цитата(domowoj @ Aug 2 2008, 15:26) Lost_...   Aug 2 2008, 15:27
|- - Огурцов   Цитата(Lost_Viking @ Aug 2 2008, 15:27) М...   Aug 3 2008, 12:32
- - domowoj   Хотя бы REF02. Я бы вообще выключил все генератор...   Aug 3 2008, 15:05
|- - Lost_Viking   Цитата(domowoj @ Aug 3 2008, 19:05) а 102...   Aug 3 2008, 15:18
- - domowoj   Lost_Viking Может лучше применить ЖК индикатор.   Aug 3 2008, 15:31
|- - Lost_Viking   Цитата(domowoj @ Aug 3 2008, 19:31) Lost_...   Aug 3 2008, 15:46
|- - rezident   Цитата(Lost_Viking @ Aug 3 2008, 21:46) P...   Aug 3 2008, 17:34
- - domowoj   EXCEL не знаю. А ЖК от чего?   Aug 3 2008, 17:17
|- - Lost_Viking   Цитата(domowoj @ Aug 3 2008, 21:17) А ЖК ...   Aug 3 2008, 19:56
|- - rezident   Цитата(Lost_Viking @ Aug 4 2008, 01:56) с...   Aug 3 2008, 20:38
- - domowoj   ADC=1023*Vin/Vref так будет понятней.   Aug 3 2008, 17:43
- - Lost_Viking   вопрос остается открытым: почему в Даташите в этой...   Aug 3 2008, 22:34
|- - rezident   Цитата(Lost_Viking @ Aug 4 2008, 04:34) в...   Aug 4 2008, 16:01
- - domowoj   Если в даташите написано - верь, но тогда диапазон...   Aug 4 2008, 00:13
- - Dopler   Цитатаwhere VIN is the voltage on the selected inp...   Aug 4 2008, 08:13
|- - Lost_Viking   Цитата(Dopler @ Aug 4 2008, 12:13) Вот чт...   Aug 4 2008, 14:39
|- - _Pasha   Цитата(Lost_Viking @ Aug 4 2008, 17:39) П...   Aug 5 2008, 23:40
- - Lost_Viking   Так, все сделал. Сглаживает здорово! Огурцов,...   Aug 5 2008, 08:16
|- - Огурцов   Цитата(Lost_Viking @ Aug 5 2008, 08:16) О...   Aug 5 2008, 14:41
- - domowoj   Усреднение не всегда есть хорошо. Если есть время(...   Aug 5 2008, 16:41
|- - rezident   Цитата(domowoj @ Aug 5 2008, 22:41) мз ма...   Aug 5 2008, 17:00
|- - xemul   Цитата(domowoj @ Aug 5 2008, 20:41) Усред...   Aug 5 2008, 21:55
|- - domowoj   Цитата(xemul @ Aug 6 2008, 04:55) Вы пред...   Aug 6 2008, 00:54
- - domowoj   Да нет, похоже не медианная.   Aug 5 2008, 17:25
|- - rezident   Цитата(domowoj @ Aug 5 2008, 23:25) Да не...   Aug 5 2008, 17:49
- - xemul   Цитата(_Pasha @ Aug 6 2008, 03:40) Блин, ...   Aug 6 2008, 07:54
|- - domowoj   Цитата(xemul @ Aug 6 2008, 14:54) А зачем...   Aug 6 2008, 15:22
- - Lost_Viking   Сейчас с макетки на плату переведу, и займусь повы...   Aug 6 2008, 15:05
- - loskun   Lost_Viking как устройство, получилось? Вот _http:...   Sep 27 2008, 17:38
- - Twin_by   Всем привет. Не стал создавать новую тему. У меня ...   Oct 13 2016, 12:09
- - Dog Pawlowa   Скорее всего отладчик неправильно отображает локал...   Oct 14 2016, 15:05
- - Aldec   Цитата(Lost_Viking @ Jul 30 2008, 12:01) ...   Oct 21 2016, 07:27


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 15th June 2025 - 20:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.01492 секунд с 7
ELECTRONIX ©2004-2016