Sari la conținut
ELFORUM - Forumul electronistilor

Programare PIC16f876A


Postări Recomandate

Nu reusesc sa fac sa mearga cum trebuie, ma supara tare :d.

 

void Reverse(){     PORTB=0;     PORTB.F5=1;     PORTB.F6=1;}      void Forward(){     PORTB=0;         PORTB.F4=1;     PORTB.F7=1;}void Stop(){PORTB=0;}                  //rc0 si ra4void init(){     ADCON1 = 6; // all PORTA pins as digital I/O   //  T0CS_bit=0;         // disable T0 (not necessary)    // T0SE_bit=1;         // disable T0 (not necessary)     CMCON =0x7;// Disable Comparators    // CVRCON=0;     TRISB=0;     TRISC=00000001;     //PORTA=0;     TRISA=0xFF;     PWM1_Init(5000);     PWM2_Init(5000);     PWM1_Set_Duty(255);     PWM2_Set_Duty(255);     PWM1_Start();     PWM2_Start(); }void main() {init();    while(1){Forward();  if(PORTC.F0==0)  {  Reverse();  }  else if(PORTA.F5==0)  {  Reverse();  }   }}
Explicati-mi va rog, ce este gresit, ca eu nu vad nimic gresit, iar in realitate functioneaza asa, cat timp niciunul din cei doi senzori NU ESTE ACOPERIT, merge inainte, pana aici ok, cand acopar pe rand unul din senzori se opreste, ca si cum ar fi in stop, dar eu la inceputul fct. de Reverse, dau CLEAR la portul B (PORTB=0). Unde e problema?
 
Nu prea reusesc sa inteleg codul scris de tine, ventzel :(.. Si nu face ce vreau eu. Oricum eu nu vreau sa imi scrie nimeni codul, vreau doar sa mi se arate greselile, de asta fac proiectul asta, sa invat..
Link spre comentariu
  • Răspunsuri 38
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

aici nu este bine

void main() {init();    while(1){Forward();  // prima data fac un pas inainte  if(PORTC.F0==0)  {  Reverse(); // iar daca senzorul este acoperit un pas inapoi, deci STOP ptr ca PICUL ruleaza foarte repede instructiunile  }  else if(PORTA.F5==0)  {  Reverse();  }   }}
Link spre comentariu

Normal ca nu face ce ai vrea. Io am pus numa o filtrare pe intrarea de senzor si o conditie sa nu ai pe RB4-RB7 in oscilatie cand defapt ar trebui sa ai o stare stabila din ce am inteles io.

Mai bine zi-mi exact cum ai gandit sistemu sa functioneze. Simplu, ceva de genu: deplasare intr-o directie pana cand senzoru x scoate 1 logic si atunci faci stop, etc.

 

Editat de ventzel
Link spre comentariu

http://postimg.org/image/yl19ktl2t/

Normal ca nu face ce ai vrea. Io am pus numa o filtrare pe intrarea de senzor si o conditie sa nu ai pe RB4-RB7 in oscilatie cand defapt ar trebui sa ai o stare stabila din ce am inteles io.

Mai bine zi-mi exact cum ai gandit sistemu sa functioneze. Simplu, ceva de genu: deplasare intr-o directie pana cand senzoru x scoate 1 logic si atunci faci stop, etc.

Pai sunt 3 senzori, pe RA5, RA3 si RC0, in momentul in care ORICARE DIN EI detecteaza un obiect sa dea cu spatele, dar nu am nevoie decat de un exemplu pe UNU SINGUR. un singur senzor, RC0 sa zicem. in momentul in care vede ceva, sa o ia cu spatele.

Link spre comentariu

La nivel de logica de functionare:

 1-actioinezi motoru intr-un sens ales sau aleator.

 2-daca senzoru de pe RA5 sau senzoru de pe RA3 sau senzoru de pe RC3 detecteaza obiect inversezi sensu de deplasare si il mentii.

 3-mergi la pasu 2.

Ceva in genu asta?

 

 

Editat de ventzel
Link spre comentariu

Exact, dupa cum ziceam, asta nu e o chestie definitiva, o sa fac algoritmul dupa ce stiu ca electronica merge perfect si totul e ok.

Momentan testez si pentru test asta vreau sa faca, ce ai spus tu, cand vede pe unu din senzori ceva, sa inverseze sensul de mers ( logic ar fi sa inverseze doar pe senzorul din fata si pe cele din laterale sa se roteasca la 90 de grade, dar asta trebuie sa testez din pwm ( sa modific pana nimeresc sa se invarta ) ) insa momentan da, oricare dintre senzori daca vede ceva, sa o ia cu spatele, adica sa nu se ciocneasca niciodata de nimic.

 

Multumesc foarte mult pentru tot ajutorul pe care mi-l acordati. Mereu cand am avut intrebari, utilizatorii elforum au fost pe " faza " si gata sa ma ajute.. 

Editat de Iliescu Mihai
Link spre comentariu

O sa incerc sa descriu cam cum vad o implementare simpla a programului.

 

senzoru ii asta?http://sharp-world.com/products/device/lineup/data/pdf/datasheet/gp2y0d340k_e.pdf

senzoru cand detecteaza un obiect scoate pe iesire 0 logic. Consideram ca avem un singur senzor legat pe RA5.

 

 

1-- trebuie sa pornesti motoru pe fw sau rev in prima faza. Ii important sa stii in ce directie se invarte. Cel mai simplu ii ca odata pornirea motorului sa ai o variabila la care sa-i modifici valoarea in functie de sensu in care se invarte motoru. O sa-i zicem directie si stabilim regula urmatoare: pe forward ia valoarea 1 si pe reverse ia valoarea 0.

Deci pronim motoru pe forward, si da directie ii dam valoarea 1.

 

2--Daca RA5==0 rezulta ca am detectat un obiect si trebuie sa inversam sensu motorului. Trebuie sa stabilim ce sens avem in momentu asta:

2.1- Daca directie==1 momentan ne deplasam in fata si vrem sa ne deplasam invers: schimbam directia pe reverse la motor si variabila directie = 0; + delay*

2.2  Daca directia==0 :                                                                                                 : schimbam directia pe forward si la variabila directie = 1  +delay*

* Daca am schimbat sensu , senzoru inca mai detecteaza prezenta obiectului, deci ar trebui ca urmatoarea citire a strii RA5 sa fie intarziata, pentru a-i da timp motorului sa deplaseze vehiculu si senzoru sa nu mai detecteze obiectu. Cel mai simplu ar fi ca in 2.1 si 2.2 dupa schimbarea senzului sa punem un delay de 1-2 secunde. Daca nu punem delay pana la citirea urmatoare si sarim direct la 2 conditia RA5==0 ii inca adevarata si o sa avem oscilatie forward-reverse. Practic ii foarte posibil ca vehiculul sa stea pe loc sau sa vibreze.

3--Repetam pasu 2

 

 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Link spre comentariu

Credeam ca te-ai bagat la somn si nu mai dai reply, dadeam refresh continuu poate poate :)).

 

Mersi, acum citesc. Da, senzorii aia sunt.

Cam asa?

 


void main() {
init();  
Forward();
directie=1;
while(1){
if(PORTC.F0==0){
if(directie==1)
{Reverse();
directie=0;
Delay_ms(1000);
 }
 else if(directie==0){
 Forward();
 directie=1;
 Delay_ms(1000);
 }
 }
}
}

 

Am reusit !

Cu delay o secunda, ideea e ca asta merge pentru un senzor, dar daca am 5-6 senzori, 1 secunda x 6 = 6 secunde e destul de mult, o sa incerc sa scad delayul sa vad pragul minim.

Editat de Iliescu Mihai
Link spre comentariu
bit directie;void main() {init();Forward(); directie=1;while(1) {  if((PORTA.B5==0)||(PORTA.B3==0))  // (   {if(directie==1)     {Reverse();      directie=0;      delay_ms(1000);     }    else     {Forward();      directie=1;      delay_ms(1000);     }   } }}

Zicem de un delay>1s

la delay_ms(10) ai 10ms. Verifica prima data chiar cu valori mai mari 1000ms.

Editat de ventzel
Link spre comentariu

stiu am modificat, uita-te ca am editat :) !

Acum o sa scad sa vad pragul minim, dupa care o sa " multiplexez " programul pentru 3 senzori sa vad cum merge. Multumesc foarte mult :) !

Maine incep testele si cu senzorii de alb .. trebuie sa nu iasa din ring, cand ii detecteaza sa se intoarca, aia sunt 2 senzori analogici si o sa ma chinui banuiesc ceva cu ei.

Link spre comentariu

Nu-i cea ma buna solutie la problema partea de program care am postat-o, ii numa ca idee sa vezi cam ce ar trebui facut. Io personal ma feresc de delay in orice program, il folosesc numa cand ii musai si nu trece de cateva zeci de us.

Nu ar fi neaparat sa faci delay de 1 secunda, urmatoarele citiri a pinului RA5  dupa o schimbare de sens ar putea fi ignorate timp de o secunda si restu programului care o sa-l mai ai pe langa asta sa fie executat in continuare.

Io zic prima data sa stabilizezi partea cu senzorii astia si sa nu te apuci de toate odata. Ia-le pe rand.

Editat de ventzel
Link spre comentariu

Da, asta vreau sa fac, prima data sa fiu sigur ca merg senzorii.

 

Ideea e ca la programul final, e destul de complex, robotul va trebui sa aleaga o tactica in functie de cadranul in care va fi ( se pune un x pe centrul ringului si robotii se pun in el ) cu ajutorul unui switch la icneput, dupa care in functie de combinatia de switchuri care os a fie selectata sa atace intr-un anume fel, adica pe diagonala, sau prin invaluire, sau direct, etc. 

 

Si in acelasi timp sa aiba grija sa nu cada de pe teren ( senzorii de alb ). E destul de complexa problema, dar vorba ta, toate la timpul lor, partea mai grea ( electronica ) a fost deja facuta.. Acum trebuie doar stabilizata ca sa zic asa. Mai am 3 saptamani.

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