Терморегулятор на PIC16F628А, mikroC PRO

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Аватара пользователя
Roma4ka
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пт фев 05, 2010 20:47:51

Терморегулятор на PIC16F628А, mikroC PRO

Сообщение Roma4ka »

помогите с проблемой, мерцанием показаний
Вложения
TEST.rar
проект
(26.71 КБ) 484 скачивания
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Терморегулятор на микроконтроллере PIC16F84 датчикe DS18

Сообщение Аlex »

Вы, видмо, где-то в основном цикле на долго запрещаете прерывания.
Реклама
Аватара пользователя
Roma4ka
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пт фев 05, 2010 20:47:51

Re: Терморегулятор на микроконтроллере PIC16F84 датчикe DS18

Сообщение Roma4ka »

Аlex писал(а):Вы, видмо, где-то в основном цикле на долго запрещаете прерывания.
запрет прерывания только при посылке команд на датчик, без этого не как (
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Терморегулятор на микроконтроллере PIC16F84 датчикe DS18

Сообщение Аlex »

Roma4ka писал(а):без этого не как (
Прерывания нужно запрещать только на основную часть тайм-слота, которая критична к увеличению задержек. Фтопку встроенные ф-ии, только свои.
Сделайте хотя-бы через каждую команду, а не через несколько.
Кстати, у Вас частота на каждый индикатор = ~28Гц, это очень мало.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Терморегулятор на микроконтроллере PIC16F84 датчикe DS18

Сообщение urry »

можно. например, при индикации какое -то время вы уверены, что 10 мс у вас есть или сколько там.
Ставьте флаг - разрешение - запрет работы в прерывании ,а в основном цикле анализируйте, сначала ожидайте запрета, он пройдет - и у вас есть время для работы.
Реклама
Аватара пользователя
Roma4ka
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пт фев 05, 2010 20:47:51

Re: Терморегулятор на микроконтроллере PIC16F84 датчикe DS18

Сообщение Roma4ka »

помогите, почему 16F628A внутреннего генератора на 4MHz при работе с датчикам DS18B20 показывает 0,00

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

/*
'*******************************************************************************
' Description:
     The temperature most be displayed on the digits (7 segments) in this method (00,0C)
' Test configuration:
'    MCU:                        PIC16F628A
' Configuration Word
'    Oscillator:                 INTOSC: I/O on
'    Watchdog Timer:             OFF
'    Power up Timer:             Disabled
'    Master Clear Enable:        Enabled
'    Browun Out Detect:          Enabled
'    Low Voltage Program:        Disabled
'    Data EE Read Protect:       Disabled
'    Code Protect:               OFF
'*******************************************************************************
*/

#define DS18B20 &PORTA,4

#define Relay_On()  RA7_bit=1;
#define Relay_Off() RA7_bit=0;



unsigned short mask(unsigned short num){
switch (num) {
case 0 : return 0x50;
case 1 : return 0xD7;
case 2 : return 0x62;
case 3 : return 0x46;
case 4 : return 0xC5;
case 5 : return 0x4C;
case 6 : return 0x48;
case 7 : return 0xD6;
case 8 : return 0x40;
case 9 : return 0x44;
}
}
/*******Endless mask***********/
unsigned short shifter,portb_index;
unsigned short portb_array[4]={0x79,0x50,0xC0,0x43};
char ROMCODE [8]={0x28, 0x30, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x8E} ;
unsigned value;
bit state;
bit oldstate;int m=0,key=0;

void interrupt()
{
RA0_bit=0;RA1_bit=0;RA2_bit=0;RA3_bit=0;
PORTB = portb_array[portb_index];
switch (portb_index) {
  case 0:{RA0_bit=0;RA1_bit=0;RA2_bit=0;RA3_bit=1;}break;
  case 1:{RA0_bit=0;RA1_bit=0;RA2_bit=1;RA3_bit=0;}break;
  case 2:{RA0_bit=0;RA1_bit=1;RA2_bit=0;RA3_bit=0;}break;
  case 3:{RA0_bit=1;RA1_bit=0;RA2_bit=0;RA3_bit=0;}break;
}
portb_index ++ ;
if (portb_index > 3)
portb_index = 0;                     //turn on 1st, turn off 2nd 7 seg.;
TMR0 = 0;                            //reset TIMER0 value;
INTCON = 0x20; 
}

extern unsigned sensor(){
unsigned tem,temp1,temp2;
int i;
    INTCON.GIE = 0;             //Disable interrupt;
    Ow_Reset (DS18B20);        //one wire reset signal;
    Ow_Write (DS18B20, 0xCC);  //Issue command to DS18B20;
    Ow_Write (DS18B20, 0X44);  //Issue command to DS18B20;
    INTCON.GIE = 1;             //Enable interrupt;
    Delay_ms(500);              //Wait for conversion complete;
    INTCON.GIE = 0;
    Ow_Reset(DS18B20);
    Ow_Write(DS18B20, 0x55);
    for(i=0; i<=7; i++)Ow_Write(DS18B20,ROMCODE[i]);
    Ow_Write(DS18B20, 0xBE);
    temp1 =  Ow_Read(DS18B20);
    temp2 =  Ow_Read(DS18B20);
    INTCON.GIE = 1;
    tem = (temp2 << 8) + temp1;
    return tem;


}

 extern on_off(unsigned te)
 {
 unsigned  int tem,raz;
    tem=EEPROM_Read(0x01) << 4;
    raz=EEPROM_Read(0x02) << 4;
    Delay_ms(20);
    if (te!=0x0550){
        switch(state){
           case 0:{if(te<tem){Relay_On();}else {Relay_Off();state=1;}};break;
           case 1:{if(te<tem-raz){Relay_On();state=0;} else Relay_Off();};break;
           default:{state=1;};break;
        }
     }
return;
}



  void Display_Temperature(unsigned int temp2write) {
 char temp_whole;
 unsigned int temp_fraction;
  temp_whole = temp2write >> 4 ;
  temp_fraction  = temp2write ;
  temp_fraction &= 0x000F;
  temp_fraction *= 625;
  portb_array[0] = mask((temp_whole/10)%10);
  portb_array[1] = mask(temp_whole%10)&0xBF;
  portb_array[2] = mask(temp_fraction/1000);
  portb_array[3] = 0x78;

}
void temperatur(){  //температура нагрева
int p;
 p=Eeprom_Read(1);
 Delay_ms(20);
if (key>3){
   if (p==75){p=30;}else {p=p+5;}
    Eeprom_Write(1,p);
    Delay_ms(20);
   }
    portb_array[0]=mask((p/10)%10);
    portb_array[1]=mask(p%10)&0xBF;
    portb_array[2]=0xE4;
    portb_array[3]=0x78;


}
void razn(){ //разница
int p;
p=Eeprom_Read(2);
Delay_ms(20);
if (key>3){
   if (p>=20){p=0;}else {p++;}
   Eeprom_Write(2,p);
   Delay_ms(20);
   }
    portb_array[0]=0xE0;
    portb_array[1]=0xEF;
    portb_array[2]=mask((p/10)%10);
    portb_array[3]=mask(p%10);



}

 /*************подпрограмма обработки нажатия кнопок**************************/
void Control_Button(){


     if (Button(&PORTA, 6, 1, 0)) {               // Detect logical one
      oldstate = 1;
      if (key==0) {m++; if (m>2)m=0;}
      key++;
      }

    if (oldstate && Button(&PORTA, 6, 1, 1)) {   // Detect one-to-zero transition
      oldstate = 0;
      key=0;
    }

     switch (m) {
            case 0: Display_Temperature(value);break;
            case 1: {temperatur();} break;
            case 2: {razn();      } break;
            default: Display_Temperature(value);
     }
     

   



}

void InitMain() {
CMCON = 7;                          // Set AN pins to Digital I/O;
OPTION_REG = 0x80;                   // Set timer TMR0;
portb_index = 0;
shifter = 1;
TMR0 = 0;
INTCON = 0xA0;                       // Disable interrupt PEIE,INTE,RBIE,T0IE
PORTA = 0x00;
TRISA = 0x50;
TRISB = 0x00;                           // All port D pins are configured as outputs
PORTB = 0x00;                           // Turn off all display segments
PCON.OSCF = 1;   // Set internal oscillator frequency to 4 MHz
sensor();
Delay_ms(500);



}


void main()
{
InitMain();

do {
           value=sensor();

           Control_Button(); //обработка клавиш
          /* if ((value==0x0000)||(value>=0x0550)){
           Relay_Off();  
           portb_array[0]=0x68;
           portb_array[1]=0xFF;
           portb_array[2]=0x50;
           portb_array[3]=0xE8;
}else    */
           on_off(value);
           Delay_ms(250);

    }while(1);
}
Вложения
PIC16F628_2.rar
628а
(20.94 КБ) 271 скачивание
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Терморегулятор на микроконтроллере PIC16F84 датчикe DS18

Сообщение Аlex »

Можете выложить всю папку проекта вместе с исходниками и .cof файлом ?
Аватара пользователя
Roma4ka
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пт фев 05, 2010 20:47:51

Re: Терморегулятор на микроконтроллере PIC16F84 датчикe DS18

Сообщение Roma4ka »

Аlex писал(а):Можете выложить всю папку проекта вместе с исходниками и .cof файлом ?
к сожалению в проєкте нет такого файла, в архиве все что есть
Вложения
PIC16F628.rar
прожект
(153.71 КБ) 337 скачиваний
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Терморегулятор на микроконтроллере PIC16F84 датчикe DS18

Сообщение Аlex »

Я так понял у Вас компилятор MicroC ? Скомпилил Ваш проект, попробовал запустить в протеусе, всё показывает.
У Вас где 00 показывает ? На железе или в протеусе ?
Аватара пользователя
Roma4ka
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пт фев 05, 2010 20:47:51

Re: Терморегулятор на микроконтроллере PIC16F84 датчикe DS18

Сообщение Roma4ka »

Аlex писал(а):Я так понял у Вас компилятор MicroC ?
да я использую mikroC PRO for PIC :))
Аlex писал(а):У Вас где 00 показывает ? На железе или в протеусе ?
если в протеусе свойствах PIC16F628a убрать 4MHz то показания будут 55,9С ... это ошибка
в железе показывает 00,0С

датчик испытаны в другом проекте.... работает на все 100%
Вложения
628_2.lay
Layout
(69.41 КБ) 355 скачиваний
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Терморегулятор на PIC16F84 mikroC PRO

Сообщение Аlex »

Значит, скорее всего, придётся писать свои ф-ии для работы с датчиком.
Аватара пользователя
Roma4ka
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пт фев 05, 2010 20:47:51

Re: Терморегулятор на PIC16F628А, mikroC PRO

Сообщение Roma4ka »

так это связано с тем что внутренней генератор 628 не работает на 4MHz

скорость посылки и прием команд DS18B20 и 628 разная
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Терморегулятор на PIC16F628А, mikroC PRO

Сообщение Аlex »

Скорее всего. Т.е. не выдержаны таймауты в тайм-слотах.
И ещё, у Вас задержка между командой преобразования и командой чтения = 500 Мс, а нужно минимум 750.
borys
Держит паяльник хвостом
Сообщения: 927
Зарегистрирован: Вт сен 07, 2010 19:27:48
Откуда: Ташкент

Re: Терморегулятор на PIC16F628А, mikroC PRO

Сообщение borys »

Roma4ka слегка ошибается - внутренний генератор в этом МК успешно работает на 4 МГц.
Аватара пользователя
Roma4ka
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пт фев 05, 2010 20:47:51

Re: Терморегулятор на PIC16F628А, mikroC PRO

Сообщение Roma4ka »

borys писал(а):Roma4ka слегка ошибается - внутренний генератор в этом МК успешно работает на 4 МГц.
в чем же тогда у меня ошибка при обмене данных с DS18B20
:dont_know:
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Терморегулятор на PIC16F628А, mikroC PRO

Сообщение Аlex »

Roma4ka, изучите 1-wire и реализуйте протокол сами, без всяких готовых библиотек. Только тогда уже можно будет понять в чём у Вас проблема. Хрен знает, что там делает эта библиотека... :roll:
Закрыто

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