Регуляция вращения вентилятора в зависимости от температуры

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
palladin2010
Открыл глаза
Сообщения: 54
Зарегистрирован: Чт мар 11, 2010 00:31:44

Регуляция вращения вентилятора в зависимости от температуры

Сообщение palladin2010 »

Здравствуйте, помогите подправить код по отображению температуры(в будущем код будет дополнен для регуляции вращения). Код составлял из кусков чужого кода, но не работает :(

Я начинающий программист МК, поэтому скорее всего допустил глупые ошибки, если не сложно могли бы вы помочь мне поправить его:

Код: Выделить всё

/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.8 Professional
Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 
Version : 
Date    : 05.05.2012
Author  : F4CG                            
Company : F4CG                            
Comments: 


Chip type           : ATtiny2313
Clock frequency     : 4,000000 MHz
Memory model        : Tiny
External SRAM size  : 0
Data Stack size     : 32
*****************************************************/

#include <tiny2313.h>    // объявляем библиотека ввода/вывода
#include <delay.h>        // объявляем библиотеку для задержки





#include <stdlib.h>
#include <ctype.h>
#include <string.h>


// 1 Wire Bus functions
#asm
   .equ __w1_port=0x12 ;PORTD
   .equ __w1_bit=2
#endasm
#include <1wire.h>

#include <ds1820.h> 
#include <delay.h>
         
#define MAX_DEVICES 6
unsigned char rom_codes[MAX_DEVICES][9];








// DS18x20 Temperature Sensor functions
#include <ds18b20.h>  
#include <bcd.h>
#include <1wire.h>
 #include <stdio.h>



#define digit1 PORTD.6      //катод первой цифры
#define digit2 PORTD.5      //катод второй цифры
#define digit3 PORTD.4      //катод третей цифры
                    
flash char digits[] = {      //создаём массив с цифрами
 0b00000011,                   //0
 0b10011111,                   //1
 0b00100101,                   //2
 0b00001101,                   //3
 0b10011001,                   //4
 0b01001001,                   //5
 0b01000001,                   //6
 0b00011111,                   //7
 0b00000001,                   //8
 0b00001001,                   //9
 0b11111101,                   //знак минуса
 0b11111111                    //пустота
 };                 
char digit_out[3], cur_dig,x;  //переменные для работы с LED

unsigned int indication;    //переменная для хранения чисел
  
unsigned char devices;           //переменная в которой количество присоеденённых датчиков
int temp;  
short int znach,i;

void recoding(void) {       //функция для перекодировки из hex в dec

if (indication<1000) {       //начинаем преобразование если число < 1000 так как 3-х 
//разрядный LED 
 digit_out[0]=indication%10;   //Делим на 10 остаток в масив 1-разряд
 indication=indication/10;                //Оставляем 2 разряда 
 digit_out[1]=indication%10;   //Делим на 10 остаток в масив 2-разряд 
 digit_out[2]=indication/10;     //Делим на 10 целое число в масив 3-разряд
 }                                           //*******
 }                                          //*******

//таймер 0
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
 {
 PORTB=0xFF;       //чтобы предотвратить эффект “тени” на соседних индикаторах
switch (cur_dig){
case 0:{digit3=0; digit1=1; break;};  //подаём питание на разряд 3 

case 1:{digit1=0; digit2=1; break;};  //подаём питание на разряд 2
case 2:{digit2=0; digit3=1; break;};  //подаём питание на разряд 1
 }
 PORTB=digits[digit_out[cur_dig]];    //выводим с каждым срабатыванием таймера число с//мссива в порт В, но не для всех разрядов сразу

 cur_dig++;                                           //с каждым срабатыванием таймера, увеличиваем
//переменную cur_dig на 1
if(cur_dig==3) cur_dig=0;                  //если cur_dig = 3 обнуляем
 }

void main(void)
 {

  #asm("cli");
    devices=w1_search(0xf0,rom_codes);  
    #asm("sei");







// Инициализация портов ввода/вывода
// Port B initialization
 PORTB=0xFF;
 DDRB=0xFF;

// Port C initialization
 PORTA=0x00;
 DDRA=0x00;

// Port D initialization
// Func6=Out Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In 
// State6=1 State5=1 State4=1 State3=P State2=P State1=P State0=P 
PORTD=0x7F;
DDRD=0x70;


// Настраиваем таймер 0// Clock source: System Clock// Clock value: 4000,000 kHz
 // Mode: Normal top=FFh
 // OC0A output: Disconnected
 // OC0B output: Disconnected

 TCCR0A=0x00;
 TCCR0B=0x02;
 TCNT0=0x00;
 OCR0A=0x00;
 OCR0B=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
 TIMSK=0x02;
// разрешаем прерывания
 #asm("sei")
while (1)
 {
indication=znach;  //
 recoding();           //вызываем функцию обработки
#asm("cli");
 znach=ds1820_temperature_10(&rom_codes[i][0])/10;
 #asm("sei"); 
                           
 }   
 }
Последний раз редактировалось Аlex Сб май 05, 2012 21:20:13, всего редактировалось 1 раз.
Причина: ---
Реклама
Аватара пользователя
Antifritz
Прорезались зубы
Сообщения: 222
Зарегистрирован: Чт июл 08, 2010 01:03:40
Откуда: Украина, Киев

Re: Регуляция вращения вентилятора в зависимости от температ

Сообщение Antifritz »

Опишите что именно не работает. Оно хотя бы компилируется?
Реклама
palladin2010
Открыл глаза
Сообщения: 54
Зарегистрирован: Чт мар 11, 2010 00:31:44

Re: Регуляция вращения вентилятора в зависимости от температ

Сообщение palladin2010 »

Компилируется

LED дисплей показывает 000 и слегка мерцает
Аватара пользователя
Antifritz
Прорезались зубы
Сообщения: 222
Зарегистрирован: Чт июл 08, 2010 01:03:40
Откуда: Украина, Киев

Re: Регуляция вращения вентилятора в зависимости от температ

Сообщение Antifritz »

Переменные indication и znach не только разного типа, но одна из них еще и беззнаковая - при присвоении могут возникнуть различные глюки.

Попробуйте заменить строку
znach=ds1820_temperature_10(&rom_codes[0])/10;
на что-то типа
znach=123;
индикатор что-то выводит?
Реклама
Эиком - электронные компоненты и радиодетали
palladin2010
Открыл глаза
Сообщения: 54
Зарегистрирован: Чт мар 11, 2010 00:31:44

Re: Регуляция вращения вентилятора в зависимости от температ

Сообщение palladin2010 »

123 выводит
Реклама
Аватара пользователя
Antifritz
Прорезались зубы
Сообщения: 222
Зарегистрирован: Чт июл 08, 2010 01:03:40
Откуда: Украина, Киев

Re: Регуляция вращения вентилятора в зависимости от температ

Сообщение Antifritz »

А DS1820 правильно подключили, схемку можно?
Реклама
palladin2010
Открыл глаза
Сообщения: 54
Зарегистрирован: Чт мар 11, 2010 00:31:44

Re: Регуляция вращения вентилятора в зависимости от температ

Сообщение palladin2010 »

способ подключения брал с этого сайта http://avrlab.com/node/129

только подключал к порту PD2 (только у меня соответственно 2313 вместо mega8, но это думаю не существенно :) )
Аватара пользователя
Antifritz
Прорезались зубы
Сообщения: 222
Зарегистрирован: Чт июл 08, 2010 01:03:40
Откуда: Украина, Киев

Re: Регуляция вращения вентилятора в зависимости от температ

Сообщение Antifritz »

К порту D больше ничего не подключено кроме термометра?
Если ничего, можно попробовать заменить строчки
PORTD=0x7F;
DDRD=0x70;
из раздела "Port D initialization" на такие:
PORTD=0x00;
DDRD=0xFF;
или так:
PORTD=0x00;
DDRD=0x00;

Еще напрягает вызов ds1820_temperature_10, я так понимаю он брался из примера, где вызов идет в цикле, а здесь "i" не меняется и по умолчанию в нее забито хз-что. Надо попробовать ds1820_temperature_10(0) - если термометр один. Или менять і, или вместо і написать 0.
palladin2010
Открыл глаза
Сообщения: 54
Зарегистрирован: Чт мар 11, 2010 00:31:44

Re: Регуляция вращения вентилятора в зависимости от температ

Сообщение palladin2010 »

порт D используется в старших разрядах, я подключаю LED согласно схеме http://avru.cwx.ru/uchebnik/7sigmentnik ... d_avr.html , он и использует.
Аватара пользователя
Antifritz
Прорезались зубы
Сообщения: 222
Зарегистрирован: Чт июл 08, 2010 01:03:40
Откуда: Украина, Киев

Re: Регуляция вращения вентилятора в зависимости от температ

Сообщение Antifritz »

Разбирайтесь с вызовом ds1820_temperature_10.
palladin2010
Открыл глаза
Сообщения: 54
Зарегистрирован: Чт мар 11, 2010 00:31:44

Re: Регуляция вращения вентилятора в зависимости от температ

Сообщение palladin2010 »

нашул интересную ссылку http://xexex.ru/index.php/raznye-stati/ ... cd-ds18b20

наверное тоже заменю LED на LCD(16*2) а 2313 на 8 мегу :)
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»