Vizitator marian_ariciuc Postat Ianuarie 20, 2014 Partajează Postat Ianuarie 20, 2014 help me la un proiect de ''releu de timp'' ideea e ca atunci cand am pus la masa un pin al pic-ului(RA5), trebuie sa-mi comande un releu pe pinul RC2. RA5 este pus la masa printr-un tranzistor NPN - BC817. adica functionarea e simpla: se pune la masa pinul RA5(cat timp RA5=0, nu executa nimic-nop), dupa ''eliberarea'' RA5 sa-mi apara un + pe RC2 timp de 40secunde. schema este urmatoarea: codul este urmator: program temp_andreimain: ANSEL = 0 ' Configure AN pins as digital I/O TRISA5_bit = 1 ' set RA0 pin as input TRISC2_bit = 0 ' set RA1 pin as outputwhile TRUE if (RA5_bit = 0) then ' la tranzitia 1-0 a pinului RA5, RC2_bit = 1 while (RA5_bit = 0) ' cat timp pinul RA5 este 0, nop ' nu executa nimic wend ' pana la reaparitia 1 logic pe pinul RA5 goto bucla end ifwendbucla: delay_ms(40000) RC2_bit = 0 goto mainend. ' endless loopeste realizat Hardware, munceste din punct de vedere hardware: comanda RA5 (prin tranzistor), munceste ok, RC2 activeaza releul respectiv insa problema e ca ramane anclansat la infinit.... unde gresesc? Link spre comentariu
Rabulea Sergiu Postat Ianuarie 20, 2014 Partajează Postat Ianuarie 20, 2014 Incearca asta: program temp_andreimain: ANSEL = 0 ' Configure AN pins as digital I/O TRISA5_bit = 1 ' set RA0 pin as input TRISC2_bit = 0 ' set RA1 pin as outputwhile TRUE if (RA5_bit = 0) then ' la tranzitia 1-0 a pinului RA5, while (RA5_bit = 0) ' cat timp pinul RA5 este 0, nop ' nu executa nimic wend ' pana la reaparitia 1 logic pe pinul RA5 RC2_bit = 1 delay_ms(40000) RC2_bit = 0 end ifwendend. ' endless loop Link spre comentariu
Vizitator marian_ariciuc Postat Ianuarie 21, 2014 Partajează Postat Ianuarie 21, 2014 l-am rezolvat pe cod... dupa ce am definit intrarile si iesirile, am adaugat o stare initiala(0V), pentru RC2 program temp_andreimain: ANSEL = 0 ' Configure AN pins as digital I/O TRISA5_bit = 1 ' set RA0 pin as input TRISC2_bit = 0 ' set RA1 pin as output RC2_bit = 0 ' stare initiala RC0 - 0V-releu necomandat while TRUE if (RA5_bit = 0) then ' la tranzitia 1-0 a pinului RA5, RC2_bit = 1 ' activeaza RC2(5V) - releu anclansat while (RA5_bit = 0) ' incepere bucla ''pauza'' , adica atat cat timp pinul RA5 este pus la masa(0), nop ' nu executa nimic pana la reaparitia 1 logic pe pinul RA5 wend ' incheiere bucla de ''pauza'' goto bucla ' mergi direct la subrutina 'bucla' end ifwendbucla: delay_ms(25000) ' asteapta 25 secunde RC2_bit = 0 ' revino la starea initiala(0V) RC2 - releu necomandat goto main ' reia codulend. ' endless loop@Rabulea Sergiu, am incercat si varianta de cod propusa de tine si am constatat ca nu functiona asa cum voiam eu; eu vreau ca atunci cand am RA5 pus la masa, sa-mi activeze RC2 si sa stea in starea asta cat timp este RA5 la masa. d-abea dupa ce RA5 revine la starea initiala, sa inceapa sa numere timpul(cele 25sec).... am observat ca degeaba setez alta frecventa ca microcontrolerul functioneaza tot la 4Mhz. Link spre comentariu
Rabulea Sergiu Postat Ianuarie 21, 2014 Partajează Postat Ianuarie 21, 2014 @Rabulea Sergiu,am incercat si varianta de cod propusa de tine si am constatat ca nu functiona asa cum voiam eu; eu vreau ca atunci cand am RA5 pus la masa, sa-mi activeze RC2 si sa stea in starea asta cat timp este RA5 la masa. d-abea dupa ce RA5 revine la starea initiala, sa inceapa sa numere timpul(cele 25sec)OK, ca sa faca lucrul acela(exemplul dat de mine) trebuie mutata doar o line de cod:program temp_andreimain: ANSEL = 0 ' Configure AN pins as digital I/O TRISA5_bit = 1 ' set RA0 pin as input TRISC2_bit = 0 ' set RA1 pin as outputwhile TRUE if (RA5_bit = 0) then ' la tranzitia 1-0 a pinului RA5, RC2_bit = 1 ' linia asta am mutat-o while (RA5_bit = 0) ' cat timp pinul RA5 este 0, nop ' nu executa nimic wend ' pana la reaparitia 1 logic pe pinul RA5 delay_ms(25000) RC2_bit = 0 end ifwendend. ' endless loopIncearca acum codul postat (am ajustat di delay-ul)In codul postat de tine ai acea trimitere la rutina "Bucla:" (pana aici nici o problema), dar din acea rutina te intorci la "Main:" nu in interiorul buclei infinite(while TRUE).Ceea ce faci prin ce am spus mai sus este sa reinitializezi PIC-ul de fiecare data cand apesi butonul, ceea ce nu este nevoie, si de aici ti se trageau problemele.am observat ca degeaba setez alta frecventa ca microcontrolerul functioneaza tot la 4Mhz.Daca folosesti oscilatorul intern nu este de ajuns sa setezi alta frecventa in compilator.Pentru a schimba frecventa de clock trebuie sa citesti datasheet-ul, la sectiunea oscilatorului, mai precis registrul "OSCCON"Prin acel registru poti modifica frecventa de lucru.Pentru 8MHz registrul OSCCON ar trebui sa contina valoarea "0x71"OSCCON = 0x71Daca folosesti quartz extern frecventa se schimba, schimband quartzul.Spor. Link spre comentariu
Vizitator marian_ariciuc Postat Ianuarie 22, 2014 Partajează Postat Ianuarie 22, 2014 In codul postat de tine ...si de aici ti se trageau problemele.ahaa, multumesc!cand voi ajunge acasa il probez cu varianta propusa de tine.bun. am inteles care-i treaba cu oscilatorul intern; pe viitor voi tine cont.varianta cu oscilatorul extern-aveam o idee despre acest lucru.Multumesc mult Dle. Sergiu Rabulea!cu stima, Marian ARICIUC!postez rezultatul ceva mai tarziu! Link spre comentariu
Vizitator marian_ariciuc Postat Ianuarie 23, 2014 Partajează Postat Ianuarie 23, 2014 in urma sfaturilor date de Rabulea Sergiu(multumesc inca odata!), postez ultima varianta de cod mikrobasic, zic eu corecta pentru ca am compilat-o si programat uc-ul care face ca montajul sa ''munceasca'' asa cum mi-am propus. program temp_andreimain: ANSEL = 0 ' Configure AN pins as digital I/O TRISA5_bit = 1 ' set RA0 pin as input TRISC2_bit = 0 ' set RA1 pin as outputwhile TRUE if (RA5_bit = 0) then ' la tranzitia 1-0 a pinului RA5, RC2_bit = 1 ' activeaza RC2(5V) - releu anclansat while (RA5_bit = 0) ' incepere bucla ''pauza'' , adica atat cat timp pinul RA5 este pus la masa(0), nop ' nu executa nimic pana la reaparitia 1 logic pe pinul RA5 wend ' incheiere bucla de ''pauza'' delay_ms(25000) ' asteapta 25 secunde RC2_bit = 0 ' revino la starea initiala(0V) RC2 - releu necomandat end ifwendend. ' endless loop este oare posibil in mikrobasic sa trimit la ''sleep'' microcontrolerul daca nu avem activitate? Link spre comentariu
Rabulea Sergiu Postat Ianuarie 23, 2014 Partajează Postat Ianuarie 23, 2014 este oare posibil in mikrobasic sa trimit la ''sleep'' microcontrolerul daca nu avem activitate?Da este posibil, doar ca "trezirea" din sleep necesita o intrerupere. 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