Sari la conținut
ELFORUM - Forumul electronistilor

Solicitare cod PIC


iuli09

Postări Recomandate

Buna ziua,

 

ma poate ajuta cineva cu un cod scris in MikroC pentru un PIC 12F629 ?

 

Schema este destul de simpla : la GP0 voi avea cuplat un buton cu revenire , la GP1 si GP2 cate un tranzisor care va comanda un releu .

 

Mod de functionare : la apasarea butonului se cupleaza primul releu pentru 3 minute ; se decupleaza releul facem pauza un minut dupa care se cupleaza cel de-al doilea releu pentru trei minute , se decupleza releul2 ,pauza un minut dupa care se cupleaza ambele relee pentru 3 minute . La expirarea celor trei minute secventa se opreste .

Daca in intervalul cuprins intre startul si finalizarea secventei se apasa butonul , aceasta apasare este ignorata.

 

 

Multumesc anticipat.

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

Top autori în acest subiect

  • UDAR

    5

  • djvas

    3

  • iuli09

    3

  • gas2 dan

    1

Top autori în acest subiect

In simulare nu se comporta asa cum am eu nevoie dar multumesc oricum pentru acest punct de plecare ; o sa incerc sa vad daca ma descurc sa adaptez programul .

 

 

O zi buna va doresc .

Link spre comentariu

incearca codul asta si ai grija sa bifezi library manager libraria Button

// Pe GP0 buton la masa.
// Pe GP1, GP2 iesiri active in 1 - rezistenta spre baza unui tranzistor.
// GP3 este configurat ca MCLR si trebuie legat la +Vdd printr-o rezistenta de cca 10kOhm
// Pentru utilizarea lui ca MCLR se pune un buton la masa.
// GP4 este configurat ca CLKOUT . Se poate verifica functionarea oscilatorului
// Ar trebui sa am circa 1MHz
// GP5 este iesire, liber.



#define Releu1 GPIO.b1
#define Releu2 GPIO.b2

char i;

void minut ()   {
delay_ms(60000);
}

void main() {
   TRISIO = 1;                          // GP0 Intrare , restul iesiri
   OPTION_REG = 0;                      // Pull-up activ  pe bitul selectat
   WPU = 1;                             // Pull-up pe GP0
  while(1)       {                      // Bucla infinita
   if (button (GPIO,0,10,1))                        // Astept aici apasarea butonului
   {
   Releu1 = 1;
   for(i=0;i<3;i++) minut();
   Releu1 = 0;
   minut();
   Releu2 = 1;
   for(i=0;i<3;i++) minut();
   Releu2 = 0;
   minut();
   Releu1 = 1;
   Releu2 = 1;
   for(i=0;i<3;i++) minut();
   Releu1 = 0;
   Releu2 = 0;
  }
}
}

 

Link spre comentariu

Nu cred că folosirea funcției Button schimbă prea mult lucrurile . Nu avem nevoie de debouncing , e suficient să fie sesizată o singură apăsare a butonului .

Mi-ar fi plăcut ca IT să spună mai detaliat ce și cum a simulat . 

Link spre comentariu

Nu asta era problema...  mi se pare ca ai gresit un pic acolo la while (buton )  care de fapt nu face nimic mai departe odata ca nu include codul de sub el  si chiar daca l-ar include ar trebui tinut butonul apasat pe toata perioada .

Sper ca nu e cu suparare ca am incercat sa  corectez codul tau :jytuiyu

Link spre comentariu

Cum a facut UDAR, pare mult mai logic: 

asteapta apasare buton:

while(buton neapasat);

Cerintele nu spun ca trebuie ca programul trebuie sa faca altceva in timpul asta.

Debouncing nu este cazul, urmeaza delay-uri mari.

Poate a gresit ceva pe acolo de nu merge. Dar, eu zic ca asa se face.

 

Link spre comentariu

M-am uitat din nou peste cod și nu am găsit nimic . Dacă până în weekend nu se rezolvă o să încerc să-l pun pe un breadboard . Nu am 629 dar cred că mai am un 675 . Dacă nu, 615 am precis . Oricum ar fi util să primim niște detalii de la IT. 

Link spre comentariu

Problema este cu comparatorul, la alimenatre comparatorul este pornit si intrarile aferente sunt in mod analog care inseamna ca GPIO0 este folosit ca intrare analogica inversoara pentru comparator. Trebuie setat comparatorul sa lase portul GPIO ca intrare digitala, a doua chestie este ca nu era oprit resetul pe GP3 si mult mai probabil IT nu a legat o rezistenta pull-up, eu l-am oprit pentru ca il opresc mai la toate proiectele facute de mine, daca IT doreste il poate activa la loc usor din mikroC.

 

Atasat codul functional testat in proteus

 

.Temporizator.rar

Editat de Bandi Szasz
Link spre comentariu

Corect! Am uitat sa dezactivez comparatorul ! ( Am mai pățit-o și altă dată dar cum lucrez rar, am uitat ! ).

În ceea ce privește RESET-ul am făcut mențiunea în comentarii, nu știu dacă a fost respectată. 

OK, bine că merge acum. 

Link spre comentariu

Multumesc tuturor pentru ajutor ; acum simularea ruleaza corect .

 

GP3 era legat la VCC printr-o rezistenta de 10K dar problema presupun ca era la pinul de intrare pentru ca secventa era initiata in simulare fara ca butonul sa fie apasat ; probabil este vorba despre ceea ce a mentionat Bandi Szasz in comentariu .

 

Pentru cazul in care fisierele atasate devin indisponibile si o sa mai aiba cineva nevoie de cod in postez aici . Multumesc inca o data pentru ajutor si scuze pentru feedback-ul intarziat .

// Pe GP0 buton la masa.
// Pe GP1, GP2 iesiri active in 1 - rezistenta spre baza unui tranzistor.
// GP3 este configurat ca MCLR si trebuie legat la +Vdd printr-o rezistenta de cca 10kOhm
// Pentru utilizarea lui ca MCLR se pune un buton la masa.
// GP4 este configurat ca CLKOUT . Se poate verifica functionarea oscilatorului
// Ar trebui sa am circa 1MHz
// GP5 este iesire, liber.


#define Buton  GP0_bit
#define Releu1 GPIO.b1
#define Releu2 GPIO.b2

char i;

void minut ()   {
delay_ms(60000);
}

void main() {
   TRISIO = 1;                          // GP0 Intrare , restul iesiri
   CMCON = 0x7;                         // GP0 Intrare digitala, comparator oprit
   OPTION_REG = 0;                      // Pull-up activ  pe bitul selectat
   WPU = 1;                             // Pull-up pe GP0
   GPIO = 0;                            // Toate iesirile oprite
  while(1)       {                      // Bucla infinita
   while(Buton);                       // Astept aici apasarea butonului
   Releu1 = 1;
   for(i=0;i<3;i++) minut();
   Releu1 = 0;
   minut();
   Releu2 = 1;
   for(i=0;i<3;i++) minut();
   Releu2 = 0;
   minut();
   Releu1 = 1;
   Releu2 = 1;
   for(i=0;i<3;i++) minut();
   Releu1 = 0;
   Releu2 = 0;
  }
}

 

 

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