Sari la conținut
ELFORUM - Forumul electronistilor

Programare PIC16f876A


Postări Recomandate

Buna seara! 

Am o problema cu un PIc16f876a.

 

Am de citit niste senzori, digitali, de proximitate, doi senzori sunt pusi pe portul A si cu ei am probleme.

E o chestie dubioasa si sigur nu e de la circuit pe RA4, cand incerc sa il citesc nu vede ce trebuie, ba merge intr-un sens ba brusc se schimba si cand ating planul de masa al placutei cu mana, sau partea de metal a senzorului ( care e tot ground ), parca scade brusc tensiunea din circuit si se incalzeste foarte tare driverul ( citesc senzorii si cu ajutorul lui dau comenzi unor motoare ). Driverul e L298, care la fel sigur e conectat bine, problema e soft 100%.

 

Pus codul, sunt convins ca gresesc ceva la registrii.M am uitat in datasheet dar nu am gasit solutia.

 

void Reverse(){     PORTB=0;     PORTB.F5=1;     PORTB.F6=1;}      void Forward(){     PORTB=0;         PORTB.F4=1;     PORTB.F7=1;}                             //rc0 si ra4void init(){ADCON1 = 0b00000110; // all PORTA pins as digital I/OTRISA = 0x3F; // all PORTA pins as digital inputsCMCON =7;// Disable ComparatorsCVRCON=0;               TRISB=0;               TRISC=00000001;        //       TRISA=110000;      PWM1_Init(5000);      PWM2_Init(5000);      PWM1_Set_Duty(255);      PWM2_Set_Duty(255);      PWM1_Start();      PWM2_Start(); }           //ra5,ra4,rc0void main() {init();    while(1){/*if(PORTA.F5==0)Forward();elseReverse();if(PORTC.F5==0)Forward();elseReverse();             */         //ground the plasticif(PORTA.F4==0)Forward();elseReverse();    }}

Codul este de " test " nu este nici pe departe unul final, vreau sa ma asigur mai intai ca toti senzorii sunt conectati si functioneaza corect. Ei dau 0 cand vad ceva si 1 cand nu vad.

 

 

Pe RA5 de exemplu merge foarte bine, doar pe RA4 e o problema..

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

Top autori în acest subiect

Ar trebui sa ne dai date in plus despre cum ii legat L298 si motoarele, senzorii de proximitate, cel putin ce timp de raspuns si ce histerezis au intre detectarea si nedetectarea obiectului. Parerea mea ii ca programu oscileaza schimband directia fata-spate cu freventa mare sau in timpu unei stari stabile ai tranzitii permanente intre comanda motor - fast motor stop.

Daca ai RA4 intr-o stare stabila secventa

  PORTB=0;  PORTB.F5=1;  PORTB.F6=1;

se executa continuu, si pe iesirile B5 si B6 tranzitii intre 0 si 1 logic cu frecventa >100KHz la un clock de 8Mhz pentru PIC. 

Daca senzoru de proximitate detecteaza obiectu si comanzi inversarea directie o sa ajungi in faza cand senzoru nu mai detecteaza obiectu si ai din nou inversarea directie de deplasare si ciclul se repeta. In functie de timpu de deplasare + zona de histerezis a senzorului poti avea si de aici comutari rapide.

Nu inteleg dc trebuie sa faci inversarea de directie in momentu cand detectezi obiectu si nu stop.

Incearca o filtrare pe RA4 si schimbare starii portului B numa in momnetu cand chiar ii tranzitia pe RA4:

bit last,dir; char dir_cnt=5;void main() {init(); last=0; Forward(); while(1) {  if(PORTA.F4==0)    {dir_cnt--;if(dir_cnt<=1) {dir_cnt=1; dir=0;}   }  else   {dir_cnt++;if(dir_cnt>=10) {dir_cnt=10; dir=1;}   }   if(!dir)   {if(last==1)     {Forward();}    last=0;   }  else   {if(last==0)     {Reverse();}      last=1;   } delay_ms(1); }}
 
 
 
 
 
 
 
 
 
 
 
 
Link spre comentariu

Schema e facuta in Kicad, daca vreti o postez, este electronica facuta de mine pentru un robot de mini sumo. 

 

Driverul L298 are 4 intrari, si 2 enable-uri, cele 2 enable-uri sunt puse pe pwm ( asa am citit ca se controleaza ok driverul si intr-adevar merge ). 4 intrari: 1. forward la un motor, a doua forward la al doilea, a 3-a reverse la primul si a 4-a reverse la a doua. sunt conectate pe portul B, RB4-Rb7.

Senzorii ( o sa fie 5, momentan am conectati doar 3, sa mearga astia si ii pun si pe restu ), sunt pusi pe RA5,RA4 si RC0, eu momentan doar TESTEZ, dupa cum ziceam, in final el trebuie sa detecteze obiectul si sa il " atace ".Momentan as vrea doar sa nu se ciocneasca de nimic, ca sa vad ca merg bine senzorii interfatati cu picul.

Date: Driver- L298

Chip: Pic16876a, dar am si PIc18f2550 ( asta e mai greu de programat are multt mai multe functii )

Senzorii: sharp 340k ( digitali, nu analogici )

Eu pe RA4, vreau sa il folosesc DOAR CA O INTRARE OBISNUITA DIGITALA.

 

Ventzel- din ce ai scris tu am inteles o chestie, sa ii pun un counter, care sa se " asigure " ca senzorul vede ceva, nu? Asta foloseam si pentru push-buttonuri, dar foloseam o structura cu 2 if-uri, adica verifica ca sigur butonul e apasat. Un mic delay pentru debounce.

 

Multumesc mult, ma apuc sa testez ce ai spus tu.

Am facut un mic " test ", sa se aprinda un led ( pentru verificare, pus pe portul RB1, cand senzorul vede ceva ), singurul care merge este senzorul conectat pe portul C, deci problema cred ca este la configurarea portului A. Ambii senzori pusi pe portul A, NU functioneaza cum trebuie. ( senzorii sunt 100% buni ).

Editat de Iliescu Mihai
Link spre comentariu

@Mihai:

void Reverse(){     PORTB=0;     PORTB.F5=1;     PORTB.F6=1;}void Forward(){     PORTB=0;     PORTB.F4=1;     PORTB.F7=1;}void init(){ PORTA=0; TRISA=0xFF; ADCON1=0b00000110; CMCON=0x07; PORTB=0; TRISB=0b00001101;} bit last,dir; char dir_cnt=5;void main() {init(); last=0; Forward(); while(1) {  if(PORTA.B4==0)   {dir_cnt--;if(dir_cnt<=1) {dir_cnt=1; dir=0;}    PORTB.B1=1;   }  else   {dir_cnt++;if(dir_cnt>=10) {dir_cnt=10; dir=1;}    PORTB.B1=0;   }   if(!dir)   {if(last==1)     {Forward();}    last=0;   }  else   {if(last==0)     {Reverse();}      last=1;   } delay_ms(1); }}

Intrare din senzor pe RA4, LEDul pe RB1 legat catre masa se aprinde cand RA4 ii in 0 si se stinge cand RA4 ii in 1 logic. Testat acuma in Proteus.

 

@Liviu: cat timp ai setat corect PORTA sa dezactivezi functia de pe ADC prezenta dupa reset si sa treci pinii care ii vrei in digital prin setarea ADCON1=0b0000011x; sau la alta valoare daca vrei unii sa fie rezervati pentru ADC (pagina 130 in .pdf) si a directiei din TRISA, nu vad ce traba ar avea sursa de clk pentru tmr0 care ii numa intrare.

Editat de ventzel
Link spre comentariu

Stati asa, deci momentan am depistat o problema, pentru care nu mergea pe portul A ( cu exceptia a RA4 ), senzorii ( 2 dintre ei ) aveau cablajul intrerupt si nu am vazut, circuitul fiind foarte mic, si vederea mea nu foarte buna. ( Pentru cine a intrebat daca am initializat portul output/input si registrul TRIS pentru fiecare, da, am facut asta )

 

Acum merge pe RA5, RA3, RC0, acum ma uit pe RA4, acolo am incercat ce mi-a spus UDAR:

 

T0CS_bit=0;         // disable T0 (not necessary)
T0SE_bit=1;         // disable T0 (not necessary)
 
Am adaugat asta, atunci nu mergea, dar probabil din cauza senzorilor, acum incerc sa vad daca merge.
 
Si dupa trec la ce mi-ai scris tu ventzel - deci ca sa inteleg, ce ai facut tu in cod, e doar sa " verifici " daca  senzorul chiar vede, nu?
Editat de Iliescu Mihai
Link spre comentariu

Felicitari ca-ti merge, dar data viitoare, ca sa micsorezi numarul de posibilitati, conectezi la intrarea care nu merge ceva despre care sa stii sigur ca merge. In cazul trebuia sa conectezi la RA4 senzorii de pe RA5, de exemplu.

Daca dintr-o data mergea, problema era la senzori. Daca tot nu mergea, problema era la RA4.

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