Jump to content
ELFORUM - Forumul Electronistilor
Sign in to follow this  
Guest marian_ariciuc

help me editare cod in mikrobasic si 16F684

Recommended Posts

Guest marian_ariciuc

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:

post-1-139829742789_thumb.jpg

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 loop
este 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?

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Guest marian_ariciuc

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.

Share this post


Link to post
Share on other sites

@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 loop
Incearca 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 = 0x71
Daca folosesti quartz extern frecventa se schimba, schimband quartzul.Spor.

Share this post


Link to post
Share on other sites
Guest marian_ariciuc

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!

Share this post


Link to post
Share on other sites

Guest marian_ariciuc

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?

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.