Например TDA7294

Форум РадиоКот :: Просмотр темы - Прошу помочь с МК
Форум РадиоКот
https://radiokot.ru/forum/

Прошу помочь с МК
https://radiokot.ru/forum/viewtopic.php?f=57&t=80619
Страница 1 из 1

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

Прошу помочь - не могу разобраться как подать напряжение/сигнал к оптосимистру от МК, такое ощущение, что неправильно написан кусок для чтения данных с АЦП и вывода сигнала на 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

Автор:  Goodefine [ Ср ноя 14, 2012 00:52:33 ]
Заголовок сообщения:  Re: Прошу помочь с МК

Код:
DDRD = 0x01;

Автор:  Bagum_Bagum [ Ср ноя 14, 2012 00:57:26 ]
Заголовок сообщения:  Re: Прошу помочь с МК

Goodefine писал(а):
Код:
DDRD = 0x01;


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

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

Протеус или реал?

Автор:  Bagum_Bagum [ Ср ноя 14, 2012 10:15:02 ]
Заголовок сообщения:  Re: Прошу помочь с МК

pyzhman писал(а):
Протеус или реал?


Протеус

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

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

Автор:  Bagum_Bagum [ Ср ноя 14, 2012 13:58:57 ]
Заголовок сообщения:  Re: Прошу помочь с МК

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

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

Будет гораздо легче, если научитесь пользоваться отладкой:
Вложение:
ex.jpg [232.44 KiB]
Скачиваний: 322

Автор:  Bagum_Bagum [ Ср ноя 14, 2012 19:00:26 ]
Заголовок сообщения:  Re: Прошу помочь с МК

Goodefine писал(а):
Будет гораздо легче, если научитесь пользоваться отладкой:
Вложение:
ex.jpg

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

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/