Например TDA7294

Форум РадиоКот • Просмотр темы - Прошу помочь с МК
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Сб мар 14, 2026 07:43:58

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: Прошу помочь с МК
СообщениеДобавлено: Ср ноя 14, 2012 00:41:38 
Родился

Зарегистрирован: Ср ноя 14, 2012 00:31:24
Сообщений: 6
Рейтинг сообщения: 0
Прошу помочь - не могу разобраться как подать напряжение/сигнал к оптосимистру от МК, такое ощущение, что неправильно написан кусок для чтения данных с АЦП и вывода сигнала на PORTD.0

СпойлерИзображение


Код под катом:
Спойлер
Код:
#include <mega8.h>      //библиотека ввода\вывода
#include <delay.h>      //библиотека задержки
#asm            //сообщаем куда подключен датчик
        .equ __w1_port=0x15; PORTC
        .equ __w1_bit=3
#endasm                 
#asm            //сообщаем куда подключен экран
   .equ __lcd_port=0x18
#endasm
#include <lcd.h>      //библиотека для LCD
#include <1wire.h>      //библиотека работы с 1Wire
#include <ds18b20.h>      //библиотека для работы с датчиком ds18b20
#include <stdio.h>      //стандартная библиотека
char lcd_buffer[33];      //массив с данными для экрана
int temp;
int izm;

void main(void)                 
{
unsigned char devices;      //переменная в которой количество присоеденённых датчиков
lcd_init(16);         //инициализация LCD, и говорим что он на 16 символов
devices=w1_init();      //ищем датчики
while(devices>0)      //бесконечный цикл, если датчик подключен
   {
   temp=ds18b20_temperature(0);   //читаем температуру 
   if (temp>1000)         //если датчик выдает больше 1000
      {               
                temp=4096-temp;      //отнимаем от данных 4096
      temp=-temp;      //и ставим знак "минус"
             }
   sprintf(lcd_buffer,"t=%i.%u\xdfC",temp,temp%5);   //записываем массив для экрана
   lcd_clear();                  //чистим дисплей перед выводом
   lcd_puts(lcd_buffer);               //выводим массив на LCD
   delay_ms(500);                  //ждём 500мс
   };

DDRD = 0x00;   
ADCSRA |= (1 << ADEN) //Включение АЦП
|(1 << ADPS1)|(1 << ADPS0); // предделитель преобразователя на 8
ADMUX |= (0 << REFS1)|(0 << REFS0) // внешний ИОН
|(0 << MUX0)|(0 << MUX1)|(0 << MUX2)|(0 << MUX3); // вход PC0

while(1)
{
unsigned int u;
ADCSRA |= (1 << ADSC);    //Начинаем преобразование
while ((ADCSRA&(1 << ADIF))== 0); //Ждем флага окончания преобразования   
u = (ADCL|ADCH << 8);  // Считываем  ADC

if (u > 128)                 //0.625V
    {izm = 20;
     if (izm<temp)
        {PORTD.0=1;}         
        else
        {PORTD.0=0;}}
if (u > 256)                  //1.25V
    {izm = 21;
     if (izm<temp)
        {PORTD.0=1;}         
        else
        {PORTD.0=0;}} 
if (u > 384)                  //1.875V
    {izm = 22;
     if (izm<temp)
        {PORTD.0=1;}         
        else
        {PORTD.0=0;}}
if (u > 512)                  //2.5V
    {izm = 23;
     if (izm<temp)
        {PORTD.0=1;}         
        else
        {PORTD.0=0;}}
if (u > 640)                  //3.125V
    {izm = 24;
     if (izm<temp)
        {PORTD.0=1;}         
        else
        {PORTD.0=0;}}
if (u > 768)                  //3.75V
    {izm = 25;
     if (izm<temp)
        {PORTD.0=1;}         
        else
        {PORTD.0=0;}}
if (u > 896)                  //4.375V
    {izm = 26;
     if (izm<temp)
        {PORTD.0=1;}         
        else
        {PORTD.0=0;}}
if (u > 1020)                 //5V
    {izm = 27;
     if (izm<temp)
        {PORTD.0=1;}         
        else
        {PORTD.0=0;}}
delay_ms(50);
}
}


Вложения:
Termo.zip [64.61 KiB]
Скачиваний: 170


Последний раз редактировалось Bagum_Bagum Ср ноя 14, 2012 01:52:15, всего редактировалось 2 раз(а).
Вернуться наверх
 
 Заголовок сообщения: Re: Прошу помочь с МК
СообщениеДобавлено: Ср ноя 14, 2012 00:52:33 
Держит паяльник хвостом
Аватар пользователя

Карма: 10
Рейтинг сообщений: 82
Зарегистрирован: Ср апр 16, 2008 13:22:54
Сообщений: 906
Откуда: Приднестровье, Тирасполь
Рейтинг сообщения: 0
Код:
DDRD = 0x01;

_________________
Любой, заслуживающий внимания, опыт приобретается себе в убыток...


Вернуться наверх
 
 Заголовок сообщения: Re: Прошу помочь с МК
СообщениеДобавлено: Ср ноя 14, 2012 00:57:26 
Родился

Зарегистрирован: Ср ноя 14, 2012 00:31:24
Сообщений: 6
Рейтинг сообщения: 0
Goodefine писал(а):
Код:
DDRD = 0x01;


К сожалению, напряжение все равно остается нулевым на этом участке :(


Вернуться наверх
 
 Заголовок сообщения: Re: Прошу помочь с МК
СообщениеДобавлено: Ср ноя 14, 2012 06:10:34 
Друг Кота
Аватар пользователя

Карма: 49
Рейтинг сообщений: 392
Зарегистрирован: Вс июл 12, 2009 19:15:29
Сообщений: 7014
Откуда: Ижевск
Рейтинг сообщения: 0
Протеус или реал?

_________________
Docendo discimus


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
 Заголовок сообщения: Re: Прошу помочь с МК
СообщениеДобавлено: Ср ноя 14, 2012 10:15:02 
Родился

Зарегистрирован: Ср ноя 14, 2012 00:31:24
Сообщений: 6
Рейтинг сообщения: 0
pyzhman писал(а):
Протеус или реал?


Протеус


Вернуться наверх
 
 Заголовок сообщения: Re: Прошу помочь с МК
СообщениеДобавлено: Ср ноя 14, 2012 10:18:27 
Держит паяльник хвостом
Аватар пользователя

Карма: 10
Рейтинг сообщений: 82
Зарегистрирован: Ср апр 16, 2008 13:22:54
Сообщений: 906
Откуда: Приднестровье, Тирасполь
Рейтинг сообщения: 0
Приложите весь проект в папке, похоже что то с настройкой АЦП, да и чтение тоже оставляет желать лучшего.
Похоже до АЦП дело вообще не доходит:
Код:
while(devices>0)      //бесконечный цикл, если датчик подключен

_________________
Любой, заслуживающий внимания, опыт приобретается себе в убыток...


Вернуться наверх
 
 Заголовок сообщения: Re: Прошу помочь с МК
СообщениеДобавлено: Ср ноя 14, 2012 13:58:57 
Родился

Зарегистрирован: Ср ноя 14, 2012 00:31:24
Сообщений: 6
Рейтинг сообщения: 0
Goodefine писал(а):
Приложите весь проект в папке, похоже что то с настройкой АЦП, да и чтение тоже оставляет желать лучшего.
Похоже до АЦП дело вообще не доходит:
Код:
while(devices>0)      //бесконечный цикл, если датчик подключен

Исправил на это
Спойлер
Код:
#include <mega8.h>      //библиотека ввода\вывода
#include <delay.h>      //библиотека задержки
#asm            //сообщаем куда подключен датчик
        .equ __w1_port=0x15; PORTC
        .equ __w1_bit=3
#endasm                 
#asm            //сообщаем куда подключен экран
   .equ __lcd_port=0x18
#endasm
#include <lcd.h>      //библиотека для LCD
#include <1wire.h>      //библиотека работы с 1Wire
#include <ds18b20.h>      //библиотека для работы с датчиком ds18b20
#include <stdio.h>      //стандартная библиотека
char lcd_buffer[33];      //массив с данными для экрана
int temp;
int izm;

void main(void)                 
{
unsigned char devices;      //переменная в которой количество присоеденённых датчиков
DDRD = 0x01;   
ADCSRA |= (1 << ADEN) //Включение АЦП
|(1 << ADPS1)|(1 << ADPS0); // предделитель преобразователя на 8
ADMUX |= (0 << REFS1)|(0 << REFS0) // внешний ИОН
|(0 << MUX0)|(0 << MUX1)|(0 << MUX2)|(0 << MUX3); // вход PC0
lcd_init(16);         //инициализация LCD, и говорим что он на 16 символов
devices=w1_init();      //ищем датчики
while(devices>0)      //бесконечный цикл, если датчик подключен
   {
    unsigned int u;
   temp=ds18b20_temperature(0);   //читаем температуру 
   if (temp>1000)         //если датчик выдает больше 1000
       {               
                temp=4096-temp;      //отнимаем от данных 4096
      temp=-temp;      //и ставим знак "минус"
             }
   sprintf(lcd_buffer,"t=%i.%u\xdfC",temp,temp%1);   //записываем массив для экрана
   lcd_clear();                  //чистим дисплей перед выводом
   lcd_puts(lcd_buffer);               //выводим массив на LCD
    ADCSRA |= (1 << ADSC);    //Начинаем преобразование
    while ((ADCSRA&(1 << ADIF))== 0); //Ждем флага окончания преобразования   
    u = (ADCL|ADCH << 8);  // Считываем  ADC
    if (u > 128)                 //0.625V
      {izm = 20;
     if (izm<temp)
        {PORTD.0=1;}         
        else
        {PORTD.0=0;}}
    if (u > 256)                  //1.25V
      {izm = 21;
     if (izm<temp)
        {PORTD.0=1;}         
        else
        {PORTD.0=0;}} 
    if (u > 384)                  //1.875V
      {izm = 22;
     if (izm<temp)
        {PORTD.0=1;}         
        else
        {PORTD.0=0;}}
    if (u > 512)                  //2.5V
      {izm = 23;
     if (izm<temp)
        {PORTD.0=1;}         
        else
        {PORTD.0=0;}}
    if (u > 640)                  //3.125V
      {izm = 24;
     if (izm<temp)
        {PORTD.0=1;}         
        else
        {PORTD.0=0;}}
    if (u > 768)                  //3.75V
      {izm = 25;
     if (izm<temp)
        {PORTD.0=1;}         
        else
        {PORTD.0=0;}}
    if (u > 896)                  //4.375V
      {izm = 26;
     if (izm<temp)
        {PORTD.0=1;}         
        else
        {PORTD.0=0;}}
    if (u > 1020)                 //5V
      {izm = 27;
     if (izm<temp)
        {PORTD.0=1;}         
        else
        {PORTD.0=0;}}
    delay_ms(50);
    }
}

И все равно не хочет подавать на ножку pd0
Выкладываю проект в протеусе, код и CAVR
Вложение:
Termo Proteus+CVAVR.zip [40.87 KiB]
Скачиваний: 135


UPD1 - Задал PORTD.0=1 в начале цикла, напряжение подается на PD0, но при изменении переменного напряжения выше 0.625 В оно сразу падает
получается нужно каждый раз после условия if подавать его?

UPD2 - Получилось подать сигнал на транзистор. Неправильно написал код сравнения температур - надо разбираться с даташитом на датчик температуры, значением izm и temp


Вернуться наверх
 
 Заголовок сообщения: Re: Прошу помочь с МК
СообщениеДобавлено: Ср ноя 14, 2012 14:53:25 
Держит паяльник хвостом
Аватар пользователя

Карма: 10
Рейтинг сообщений: 82
Зарегистрирован: Ср апр 16, 2008 13:22:54
Сообщений: 906
Откуда: Приднестровье, Тирасполь
Рейтинг сообщения: 0
Будет гораздо легче, если научитесь пользоваться отладкой:
Вложение:
ex.jpg [232.44 KiB]
Скачиваний: 321

_________________
Любой, заслуживающий внимания, опыт приобретается себе в убыток...


Вернуться наверх
 
 Заголовок сообщения: Re: Прошу помочь с МК
СообщениеДобавлено: Ср ноя 14, 2012 19:00:26 
Родился

Зарегистрирован: Ср ноя 14, 2012 00:31:24
Сообщений: 6
Рейтинг сообщения: 0
Goodefine писал(а):
Будет гораздо легче, если научитесь пользоваться отладкой:
Вложение:
ex.jpg

Спасибо! Буду учиться!


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 3 часа


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

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y