Sari la conținut
ELFORUM - Forumul electronistilor

Termostat - PIC16F877


catalin004

Postări Recomandate

Salut, de obicei primul lucru pe care il fac cand incep un programel este setarea lui TMR0 (timer 0) la 1ms. Dupa care in functie de variabila millis se pot obtine orice fell de temporizari. Eu as declara o variabila "bit" pe care as tot schimba true / false cu ajutorul variabilei millis la fiecare x ms. La afisare verific daca e true, afisez temperatura daca e false nu-l afisez, si e gata "flash" ul

Editat de Bandi Szasz
Link spre comentariu

ok....timerul stiu sa il fac ....rog un mic exemplu legat de variabila...nu mura-n gura...doar asa ca sa fur ideea....va multumesc mult pentru ajutor si timpul acordat....o sa folosesc timer 1, intrucat Timer 0 mi-l face calculatorul cu 1,002sec

Editat de catalin004
Link spre comentariu

Da...asa este....eu il gandisem ca mai jos, si in functie de flash schimb starea display...cred

void Interrupt()
static unsigned cnt=0;
  if (TMR1IF_bit){
    TMR1IF_bit = 0;
    TMR1H	 = 0xEE;
    TMR1L	 = 0x6C;
    //daca trec 500ms
    if(cnt>=500){
    flash = 1;
    cnt = 0;
    }
    else{
    flash = 0;
    cnt++;

  }
}
Editat de catalin004
Link spre comentariu

Se poate si asa, doar ca nu este exact corect. Daca "cnt" este 500 faceti flash = 1 si cnt = 0, la urmatoarea intrerupere cnt nu mai e mai mare si flash se face 0. Ar merge ceva de genul acesta.

void Interrupt()
static unsigned cnt=0;
  if (TMR1IF_bit){
    TMR1IF_bit = 0;
    TMR1H	 = 0xEE;
    TMR1L	 = 0x6C;
    //daca trec 500ms
    if(cnt>=500){
    flash = !flash;
    cnt = 0;
    }
    cnt++;
}

In general ar trebuii ca interrupt-ul sa contina cat mai putina logica posibila, de acea in exemplul meu verificarea de timp se face in loop-ul principal.

Editat de Bandi Szasz
Link spre comentariu

Am observat si am modificat...sanatate multa si multumiri

 

Pentru stabilizarea display-ului ce se foloseste?Adica temperatura cititi cam "bataie"la schimbarea valorii.....adica de la 22,8 la 23,3 face schimburi rapide si mi se par cam aiurea...sa ii fac o mediere?mai incetineste afisarea?

Editat de catalin004
Link spre comentariu

Done!!!

Imi puteti explica, cand aveti timp ce inseamna:

if(Button(&PORTC, 6, 1, 0))...partea de iceput o inteleg....butonul este pe PORTC6, insa 1, 0 nu stiu ce face....1 este debounceul de 1ms si 0 este ca starea in care se citeste?adica aca este apasat?

Link spre comentariu

Da, 1 inseamna debounce de 1ms, iar 0 inseamna starea logica la care se face detectarea, 0 - butonul trage pin-ul la masa ( 5V -> 0V ) iar 1 este invers, butonul trage pinul la VDD ( 0V -> 5V)

Editat de Bandi Szasz
Link spre comentariu

Am facut o mediere de 10 citiri, insa nu stiu cum sa scap de prima....dar sa stiti ca tot bâțâie display-ul, adica doar rezultatul...partea cu butonul am inteles-o

void get_ADC(){ 
static int i;
tmp = ADC_Read(1);              //Read ADC voltage  
tmp = 0;
for(i = 0;i<10;i++){
                     tmp=tmp+ADC_Read(1);
                   }
tmp = tmp/10;
temp = ((long)tmp*4900)>>10;

Gata...am mai facut o variabila in timer la 250ms pentru afisare...sa intarzie afisarea pe prima linie...este ok....totusi nu stiu cum sa scap de prima citire

Editat de catalin004
Link spre comentariu

Daca ambele valori sunt de tip float atunci if ( (int)temp != (int)refTemp )

Din ce am inteles ca sa se faca aceasta egalitate, trebuie sa se faca un histerezis....la care voi lucra maine....

Link spre comentariu

Apelati pur si simplu ADC_Read() fara al asigna la tmp.

void get_ADC(){ 
static int i;
ADC_Read(1); 
tmp = 0;
for(i = 0;i<10;i++){
                     tmp=tmp+ADC_Read(1);
                   }
tmp = tmp/10;
temp = ((long)tmp*4900)>>10;

Daca aveti fluctuatie mare la citiri atunci probabil sunt si probleme la cablaj. Aveti condensator de 100nf intre VDD si VSS ? Filtru trece jos pe pinul de ADC ?

Editat de Bandi Szasz
Link spre comentariu

Nu am filtru trece jos...o sa ii fac unul, senzorul este lipit foarte aproape de uC.O sa incerc si cu adc read simplu....Fluctuatiile nu sunt mari, doar ca la schimbarea succesiva , probabil ca nu poate aproxima daca este 22,3 sau 22,8, si apare la sfarsit acolo cand 3 cand 8 rapid...apoi se stabilizeaza

Editat de catalin004
Link spre comentariu

Salut, de obicei primul lucru pe care il fac cand incep un programel este setarea lui TMR0 (timer 0) la 1ms. Dupa care in functie de variabila millis se pot obtine orice fell de temporizari. Eu as declara o variabila "bit" pe care as tot schimba true / false cu ajutorul variabilei millis la fiecare x ms. La afisare verific daca e true, afisez temperatura daca e false nu-l afisez, si e gata "flash" ul

Cam asa se face?merge ok flashul

#include "LCD_config.h"

float setTemp=25;                   //initial set ideal temperature work
char strSetTemp[] = "00.0";
unsigned int val,flash;

void tempToStr(float, char*);
//buffer function for show float settemperature(referinta)
void SetTempToStr(float SetTemp, char *buff) {
  val = SetTemp*10;                 //convert setTemp in mV
  buff[3] = val % 10+48;
  buff[1] = val/10 % 10+48;
  buff[0] = val/100 % 10+48;
}

void display_set_temp(){
LCD_Out(2,2, "SetTemp=");
SetTempToStr(SetTemp, &strSetTemp);
LCD_Out(2,10, strSetTemp);
LCD_Chr_Cp(223);                     //simbol character for degrees
LCD_Chr_Cp('C');                     //Celsius character to end of row
}

void second(){
LCD_Out(2,10,"      ");
LCD_Out(2,2, "SetTemp=");
}

//Timer1
//Prescaler 1:1; TMR1 Preload = 61036; Actual Interrupt Time : 1 ms

//Place/Copy this part in declaration section
void InitTimer1(){
  T1CON	 = 0x01;
  TMR1IF_bit	 = 0;
  TMR1H	 = 0xEE;
  TMR1L	 = 0x6C;
  TMR1IE_bit	 = 1;
  INTCON	 = 0xC0;
}

void Interrupt(){
static int cnt = 0;
  if (TMR1IF_bit){
    TMR1IF_bit = 0;
    TMR1H	 = 0xEE;
    TMR1L	 = 0x6C;
     if(cnt >= 500)
           {
           flash =! flash;
           cnt = 0;
           }
    else
    {
    cnt++;
  }
} }

void main() {
InitTimer1();
LCD_Init();
LCD_Cmd(_LCD_CURSOR_OFF);
LCD_Cmd(_LCD_CLEAR);
while(1)
        { 
        //delay_ms(2000);
        if (flash == 1){
                         second();
                        }
        else           {
                         display_set_temp();
                        }


        }
}
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