Bandi Szasz Postat Octombrie 7, 2015 Partajează Postat Octombrie 7, 2015 Varianta cu posibilitatea de setare a Orelor si intervalul On/Off separata. @jurevcius3 nu l-am testat in sensul de al lasa sa mearga o ora si ceva simularea dar ar trebuii sa mearga. TimerWithLCD.rar Link spre comentariu
jurevycius3 Postat Octombrie 7, 2015 Partajează Postat Octombrie 7, 2015 (editat) 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. 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 Octombrie 7, 2015 de jurevycius3 Link spre comentariu
Bandi Szasz Postat Octombrie 7, 2015 Partajează Postat Octombrie 7, 2015 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
Vizitator MrAdyserv Postat Iulie 17, 2016 Partajează Postat Iulie 17, 2016 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
Vizitator MrAdyserv Postat Iulie 17, 2016 Partajează Postat Iulie 17, 2016 am reusit sa adaptez prima vers de soft pentru ce aveam nevoie. o seara buna Link spre comentariu
Vizitator mvictor Postat August 7, 2016 Partajează Postat August 7, 2016 (editat) 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 August 7, 2016 de mvictor Link spre comentariu
Bandi Szasz Postat August 11, 2016 Partajează Postat August 11, 2016 Nu mai retin exact dar in simulare parca mergeau ambele versiuni, o sa mai verific inca o data in weekend. Daca in simulare merge bine atunci inseamna ca problema e la buton / alimentare si in soft se detecteaza apasari false. Link spre comentariu
Vizitator mvictor Postat August 11, 2016 Partajează Postat August 11, 2016 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
Bandi Szasz Postat August 14, 2016 Partajează Postat August 14, 2016 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 Postat August 15, 2016 Partajează Postat August 15, 2016 Multumesc mult. Voi testa in cursul zilei de azi si voi reveni cu rezultatul. Inca o data multumesc. Link spre comentariu
Vizitator mvictor Postat August 15, 2016 Partajează Postat August 15, 2016 (editat) 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. 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 August 15, 2016 de mvictor Link spre comentariu
Bandi Szasz Postat August 16, 2016 Partajează Postat August 16, 2016 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 Postat August 16, 2016 Partajează Postat August 16, 2016 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 ).Multumesc Bandi12 pentru ajutor. TimerWithHours5buttons.rar 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