Sari la conținut
ELFORUM - Forumul electronistilor

timer digital ciclic cu pic


quinn

Postări Recomandate

Multumesc din suflet brandi12 pentru ajutor, singura problema este la incrementarea orelor, merge pana la ora 9, dupa care apar caractere special, in rest este ceea ce imi trebuie, multumesc inca o data. :aplauze

 

 

unsigned int TlSecounds,TlMinutes,TlHours;  unsigned int tmp = timeLeft;

 

unsigned int TlSecounds,TlMinutes,TlHours;  unsigned int tmp = setupTime;

 

Incrementeaza pana la 18 ore,  unsigned int range of 0 to 65,535, iar 18 x 3600 =64800.

Editat de jurevycius3
Link spre comentariu

Da este adevarat , numai "tmp" ul trebuie setat ca unsigned si cateva variable globale declarate la inceput. Timpul este retinut in secunde pentru simplicitate si la valori mai mari de 9 ore int-ul normal nu este suficient de mare pentru a retine valoarea. Cu unsigned merge pana la 18 ore daca se doreste mai mult trebuie modificat memorarea timpului probabil separat orele,minutele,secundele.

 

 

Codul modificat pentru 18 ore.

 

 

 

sbit LCD_RS at RA0_bit;sbit LCD_EN at RA1_bit;sbit LCD_D7 at RB7_bit;sbit LCD_D6 at RB6_bit;sbit LCD_D5 at RB5_bit;sbit LCD_D4 at RB4_bit;// Pin directionsbit LCD_RS_Direction at TRISA0_bit;sbit LCD_EN_Direction at TRISA1_bit;sbit LCD_D7_Direction at TRISB7_bit;sbit LCD_D6_Direction at TRISB6_bit;sbit LCD_D5_Direction at TRISB5_bit;sbit LCD_D4_Direction at TRISB4_bit;#define relay PORTB.F3volatile int msTime;//char relay=1;unsigned int onTime = 0; // in secundeunsigned int offTime = 0;unsigned int TimeLeft = 0;    // in secundechar *timeToLCD="00:00:00";unsigned int setupTime = 0;void Init_LCD() {   Lcd_Init();   Lcd_Cmd(_LCD_CURSOR_OFF);   Lcd_Cmd(_LCD_CLEAR);   Lcd_Out(1,6, "Hello!");   delay_ms(1000);   Lcd_Cmd(_LCD_CLEAR);}void InitTimer0(){OPTION_REG.T0CS = 0;OPTION_REG.T0SE = 0;OPTION_REG.PSA = 0;OPTION_REG.PS2 = 1;OPTION_REG.PS1 = 1;TMR0          = 61;INTCON        = 0xA0;}void Interrupt(){  if (TMR0IF_bit){    TMR0IF_bit  = 0;    TMR0 = 61;    msTime++;  }}void DisplayData() {  int TlSecounds,TlMinutes,TlHours;  unsigned int tmp = timeLeft;  TlHours = tmp/3600;  tmp%=3600;  TlMinutes = tmp/60;  TlSecounds = tmp%60;  Lcd_Out(1,1, "Relay is: ");  if(relay)   Lcd_Out(1,11, "ON ");  else   Lcd_Out(1,11, "OFF ");  Lcd_Out(2,1,"Time: ");  timeToLCD[7] = TlSecounds%10+48;  timeToLCD[6] = TlSecounds/10%10+48;  timeToLCD[4] = TlMinutes%10+48;  timeToLCD[3] = TlMinutes/10%10+48;  timeToLCD[1] = TlHours%10+48;  timeToLCD[0] = TlHours/10%10+48;    Lcd_Out(2,7,timeToLCD);}void DisplaySetupData() {  int TlSecounds,TlMinutes,TlHours;  unsigned int tmp = setupTime;  TlHours = tmp/3600;  tmp%=3600;  TlMinutes = tmp/60;  TlSecounds = tmp%60;    Lcd_Out(2,1,"Time: ");  timeToLCD[7] = TlSecounds%10+48;  timeToLCD[6] = TlSecounds/10%10+48;  timeToLCD[4] = TlMinutes%10+48;  timeToLCD[3] = TlMinutes/10%10+48;  timeToLCD[1] = TlHours%10+48;  timeToLCD[0] = TlHours/10%10+48;    Lcd_Out(2,7,timeToLCD);}void CheckTime() {  if(msTime >= 100 && timeLeft > 0)  {      TimeLeft--;      msTime=0;      if(TimeLeft == 0)             // ciclu repetitiv      {        if(relay)          TimeLeft = offTime;        else          TimeLeft = onTime;          relay=!relay;      }     DisplayData();  }}void SetTime() {    onTime = 0;    offTime = 0;    setupTime = 0;    Lcd_Cmd(_LCD_CLEAR);    Lcd_Out(1,4,"Set ON Time");    delay_ms(500);    while(Button(&PORTA,2,10,0) == 0) {        DisplaySetupData();        if(Button(&PORTB,0,10,0))        {          setupTime+=3600;          delay_ms(250);        }        if(Button(&PORTB,1,10,0))        {          setupTime+=60;          delay_ms(250);        }        if(Button(&PORTB,2,10,0))        {          setupTime+=1;          delay_ms(250);        }    }    onTime = setupTime;    Lcd_Cmd(_LCD_CLEAR);                Lcd_Cmd(_LCD_CLEAR);    Lcd_Out(1,4,"Set OFF Time");    setupTime = 0;    delay_ms(500);    while(Button(&PORTA,2,10,0) == 0) {        DisplaySetupData();        if(Button(&PORTB,0,10,0))        {          setupTime+=3600;          delay_ms(250);        }        if(Button(&PORTB,1,10,0))        {          setupTime+=60;          delay_ms(250);        }        if(Button(&PORTB,2,10,0))        {          setupTime+=1;          delay_ms(250);        }    }    offTime = setupTime;    Lcd_Cmd(_LCD_CLEAR);        Lcd_Out(1,2,"Time Setup Done!");    delay_ms(1000);    TimeLeft = onTime;    if(TimeLeft == 0)    {      relay = 0;    }    else    {    relay  = 1;    }    Lcd_Cmd(_LCD_CLEAR);}void main() {   CMCON  |= 7;   TRISB = 0x7;   TRISA.F2 = 1;   relay = 0;   OPTION_REG.F7 = 0;   Init_LCD();   InitTimer0(); //100ms   setTime();    while(1)    {      if(Button(&PORTA,5,10,0))         SetTime();      checkTime();      delay_ms(5);    }} 

 

 

Link spre comentariu
  • 9 luni mai târziu...
Vizitator MrAdyserv

Buna seara.Am realizat schema prezentat in topic.prima vers de firmware este ok.Dar oarecum nepotrivita pentru mine."Timp on" il pot regla,dar timp de off este prea mare.Am nevoie de timp off de 30 secunde, repetare la infinit. A doua vers de firmware intra intro bucla infinita: hello!/ser on time/set off time/time setup done.... ! Cred ca vers a doua este potrivita pentru mine dar nu funtioneaza corect. Daca ma poate ajuta cineva cu o vers de .hex , ori prima vers modificata,ori poate corecta vers a doua. Multumesc.

Link spre comentariu
  • 3 săptămâni mai târziu...
Vizitator mvictor

Buna ziua,

Dupa ce am cautat pe multe site-uri am descoperit ca aici exista varianta de care am nevoie. Cu toate acestea bucla infinita de care zice @MrAdyserv apare si la mine si nu pot seta nimic. Daca nu indraznesc prea mult credeti ca se poate corecta, pentru ca din pacate la programare nu ma pricep. Multumesc mult.

 

Later edit - de fapt pot seta on time si apoi off time, da Time setup done, schimba starea releului (on/off) si apoi pe display scrie Set on time din nou. de asememenea se pot seta si acelasi rezultat - nu apare meniul cu relay s on/relay is off.

Multumesc. 

Editat de mvictor
Link spre comentariu
Vizitator mvictor

Multumesc mult. Nu ma pricep deloc la programarea microcontrollerelor. Doar sa scriu codul HEX si eventual sa compilez un cod deja facut cu microasm. Multumesc inca o data.

Link spre comentariu

Am testat astazi din nou in simulator si totul merge cum ar trebuii. Am atasat hex-ul folosit in simulare, o schema si simularea in proteus. Daca si acest hex face figuri inseamna ca problema este undeva in montaj.

 

Daca se afiseaza din nou "Set on time" chiar cand cupleaza releul inseamna ca alimentarea PIC-ului nu este destul de bine filtrat si bobina releului ori reseteaza PIC-ul ori creaza impulsuri care sunt interpretate ca apasari false de buton. Asiguratiava ca dupa regulatorul de 5V  exista un condensator de 150-220uF, dupa care intre pinii de alimentare a pic-ului cat mai aproape posibil de soclu aveti un condensator ceramic de 100nF si ca pe bobina releului este montata dioda. 

Timer.rar

Link spre comentariu
Vizitator mvictor

Nu ma lasa sa editez postul precedent, asa ca postez din nou.

Am testst iarasi:

1. Montajul este pe breadboard

2. Nu am pus releu, ci pentru test folosesc un LED care se aprinde sau nu functie de comanda din pic

3. Am pus un condensator de decuplare (100n) chiar pe pinii alimentare PIC, condensator de filtrare suplimentar de 200uF

4. Sursa este o sursa de laborator stabilizata si filtrata

5. La punerea sub tensiune pe display apare "Hello" apoi "set ON time / time 00:00:00"

6. Setez secunde apas OK apare "set OFF time.....

7. Setez off time apas OK scrie "Time Setup Done"

8. ledul se aprinde si apare din nou set ON time cu acelasi ecran de la punctul 5.

Daca il las ramane asa asteptand set on time. Daca apas pe ok trece prin set off time, time setup done, stinge ledul - apoi o ia de la inceput. De fapt am descris acea bucla infinita prin care trece.

am pus cate o rezistenta de 10k pe pinii 6,7,8 la +5V, rezultatul acelasi

Pusesem initial doar ledul direct pe pinul 9 pic cu o rezistenta de 470 ohm, am modificat si am pus un tranzistor de comanda care are in colector LED-ul. Tot asa face.  :84 Nu stiu unde gresesc.

Pot atasa poze cu montajul/ filmulet , etc. Inca o data multumesc pentru ajutor.

Am uitat - am Quartz de 6 Mhz nu cred ca e o problema asta.

Editat de mvictor
Link spre comentariu

In soft este declarat un quartz de 4Mhz, seara cand ajung acasa recompilez pentru 6Mhz. Ce as mai incerca eu este ca in locul butonului menu/ok sa pun doar doua fire si cand trebuie apasat butonul respectiv doar sa ating foarte scurt cele doua fire. Astfel am elimina eventuale probleme a butonului cum ar fi revenire prea lenta pe care pic-ul l-ar interpreta ca o apasare indelungata a butonului si intra din nou in meniu. Nu stiu sigur cat timp asteapa intre doua verificari de buton, eu de obicei folosesc 250ms pe care personal il consider suficient pentru a da drumul butonului. 

Link spre comentariu
Vizitator mvictor

Am tot incercat si in final, comparand programul cu alte variante gasite tot aici pe forum am gasit o linie lipsa - DisplayData().In plus am verificat si butonul care trimite la time setup - era RA5. Am descoperit cum sa modific si am modificat pe RA3, am pus RA3 la plus prin 10k. Daca il pun pe RA2 nu mai functioneaza timerul - nu stiu de ce, dar nu mai conteaza.

Acum cu modificarile astea facute - soft si un buton suplimentar functioneaza perfect. Butonul de pe RA3 (pin 2)  va avea functia doar de setup timer, restul functiilor se mentin pe OK, Hour, Min, Sec.

BTW cu un quartz de 20M timpul este foarte corect. Cu cel de 6 MHz 5 secunde erau cam 8, acum 5 sunt 5.Atasez si modificarile alaturi de microC (da, mi-am downloadat microC si cred ca ma voi apuca sa-l invat  :reytre ).Multumesc Bandi12 pentru ajutor.

TimerWithHours5buttons.rar

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