Sari la conținut
ELFORUM - Forumul electronistilor

probleme programare pic


Myhayxx

Postări Recomandate

buna seara!de curand mi-am cumparat o banda cu leduri RGB care se alimenteaza la 12V si m-am gandit sa o comand cu un microcontroler. de inceput am scris un program in mikroC in care ledurile se aprind pe rand fiecare culoare. am desenat o schema in ISIS (program de simulare) si functioneaza.microcontroler am folosit PIC16F877A dar dupa ce am facut montajul fizic,surpriza nu se intampla nimic...cablaje am facut multe si nu cred ca este o problema de proiectare,picuri am mai scris si l-am verificat dupa scriere si era ok..cu programarea stau cam prost si ma gandesc ca aici ar fi problema si poate in simulator merge si in realitate e cu totul altceva..pun programul sa va uitati daca am scris codul corect sau mai trebuie modificat ceva pe acolo..void main() { PORTB = 0x00; TRISB = 0x00; PORTC = 0x00; TRISC = 0x00; PORTD = 0x00; TRISD = 0x00; while (1) { PORTB = (0x01); DELAY_mS(500); PORTB = (0x00); PORTC = (0x04); DELAY_mS(500); PORTC = (0x00); PORTD = (0x10); DELAY_mS(500); PORTD = (0x00);}}

post-27344-139829791497_thumb.jpg

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

Top autori în acest subiect

  • Myhayxx

    9

  • Mircea

    7

  • Liviu M

    6

  • costi002

    1

Top autori în acest subiect

Imagini postate

asta era problema ,quartul acum functioneaza..as mai avea o rugaminte la cei care au timp sa ma ajute: am o banda de leduri albe cu lumina calda pe care vreau sa le folosesc la acvariu pentru iluminare si as vrea sa fac un program care sa-mi aprinda ledurile la ora 6:30 la o intensitate mica si sa creasca intensitatea treptat pana ajunge la maxim in decurs de o jumatate de ora astfel ca la ora 7:00 sa fie aprinse ledurile la maxim,apoi sa faca o pauza de 12,5 ore astfel ca la 19:30 sa inceapa sa scada intensitatea ledurilor treptat ca la ora 20:00 sa fie stinse ,apoi o pauza de 10,5 ore dupa care sa se reia ciclul. eu am incercat sa scriu un program ca cel mai de jos dar este prea stufos si ocupa multa memorie din microcontroler.ma gandesc ca s-ar putea si intr-o varianta mai simpla.orice idee este binevenitaiata programul la care m-am chinuit si mai am mult de lucru daca o tin tot asa :nebunrau: void main() { PORTB = 0x00; TRISB = 0x00; PORTC = 0x00; TRISC = 0x00; PORTD = 0x00; TRISD = 0x00; while (1) { PORTC = (0x04); DELAY_uS(1); PORTC = (0x00); DELAY_mS(1); PORTC = (0x04); DELAY_uS(10); PORTC = (0x00); DELAY_mS(1); PORTC = (0x04); DELAY_uS(20); PORTC = (0x00); DELAY_mS(1); PORTC = (0x04); DELAY_uS(30); PORTC = (0x00); DELAY_mS(1); PORTC = (0x04); DELAY_uS(40); PORTC = (0x00); DELAY_mS(1); PORTC = (0x04); DELAY_uS(50); PORTC = (0x00); DELAY_mS(1); PORTC = (0x04); DELAY_uS(60); PORTC = (0x00); DELAY_mS(1); PORTC = (0x04); DELAY_uS(70); PORTC = (0x00); DELAY_mS(1); PORTC = (0x04); DELAY_uS(80); PORTC = (0x00); DELAY_mS(1); PORTC = (0x04); DELAY_uS(90); PORTC = (0x00); DELAY_mS(1); PORTC = (0x04); DELAY_uS(100); PORTC = (0x00); DELAY_mS(1); PORTC = (0x04); DELAY_uS(110); PORTC = (0x00); DELAY_mS(1); etc. etc.

Link spre comentariu

Ca sa lucreze dupa ceas ai nevoie sa lucrezi cu un RTC. Partea de PWM pentru varierea intensitatii luminoase o faci prin modificarea factorului de umplere. Ambele operatii au biblioteci in MikroC (atat lucrul cu RTC - vezi ce protocol, cat si PWM-ul). Ceea ce vrei tu sa faci nu se face numai cu Delay_xs().

Link spre comentariu

Subscriu la ce s-a scris mai sus. Rtc -urile din seria DS au doua alarme care pot fi folosite la ce vrei tu. Mai greu va fi sa implementezi PWM pentru perioada dorita dar nu-i imposibil daca folosesti diferenta dintre min de la timp si min de la alarma.Oricum va trebui sa folosesti si un afisor pt setarea T, TOn si TOff.

Link spre comentariu

Am citit cate ceva despre PWM, am vazut exemplul din librarie si in mare parte am inteles cum lucreaza, dar n-am inteles ce trebuie sa fac cu RTC-ul. Este ceva ce trebuie implementat in program sau este un integrat ce trebuie montat extern? Puteti da mai multe detalii in ceea ce priveste RTC.N-as vrea sa folosesc si afisor, ma gandeam la ceva cat mai simplu.nu se poate sa folosesc butonul de reset chiar in momentul in care doresc sa inceapa programul dupa care sa repete ciclul atata timp cat este alimentat montajul ?

Link spre comentariu

RTC sau Real Time Clock este un integrat separat de obicei cu 8 pini. De fapt este un integrat care tine minte ceasul ( data , luna , an , ora , minut , secunda , etc ) foarte precis , folosit corect o sa fie cel mai punctual ceas din casa.

 

Are comunicatie I2C prin care PIC ul poate seta data , apoi il poate citi de cate ori trebuie. De ce trebuie acest RTC ? Pai este simplu PIC-ul o sa aiba intarzieri sau avansuri cand vine vorba de timp , deci prin urmare nu o sa reusesti sa reglezi acele delay-uri de 10 ore, azi poate o sa tina delay de 9 ore maine de 11 ore , etc ... nu este precis. In timp ce RTC - ul se lauda cu o pierdere de 1s / an sau chiar mai mici.

 

http://www.tme.eu/ro/details/ds1307+/ci ... m-dallas/#

Link spre comentariu

...Puteti da mai multe detalii in ceea ce priveste RTC.

Vezi exemplul de aici: http://www.libstock.com/projects/view/907/rtc-clock-with-ds1307-16f877a-on-6x-7seg-display. Nu ai nevoie de afisaj decat sa faci setarile de la butoane. Deci va fi un afisaj temporar. Pui un header de max 10 pini si inserezi LCD numai cand vrei sa re-programezi. Exemple multiple de RTC pe Libstock: http://www.libstock.com/project_categories/view/9/timers-real-time-clock.
Link spre comentariu

multumesc mult pentru ajutorul acordat. in ceea ce priveste partea de hard am inteleso si acum stiu cum se monteaza RTC-ul insa cu programarea nu stiu daca o sa reusesc :cry: .am descarcat programul scris in mikroC pentru ceas insa habar n-am cum sa combin acest program cu partea de PWM. Mi-a venit o idee care cred eu ca ar fi mai simplu de realizat.Eu acum la acvariu am montat un timer care imi porneste/opreste ledurile la ora setata de mine si ma gandeam ca m-as putea folosi de acel contact al timerului pentru o intrare pe un pin al microcontrolerului si in momentul cand vede "1" pe portul de intrari sa inceapa crestera intensitatii luminii astfel ca intr-o jumatate de ora sa ajunga la maxim (plus/minus cateva minute nu conteaza) iar seara cand contactul se deschide sa inceapa scaderea intensitatii luminii pana cand se opreste.astfel zic eu am scapat de butoane in plus pe montaj si nu mai am nevoie nici de display.Stiu ca timpul este pretios pentru toti si nimeni nu iti da mura in gura ceva dar daca cineva are timp sa ma ajute cu programul scris i-as fi recunoscator. daca vreti sa ma ajutati contracost putem discuta pe MP

Link spre comentariu

Cate un pas si ajungi unde vrei :da .

 

Nu lucrez in C si d-aia nu pot sa-ti dau mai multe detalii. Din acel exemplu vei invata cum comunici in protocol I2C cu acel RTC.

 

Asa vei face sa se aprinda-stinga ledurile. Apoi, odata stapanit ceasul, treci la PWM. PWM-ul il implementezi ca la fiecare minut sa schimbi factorul de umplere. Practic ai sa ai 30 de pasi. Evident, poti sa faci si mai des, ca ai 255 de valori in factorul de umplere.

 

Poti sa faci si cu acel timer si PIC-ul face numai PWM-ul. Exemplul de PWM din help este exact ce ai nevoie, numai ca pui o bucla in x pasi si la fiecare executie incrementezi-decrementezi factorul de umplere:

 

i = 0stare = 0 ; stare anterioara intrare if intrare=1 then   factor_umplere = 0   stare = 1else   if (stare = 1) and (intrare = 0) then   factor_umplere = 255   stare = 0end ifif stare = 0 then   for i = 1 to 255  ; la sfarsitul a 30 minute ai factor umplere de 100%        factor_umplere = factor_umplere + 1        PWM_Set_Duty(factor_umplere)        delay_ms(118)   next i  else   for i = 1 to 255  ; la sfarsitul a 30 minute ai factor umplere de 0%        factor_umplere = factor_umplere - 1        PWM_Set_Duty(factor_umplere)        delay_ms(118)   next i   

Asta trebuie tradusa din Basic in C. Sper sa te ajute. Nu scriu de pe calculatorul unde am compilatorul de Basic deci nu stiu cat de buna este sintaxa si cum ar compila.

 

Ai grija cum setezi toti registrii pertinenti, ca sa nu ai suprize. Ma refer la analogic, comparator, etc. PWM este setat cand folosesti PWM_Init(), deci nu ai de facut nimic aici.

 

Citeste aici: http://www.mikroe.com/download/eng/documents/compilers/mikroc/pro/pic/help/button_library.htm si aici http://www.mikroe.com/download/eng/documents/compilers/mikroc/pro/pic/help/pwm_library.htm

Link spre comentariu

Cate un pas si ajungi unde vrei :da .Evident, poti sa faci si mai des, ca ai 255 de valori in factorul de umplere.

Rezolutia maxima a PWM (duty cycle) e 10 biti, asa ca sunt maxim 1023 de valori. :da Perioada e pe 8 biti.
Link spre comentariu

Cate un pas si ajungi unde vrei :da .Evident, poti sa faci si mai des, ca ai 255 de valori in factorul de umplere.

Rezolutia maxima a PWM (duty cycle) e 10 biti, asa ca sunt maxim 1023 de valori. :da Perioada e pe 8 biti.
MikroC o face pe 8 biti. Uite aici: http://www.mikroe.com/download/eng/documents/compilers/mikroc/pro/pic/help/pwm_library.htmCeea ce nu invalideaza, insa, ce spuneai tu. Dar se pare ca MikroC ne da voie numai cu 255 de valori.
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