iuli09 Postat Februarie 19, 2020 Partajează Postat Februarie 19, 2020 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
UDAR Postat Februarie 19, 2020 Partajează Postat Februarie 19, 2020 Am scris ceva la repezeala . Nu am verificat nimic . Temporizator Forum.zip Link spre comentariu
iuli09 Postat Februarie 19, 2020 Autor Partajează Postat Februarie 19, 2020 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
djvas Postat Februarie 19, 2020 Partajează Postat Februarie 19, 2020 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
UDAR Postat Februarie 19, 2020 Partajează Postat Februarie 19, 2020 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
djvas Postat Februarie 19, 2020 Partajează Postat Februarie 19, 2020 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 Link spre comentariu
UDAR Postat Februarie 19, 2020 Partajează Postat Februarie 19, 2020 Doamne ferește ! Sincer nici nu am acum codul în față . E posibil să fie ce zici . O să verific după ce se termină meciul de tenis . Link spre comentariu
gas2 dan Postat Februarie 19, 2020 Partajează Postat Februarie 19, 2020 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
djvas Postat Februarie 19, 2020 Partajează Postat Februarie 19, 2020 Asha este... Acum am vazut ca butonul este activ in zero si nu in unu cum credeam. Link spre comentariu
UDAR Postat Februarie 19, 2020 Partajează Postat Februarie 19, 2020 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
Bandi Szasz Postat Februarie 19, 2020 Partajează Postat Februarie 19, 2020 (editat) 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 Februarie 19, 2020 de Bandi Szasz Link spre comentariu
UDAR Postat Februarie 20, 2020 Partajează Postat Februarie 20, 2020 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
iuli09 Postat Februarie 20, 2020 Autor Partajează Postat Februarie 20, 2020 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
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