Sari la conținut
ELFORUM - Forumul electronistilor

ajutor cu un program pentru pic 12c508


asyx

Postări Recomandate

acum ca stau sa ma gandesc mai bine,cand butonul nu este apasat,ambele iesiri trebuie sa fie in 0.deci,buton apasat - iesirea 1 in HIGH buton lasat - ambele iesiri in LOW buton apasat - iesirea 2 in HIGH buton lasat -ambele iesiri in LOWsi tot asa.am nevoie asa pentru deschiderea displayului la un dvd de masinadriverul de motor bidirectional nu mai primeste impuls din microcontroler decat pentru un sensmultumesc

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

Top autori în acest subiect

  • asyx

    17

  • mars01

    12

  • UDAR

    5

  • modoran

    2

Top autori în acest subiect

Imagini postate

Nu cred ca se merita folosit 12F629 atata timp cat 12F675 este cu 0.3 lei mai scump (la tme de ex fiindca la miva, culmea, este mai scump 629 decat 675). Poate foloseste ADC-ul la altceva. :)LE: sa inteleg ca doresti ca la fiecare apasare sa se emita un puls care sa alterneze de la o iesire la alta cu fiecare apasare? Cat de lung sa fie pulsul?Sau: cat timp este apasat butonul la iesirea 1 ai HIGH. La urmatoarea apasare, cat timp este apasat butonul la iesirea 2 este HIGH ?

Link spre comentariu

1 @asyx E bine că te-ai lămurit ( sau nu?). În varianta asta PIC-ul e soluția simplă. Preferabil ar fi să-ți definești exact tema ( ex. buton apăsat - ieșirea x HI --- cât timp ? cât e apăsat butonul ? ) înainte să mai stea cineva să-ți scrie cod.2. @mars01 Ai dreptate , și eu folosesc 12F675 și urmeză proiecte cu 12F1501 pe post de ”8 pin”. Eu am zis-o ca posibilitate.

Link spre comentariu

Oricum, in cazul acesta trebuie vazut daca motorul este pas cu pas si daca driver-ul accepta semnale de STEP si DIR (adica pas si directie) sau uC-ul este cel care face toata logica.Daca motorul este ca la DVD-ul din PC adica un motor de curent continuu este mai simplu (cu conditia ca motorul sa aiba senzori de capat de cursa si pozitie Home).

Link spre comentariu

Oricum, in cazul acesta trebuie vazut daca motorul este pas cu pas si daca driver-ul accepta semnale de STEP si DIR (adica pas si directie) sau uC-ul este cel care face toata logica.Daca motorul este ca la DVD-ul din PC adica un motor de curent continuu este mai simplu.

motorul este clasic cu perii,sensul este dat de un driver bidirectional
Link spre comentariu

Timpul de 5 secunde este critic sau poate fi de ex un +/- 5% adica +/- 0.25" ? Vezi postul meu de mai sus ca il modificam cand postai ...LE: Hopa ... avem si semnal de directie?Adica avem ceva de genul: cand apasam butonul se activeaza iesirea 1 care porneste motorul pentru 5 secunde in sensul Inainte la prima apasare si la urmatoarea apasare activeaza iesirea 2, sensul Inapoi si tot asa?Deci avem nevoie de 3 iesiri:1. Motor ON,2. Motor Inainte3. Motor Inapoi?

Link spre comentariu

Timpul de 5 secunde este critic sau poate fi de ex un +/- 5% adica +/- 0.25" ? Vezi postul meu de mai sus ca il modificam cand postai ...

timpul este dat de microprocesor.la pic am nevoie doar sa tina iesirea in HIGH pe timpul asta
Link spre comentariu

Deci microprocesorul este de fapt semnalul de comanda, "butonul"?Mai scrie odata logica pe care trebuie sa o aiba circuitul ca sa te pot ajuta si sa nu stau sa tot scriu cod.

la apasarea butonului de eject de pe fata dvd-ului,microprocesorul scoate 5V, pe o perioada de 5 scunde,pe care o aplica driverului pentru motor.la urmatoarea apasare de buton ar trebui sa se retraga ecranul.acest lucru nu se mai intampla pentru ca nu mai vin cei 5V pe intrarea de sens invers a driverului.de aceea vreau sa intercalez pic-ul ca sa faca schimbarea de sens,folosind acesti 5V
Link spre comentariu

Ok.

 

Am rescris programul, dar imi venea sa arunc cu PC-ul pe geam. De cand am facut upgrade la Win 8.1 nu am mai programat PIC-uri (mai mult Arduino zilele astea ...). Dupa ce am facut programelul pentru tine, deoarece am un PIC12F675 an zis sa fac un test pe breadboard.

 

Da ce a vrut sa il scrie ?!!! Nu mergea PicKit-ul, nu era detectat .... intr-un final am gasit pe www, informatii cum ca in Win 8.1 x64 trebuie dezactivat Driver Signature Enforcement. Am facut acest lucru si am reusit sa scriu uC-ul.

 

Apoi ceva nu mergea corect, fiindca la prima apasare, pentru o fractiune de secunda se aprindeau ambele LED-uri de iesire ceea ce nu vrem sa se intample. Am rezovat si problema asta (erau initializari redundante).

 

Versiunea pe care o expun acum este exact ce vrei tu:

 

- la initializare, ambele iesiri sunt LOW;

- la prima apasare a "butonului", cat timp este apasat (adica intrarea in HIGH) ai iesirea 1 in HIGH iar cealalta este LOW;

- la urmatoarea apasare a "butonului', cat timp este apasat (adica intrarea HIGH), ai iesirea 2 in HIGH si cealalta in LOW;

S.a.m.d.

 

Numai pun schema aici, singurul lucru care trebuie stiut este ca trebuie sa adaugi (am modificat logica intrarii ca sa corespunda cerintelor tale) o rezistenta de PULL-DOWN (rezistenta la masa de 4.7Ko) la intrare, adica la pinul 2 al uC-ului. Este obligatorie altfel s-ar putea sa actioneze aiurea motorul tau (iesirile).

 

Recomand sa inseriezi si pe iesiri (pinii 5 si 6 ai uC-ului) cate o rezistenta de cca 50...100 ohmi pentru cazul in care se face scurt la iesiri. De asemenea, daca nu esti sigur ce comanzi, ar fi bine sa incluzi cate o poarta buffer pe fiecare iesire.

Nu uita de condensatorii de bypass (0.1uF si 10uF) pe pinii de alimentare ai uC-ului.

 

 

bit flag;      //variabila flag pentru intrarebit old_GP1, old_GP2; //variabile de stocare temporara a valorii iesrilorvoid main ( ){      ANSEL = 0;   //dezactivez ADC      CMCON = 7;   //dezactiveaza comparator      TRISIO = 0b00100000 ;  //setez GPIO 5 ca intrare, restul sunt iesiri            GP1_bit = 0;   //setez iesirea GPIO1 si GPIO2 cu LOW. La initializare iesirile vor fi LOW      GP2_bit = 0;      flag = 0;            while ( Button(&GPIO, 5, 50, 0) );  //se sta in aceasta bucla pana se apasa butonul                       delay_ms (50);                                 old_GP1 = 0;                 old_GP2 = 1;      while ( 1 )      {       // bucla infinita              if (Button(&GPIO, 5, 50, 1))  // Detecteaza activarea butonului              {                 flag = 1;              // Updateaza flag-ul                 GP1_bit = ~old_GP1;                 GP2_bit = ~old_GP2;              }                            if (flag && Button(&GPIO, 5, 50, 0))    // Detecteaza tranzitia de la activat la neactivat              {                 flag = 0;                 old_GP1 = GP1_bit;                 old_GP2 = GP2_bit;                 GP1_bit = 0;                 GP2_bit = 0;              }              delay_ms (100);      }      }
Link spre comentariu

Programul da, fisierul compilat (.hex) care trebuie scris in uController nu stiu. Ar fi acelasi pinout si aceasi familie.LE: a trebuit modificat putin la registrul de dezactivare a comparatorului: CMCON0 in loc de CMCON. Plus schimbarea cip-ului in proprietatile proiectului si celelelte setari.Aveti proiectul (neverificat) atasat.

Motor Controller 12F683.zip

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