Модераторы: PILOT, ManiaK, Mazzi
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Температурный датчик 
V
    Опции темы
goodking
Дата 21.10.2009, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 15.10.2009

Репутация: нет
Всего: нет



Надо связать температурный датчик со светодиодом, то-есть если температура превышает определенное значение-диод загорается

вот как я попытался это осуществить 
Код
#include "c8051F120.h"
#include <stdio.h>
sfr16 RCAP3=202;
sfr16 TMR3=204;
sfr16 ADC0=0xbe;
#define SYSCLK 3062500 
long temperature;
long ADC0_reading;
sbit LED=P1^6;
 void main(void);
void Reset_Sources_Init();
void Port_IO_Init();
void Timer_Init(int counts);
void ADC_Init();
void Voltage_Reference_Init();
void Interrupts_Init();



void main(void)
{    
    EA=0;
    Reset_Sources_Init();
    Port_IO_Init();
    Voltage_Reference_Init();

    Timer_Init(SYSCLK/12/10);
    ADC_Init();
    Interrupts_Init();
    EA=1;
    while (1){
    EA=0;
    temperature=ADC0_reading;
    EA=1;
    temperature = temperature - 42380;
    temperature = (temperature * 100L) / 156;
             }
}
void Reset_Sources_Init()
{
    WDTCN     = 0xDE;
    WDTCN     = 0xAD;
}

void Port_IO_Init()
{

    SFRPAGE   = CONFIG_PAGE;
    XBR2      = 0x40;
    P1MDOUT   = 0x40;

}

void Timer_Init( int counts)
{
    SFRPAGE   = TMR3_PAGE;
    TMR3CN    = 0x04;
    TMR3CF    = 0x08;
    RCAP3=-counts;
    TR3=1;
}

void ADC_Init()
{
    SFRPAGE   = ADC0_PAGE;
    AMX0SL    = 0x08;
    ADC0CF    = 0xF9;
    ADC0CN    = 0x85;
}
void Voltage_Reference_Init()
{
    SFRPAGE   = ADC0_PAGE;
    REF0CN    = 0x07;
}

void Interrupts_Init()
{
    IE        = 0x80;
    EIE2      = 0x01;
}



void Timer3_ISR (void) interrupt 14

{   TMR3CN &= ~(0x80);                      //--  сброс флага TF3 ожидание 
    SFRPAGE   = ADC0_PAGE;                  //-- окончания преобразования АЦП0
    while  (   (ADC0CN& 0x20) ==0)          //-- опрос AD0INT->l
    ADC0_reading = ADC0;                    //-- чтение данных АЦП0
    ADC0CN  &=  0xDF;                       //-- сброс AD0INT
    if (temperature > 2400 ){LED=1;}                      
    else LED=0;
}


все хорошо, одна проблема-не загорается! Может кто-то подскажет, в чем проблема?? smile 

Это сообщение отредактировал(а) goodking - 21.10.2009, 15:33
PM MAIL   Вверх
Mazzi
Дата 21.10.2009, 15:48 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



Тебе нужно в главной функции запустить ацп, и ждать прерывания от него по окончанию измерения.
затем уже включать или выключать светодиод.
В обработчике таймера нельзя ставить бесконечный цикл по условию установки аппаратного флага, скорее всего программа у тебя виснет в этом месте.

Потом ты даже не знаешь какое значение ты получаешь из ацп( если вообще происходит измерение ).

Выводи промежуточные результаты через юарт на компьютер и смотри, что реально у тебя там происходит.


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
goodking
Дата 21.10.2009, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 15.10.2009

Репутация: нет
Всего: нет




Цитата

В обработчике таймера нельзя ставить бесконечный цикл по условию установки аппаратного флага, скорее всего программа у тебя виснет в этом месте.

А почему??

Цитата

Потом ты даже не знаешь какое значение ты получаешь из ацп( если вообще происходит измерение ).

Выводи промежуточные результаты через юарт на компьютер и смотри, что реально у тебя там происходит.


Измерение происходит, в компиляторе есть такая функция "add to watch" любую переменную можно посмотреть.. так что юарт необязательно использовать! smile   

Это сообщение отредактировал(а) goodking - 21.10.2009, 16:56
PM MAIL   Вверх
ManiaK
Дата 22.10.2009, 06:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 2
Всего: 29



А это нормально, что вот эта строчка:

Код

while  (   (ADC0CN& 0x20) ==0)          //-- опрос AD0INT->l


не имеет точки с запятой?


Цитата(Mazzi @  21.10.2009,  15:48 Найти цитируемый пост)
В обработчике таймера нельзя ставить бесконечный цикл по условию установки аппаратного флага, скорее всего программа у тебя виснет в этом месте.


Хм.. действительно, почему? Конечно это не рекомендуемый стиль работы, но принципиальных проблем я не вижу. Объясни пожалуйста.

Это сообщение отредактировал(а) ManiaK - 22.10.2009, 06:52
PM MAIL WWW   Вверх
goodking
Дата 22.10.2009, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 15.10.2009

Репутация: нет
Всего: нет



Я неправильно сказал, при запуске программы диод сразу начинает мигать(при температуре ниже, чем в условии) но мигает с большими интервалами, и как-то хаотически, когда подвожу источник тепла, то через некоторое время начинает гореть стабильно, ну и когда убираю тепло, опять хаотически мигает. Вопрос как убрать эти мигания  smile


Цитата

Конечно это не рекомендуемый стиль работы, но принципиальных проблем я не вижу.

А как ты посоветуешь?

Это сообщение отредактировал(а) goodking - 22.10.2009, 09:49
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.0544 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.