Sari la conținut
ELFORUM - Forumul electronistilor

termometru interior exterior + temporizator


Mix

Postări Recomandate

Salut. M-am apucat sa programez un pic16f628a. el va afisa temperatura exteriora, cea interioara si va avea un temporizator pentru becul de afara.

Inca nu am facut functiile pentru senzorii de temperatura "one wire". Folosesc intreruperi iar functiile lor nu functioneaza in cazul asta.

Problema este ca MCU-ul ramane la prima instructiune si nu mai face nimic. Imi vine sa inebunesc. Orice setare ii fac nu merge. Am incercat toate configurile posibile si cu cuartz si cu oscilator intern. Sa zicem ca una din configuratie pe care am folosit-o este 0x2114. Daca ii bag un soft mic doar sa aprind un led merge. Deci nu e de vina partea hardware. In simularile facute pe ISIS 7 pare sa mearga dar pana la "while".

Cam asta e codul:

#define button1 PORTA.RA1#define button2 PORTA.RA0unsigned short light = 0;unsigned short _light = 0;unsigned short time = 1;unsigned short time_delay = 0;unsigned short setup = 0;unsigned short setup_delay = 0;unsigned short setup_repeat = 0;unsigned short temp[2];unsigned short _temp = 0;unsigned short temp_conv = 1;unsigned short temp_delay = 0;unsigned short allow = 1;unsigned short digit_value[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66,                                  0x6D, 0x7D, 0x07, 0x7F, 0x6F};void readTemp(){  temp[0] = 10;  temp[1] = 23;  }unsigned short digit(unsigned short value){  return (_light || light) ? digit_value[value]+0x80 : digit_value[value];}void display(){  if (setup)  {    Delay_ms(1);    PORTA.RA2 = 0;    PORTA.RA3 = 1;    PORTB = digit(time / 10);    Delay_ms(2);    PORTA.RA3 = 0;    PORTA.RA2 = 1;    PORTB = digit(time % 10);  }  else    if (_temp)    {      Delay_ms(1);      PORTA.RA2 = 0;      PORTA.RA3 = 1;      PORTB = digit(temp[1] / 10);      Delay_ms(2);      PORTA.RA3 = 0;      PORTA.RA2 = 1;      PORTB = digit(temp[1] % 10);    }    else      {        Delay_ms(1);        PORTA.RA2 = 0;        PORTA.RA3 = 1;        PORTB = digit(temp[0] / 10);        Delay_ms(2);        PORTA.RA3 = 0;        PORTA.RA2 = 1;        PORTB = digit(temp[0] % 10);      }}void interrupt(){  if (temp_conv)  {    temp_delay++;    if (temp_delay == 254)    {      readTemp();      temp_delay = 0;      setup = 0;      time_delay++;      if (time_delay == time * 7 && !_light)      {        time_delay = 0;        light = 0;      }    }  }  else    {      setup_delay++;      if (setup_delay == 10)      {      if (button1 || button2)      {        allow = 1;        setup_repeat = 0;        temp_conv = 1;      }      else        setup_repeat++;      setup_delay = 0;      if (!button1 && setup_repeat == 15)      {       setup = 1;       setup_repeat = 0;      }      if (!button2 && setup_repeat == 15)      {        _light = 1;        setup_repeat = 0;      }      }    }  INTCON.T0IF = 0;}void main(){  CMCON = 0x07;  TRISA = 0x13;                                // RA0, RA1, RA4 - input; RA2, RA3 - output  TRISB = 0x00;  PORTB = 0x40;  OPTION_REG = 0x06;                           // TMR0 prescaler 1:128, internal clock (clock/4)  time = EEPROM_Read(0x00);  readTemp();  INTCON.GIE = 0;  TMR0 = 7;  Delay_ms(2000);  INTCON.T0IE = 0;  while (1)  {    if (!button1 && allow)    {      temp_conv = 0;      TMR0 = 7;      allow = 0;      if (setup)      {        time--;        if (time<1)          time = 1;        EEPROM_Write(0x00, time);      }      else      {        _temp = ~_temp;      }    }    if (!button2 && allow)    {      temp_conv = 0;      allow = 0;      TMR0 = 234;      if (setup)      {        time++;        if (time>30)          time = 30;        EEPROM_Write(0x00, time);      }      else      {        if (_light)          {            _light = 0;            light = 0;          }        if (!_light && !light)          {            light = 1;            time_delay = 0;          }      }    }    display();  }}

Mai jos este si schema.

Link spre comentariu
  • Răspunsuri 3
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Mix

    2

Zile populare

Top autori în acest subiect

  • Mix

    Mix 2 postări

Vizitator thenoble66

Codul e un pic neobisnuit, dar aparent e bun.Vezi bitii de configuratie: 0x2114 contine WDT ON.Daca vrei WDT OFF, atunci pune 0x2110.ISIS-ul are lacune serioase la afisaje cu matrice/segmente.Cu codul Tau, doar cu portiunea de afisare, cu delay de 40ms, incep sa apara cifrele. La timpi mai mici le incurca rau.Mai bine teste pe viu.thenoble66

Link spre comentariu

am incarcat softul in mcu si cand alimentez afiseaza "--" (PORTB = 0x40;). m-am exprimat in repezeala. nu prima instructiune, ci mai exact a 4-a din main, apoi vine setarea prescalerului si de aici cred k nu mai face nimic. fara WDT se pare sa mearga, incercasem si asa. nu am mai avut timp zilele astea, dar ma voi uita diseara sa vad ce mai depistez.

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări