Bandi Szasz Postat Noiembrie 15, 2017 Partajează Postat Noiembrie 15, 2017 (editat) 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 Noiembrie 15, 2017 de Bandi Szasz Link spre comentariu
catalin004 Postat Noiembrie 15, 2017 Autor Partajează Postat Noiembrie 15, 2017 (editat) 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 Noiembrie 15, 2017 de catalin004 Link spre comentariu
Bandi Szasz Postat Noiembrie 15, 2017 Partajează Postat Noiembrie 15, 2017 Aveti exemplu in codul postat de mine pe pagina 2, postul nr. #29 Link spre comentariu
catalin004 Postat Noiembrie 15, 2017 Autor Partajează Postat Noiembrie 15, 2017 (editat) 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 Noiembrie 15, 2017 de catalin004 Link spre comentariu
Bandi Szasz Postat Noiembrie 15, 2017 Partajează Postat Noiembrie 15, 2017 (editat) 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 Noiembrie 15, 2017 de Bandi Szasz Link spre comentariu
catalin004 Postat Noiembrie 15, 2017 Autor Partajează Postat Noiembrie 15, 2017 (editat) 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 Noiembrie 15, 2017 de catalin004 Link spre comentariu
Bandi Szasz Postat Noiembrie 15, 2017 Partajează Postat Noiembrie 15, 2017 Eu de obicei fac mediere de 10-15 citiri, si ignor prima citire care in multe cazuri e putin deplasat. Link spre comentariu
catalin004 Postat Noiembrie 15, 2017 Autor Partajează Postat Noiembrie 15, 2017 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
Bandi Szasz Postat Noiembrie 15, 2017 Partajează Postat Noiembrie 15, 2017 (editat) 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 Noiembrie 15, 2017 de Bandi Szasz 1 Link spre comentariu
catalin004 Postat Noiembrie 15, 2017 Autor Partajează Postat Noiembrie 15, 2017 (editat) 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 Noiembrie 15, 2017 de catalin004 Link spre comentariu
catalin004 Postat Noiembrie 15, 2017 Autor Partajează Postat Noiembrie 15, 2017 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
Bandi Szasz Postat Noiembrie 15, 2017 Partajează Postat Noiembrie 15, 2017 (editat) 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 Noiembrie 15, 2017 de Bandi Szasz Link spre comentariu
catalin004 Postat Noiembrie 15, 2017 Autor Partajează Postat Noiembrie 15, 2017 (editat) 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 Noiembrie 15, 2017 de catalin004 Link spre comentariu
catalin004 Postat Noiembrie 16, 2017 Autor Partajează Postat Noiembrie 16, 2017 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
Bandi Szasz Postat Noiembrie 16, 2017 Partajează Postat Noiembrie 16, 2017 Da, cam asa se face. Totusi poate ar fi mai intuitiv un LED care poate fi si bicolor. Link spre comentariu
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum