Sari la conținut
ELFORUM - Forumul electronistilor

help me editare cod in mikrobasic si 16F684


Vizitator marian_ariciuc

Postări Recomandate

Vizitator 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?

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

Top autori în acest subiect

  • Rabulea Sergiu

    3

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

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,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.
Link spre comentariu
Vizitator 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!
Link spre comentariu
Vizitator 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?

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