Sari la conținut
ELFORUM - Forumul electronistilor

Ajutor 15F628A C++


Vizitator aurelian77

Postări Recomandate

Aurelian, eu lucrez in Basic. Nivel de hobby, cum s-a spus deja. Cata vreme faci proiecte ca cel de fata, merge. Pascalul e simplu, doar un pic mai prietenos la sintaxa. Actuale sunt versiunile PRO de la Mikroe. Exemplu MikroC PRO. Ce ai instalat tu e vechi si abandonat de cativa ani buni.Pot pune maine un exemplu. Dar arhiva descarcata contine si un exemplu, din ce-mi aduc aminte.Sunt foarte impresionat ca ai reusit ceva. Sincer sa fiu, credeam ca ai renuntat. Bravo!

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

Top autori în acest subiect

  • mars01

    13

  • Mircea

    7

  • Liviu M

    6

  • elmar

    2

Top autori în acest subiect

Vizitator aurelian77

Aproape ca merge dar... pierde cate un obiect adica prebuie prima data sa intre 2 obiecte apoi numara fiecare obiect la iesire primul nu este numarat urmatoarele toate cate 1 sunt scazute daca dau intrare primul nu va fi numarat urmatoarele toate vor fi numarate corect.

Am simulat in Proteus sunt obosit o sa incarc mai sigur in pic hex-ul si o sa conectez si senxori sa vad daca si aici va da aceiasi eroare adica primul nu va fi numarat cand intra si invers In cazul acesta ledul ar trebui sa lumineze cand un senzor va vedea un obiectiar se va stinge cand el ca trece de al doilea senzor. Interesant ca se poate si mai interesant este a doar un user este implicat exact cel care eu nu credeam ca va fi bunvoitor sa dea macar o explicatie a facut 3v la tot cu tot cu linii comentate :).

Observ ca si alti useri sunt interesati de acest program banuiesc ca doresc sa il foloseasca in alta aplicatie sau poate si altii il descarca ca mod didactic (sa invete cate ceva nou).

Eu ma pun la somn ca sunt obosit dar cum ma trezesc o sa incarc hex-ul in pic sa vad exact cum se comporta.

Mersi pentru tot ajutorul si frumoasa explicatie mars01

Aurelian, eu lucrez in Basic. Nivel de hobby, cum s-a spus deja. Cata vreme faci proiecte ca cel de fata, merge. Pascalul e simplu, doar un pic mai prietenos la sintaxa.

Actuale sunt versiunile PRO de la Mikroe. Exemplu MikroC PRO. Ce ai instalat tu e vechi si abandonat de cativa ani buni.

Pot pune maine un exemplu. Dar arhiva descarcata contine si un exemplu, din ce-mi aduc aminte.

Sunt foarte impresionat ca ai reusit ceva. Sincer sa fiu, credeam ca ai renuntat. Bravo!

Am reusit in Pascal... cateva nopti nedormite si nu am mai intrat aici dar am vazut un user ca mi-a dat un avertisment ca mars01 a pus ceva eram curios sa vadd ce este si am avut parte de o placuta surpriza un cod facut frumos aranjat foarte bine comentat cu simulare in Proteus cam tot ce trebuie eu nu cerusem in Proteus este foarte usor de inteles dar omu a facut totul am vorbit cu el si a venit acuma in final cu a 3a versiune are rabdare nulta calm cu mine :)) ca doar intrebari cam stupide pot sa pun de ca la inceput dar ce este bine pentru mine este ca incep sa pricep in mikroc cate ceva. eu l-am facut in Pascal ala vechi dar am facut cu pic-ul care se gaseste ca exemplu in kelp adica 16f887 cu adc_red pinul 2 citste niste valori de volt si daca gaseste valoarea corecta face o functie eu pe ala l-am facut cu 4nutoanesi cam incomod dar imi fac treaba cu el asa cum este ma incanta ideia ca ar merge si mai bine cu un pic 16f628a deoarece este mai ieftin il am (am luat 2 buc) pare mult mai rapid decat ce am facut eu nu stiu e mai bun de fapt programatorul e mai bun  :) eu am initializat porturile ca intrare la fiecare comanda si am lasat sa citeasca in bucla am ceva invarteli multe in el nu e ca la carte dar acum m-am decis sa invat C observ ca pe net sunt mai multe exemple in C si oameni care explica in C in pascal ......... mai imica eu daca sunt la inceput am nevoie de exemple de useri care doresc sa explice si nu de unu ca o explica omul dar intr-un final se va satura o informatie luata de la unu alta de la altul alta de la alus si asa invat fara sa supar pe nimeni. Pe mine nu ma interesa in ce program se poate face doar doream un program in care se face si explicat ca sa ma pot decide ce sa invat. Daca doream doar sa realizez aceast aparat poteam simplu sa cer un hex ca doar de el aveam nevoie dar eu doresc sa invat ca de fie vorba cand faci ceva cu mana ta cap coada parca altfel te simti la final iar cand copii doar te folosesti de acel obiect dar ca satisfactie e cam zero. Am mai auzit pe unele forumuri sfauri de genu plateste pe unu si til face fara sa te doara capul pe tine si sa cheltui inutil.Da poate ma ajungea mai iftin daca apelam sa scrie codul tot cineva sau chiar cheltuiala deloc cum ar fi aici facut iau hexu il scriu in pic si gata dar...... ce ramane!? ma refer ca si realizare ok este aparatu dar in cap ? ca si satisfactie? sau cand doresc sa fac altceva ? ce fac intru fuga pe forum si pun pe cineva la treaba obtin un hex si gata. e mai simplu cred eu dar de durata cam lunga sa invat si cand doresc sa fac ceva sa imi fac eu la final satisfactia nu se compara. Si doresc si mai tare sa invat ca observ ca nu sunt useri de meserie programatori si nu au facut scoli speciale sau eu mai stiu eu ce fata de cum credeam eu ca voi sunteti programatori. Asa cred ca pot si eu sa invat in fine nu sa fac avioane ozn etc doar cea ce imi trebuie lucruri simple. Acuma eu o sa incerc sa fac aparat de hranit pestii automat deoarece la clocitoare am abandonat ca are senzor de data si .... mai am de invatat pana acolo dar la aparat de hranit pesti cred ca e mai simplu deoarece utilizez un ceas si trebuie sa mai adaug 3 ore prestabilite in care sa pornesc un moror iar el sa se opreasca pana apas un buton butonu se va apasa la o tura de ax suficent pentru o doza de mancare la pestisori.Si asa pestisorii mei vor fi fericiti oadta cu mine de fapt mai fericiti ca sunt ei si acuma ;)

Link spre comentariu

Cum folosesti acel Encoder:

 

Asa va arata in program in tab-ul Library Manager odata instalat pachetul.

Posted Image

Iti instalezi Package Manager (tot de la Mikroe). Vei selectiona pentru instalare 142756005_rotary_encoder_mikropascal_pic.mpkg

Posted Image

Ca sa vezi exemplu de folosire deschizi arhiva asta.

Posted Image

O sa arate continutul asa (te uiti in dosarul mP). mB este pentru Basic.

Posted Image

Odata instalat cu package manager, vei avea astea in dosarul de instalare Mikropascal (alternativ la ce am facut mai sus).

Posted Image

 

Cum il pui in program?

 

Pui asta inainte de bucla principala. O interpui in ce mai ai tu acolo:

uses  Rotary_Encoder;var Counter: byte;// Rotary Encoder connections to the PIC    Rotary_Encoder_A : sbit at RE1_bit;    Rotary_Encoder_B : sbit at RE0_bit;//------------------------------------------------------------------------------procedure InitTimer1(); // 1 millisecond timer, adapt values if necessarybegin  T1CON         := 0x01;  TMR1IF_bit    := 0;  TMR1H         := 0xE7;  TMR1L         := 0x96;end;procedure HW_Init;     // Minimal Hardware initialisation for Debugbegin  TrisE0_bit := 1; // make input  TrisE1_bit := 1; // make input  CMCON := CMCON or 0x07;             // turn off comparators  ADCON1 := ADCON1 or 0x0F;           // turn off analog inputs  // Initialise the rotary encoder detection  Counter := 0;  Init_Rotary_Encoder;  // initialise timer  InitTimer1;  // Turn on all Interrupt handling in general (last thing to be done)  TMR1IE_bit  := 1;  // Timer1 Interrupt enable  INTCON.PEIE := 1;  // Peripheral Interrupts enable  INTCON.GIE  := 1;  // Interrupts global einschaltenend;//------------------------------------------------------------------------------// Interrupt procedure//------------------------------------------------------------------------------procedure Interrupt();begin  if (TMR1IF_bit) then  begin    TMR1IF_bit := 0;    TMR1H      := 0xE7; // adapt values if necessary to have a 1 millisecs interrupt interval    TMR1L      := 0x96; // -- " --        // rotary encoder    Check_Rotary_Encoder; // check the rotary encoder inputs  end;end;

Pui asta in bucla principala.

    // Rotary encoder        if Rotary_Direction > 0 then    begin      case Rotary_Direction of        1: //        inc(Counter);        2: //        dec(Counter);      end;      Rotary_Direction := 0; // reset to zero after usage    end;

Se poate adapta si pentru 2 encodere, cred ca si pentru mai multe. Eu folosesc 2 encodere cu biblioteca asta. Functioneaza OK cu encoderele indicate.

 

Spor la treaba!

 

PS: daca totusi lucrezi in MikroC, vei folosi exemplul lui Mars01.

 

LE: vezi ca au 2 biblioteci in USES. Una se numeste Rotary_Encoder, alta Rotary_Encoder_p16. Tu o alegi pe aia cu p16 la coada, caci este pentru PIC-uri 16F. Aia simpla fiind pentru PIC 18F.

 

Schimbari in cod:

uses  Rotary_Encoder_p16;
Editat de thunderer
Link spre comentariu
Vizitator aurelian77

 

Cum folosesti acel Encoder:

 

Asa va arata in program in tab-ul Library Manager odata instalat pachetul.

 

Posted Image

 

Iti instalezi Package Manager (tot de la Mikroe). Vei selectiona pentru instalare 142756005_rotary_encoder_mikropascal_pic.mpkg

 

Posted Image

 

Ca sa vezi exemplu de folosire deschizi arhiva asta.

 

Posted Image

 

O sa arate continutul asa (te uiti in dosarul mP). mB este pentru Basic.

 

Posted Image

 

Odata instalat cu package manager, vei avea astea in dosarul de instalare Mikropascal (alternativ la ce am facut mai sus).

 

Posted Image

 

Cum il pui in program?

 

Pui asta inainte de bucla principala. O interpui in ce mai ai tu acolo:

uses  Rotary_Encoder;var Counter: byte;// Rotary Encoder connections to the PIC    Rotary_Encoder_A : sbit at RE1_bit;    Rotary_Encoder_B : sbit at RE0_bit;//------------------------------------------------------------------------------procedure InitTimer1(); // 1 millisecond timer, adapt values if necessarybegin  T1CON         := 0x01;  TMR1IF_bit    := 0;  TMR1H         := 0xE7;  TMR1L         := 0x96;end;procedure HW_Init;     // Minimal Hardware initialisation for Debugbegin  TrisE0_bit := 1; // make input  TrisE1_bit := 1; // make input  CMCON := CMCON or 0x07;             // turn off comparators  ADCON1 := ADCON1 or 0x0F;           // turn off analog inputs  // Initialise the rotary encoder detection  Counter := 0;  Init_Rotary_Encoder;  // initialise timer  InitTimer1;  // Turn on all Interrupt handling in general (last thing to be done)  TMR1IE_bit  := 1;  // Timer1 Interrupt enable  INTCON.PEIE := 1;  // Peripheral Interrupts enable  INTCON.GIE  := 1;  // Interrupts global einschaltenend;//------------------------------------------------------------------------------// Interrupt procedure//------------------------------------------------------------------------------procedure Interrupt();begin  if (TMR1IF_bit) then  begin    TMR1IF_bit := 0;    TMR1H      := 0xE7; // adapt values if necessary to have a 1 millisecs interrupt interval    TMR1L      := 0x96; // -- " --        // rotary encoder    Check_Rotary_Encoder; // check the rotary encoder inputs  end;end;

Pui asta in bucla principala.

    // Rotary encoder        if Rotary_Direction > 0 then    begin      case Rotary_Direction of        1: //        inc(Counter);        2: //        dec(Counter);      end;      Rotary_Direction := 0; // reset to zero after usage    end;

Se poate adapta si pentru 2 encodere, cred ca si pentru mai multe. Eu folosesc 2 encodere cu biblioteca asta. Functioneaza OK cu encoderele indicate.

 

Spor la treaba!

 

PS: daca totusi lucrezi in MikroC, vei folosi exemplul lui Mars01.

 

LE: vezi ca au 2 biblioteci in USES. Una se numeste Rotary_Encoder, alta Rotary_Encoder_p16. Tu o alegi pe aia cu p16 la coada, caci este pentru PIC-uri 16F. Aia simpla fiind pentru PIC 18F.

 

Schimbari in cod:

uses  Rotary_Encoder_p16;

Mersi este foarte util pupurialu facut de tine cum adaug o biblioteca intr-un program. Mars01 mi-a dat de unde sa descarc versiunea pro si am si du versiunea in 6.6.2 si este ok acuma. Usor usor lucrurile iau contur in mintea mea si din cee in ce mi se par mai logice si usoare.

Cand am inceput sa cer ajutor .... totul era in ceata nici macar nu stiam in ce limbaj lucram confundam aveam toate programele instalate si toate erau vechi "abandonate" le combinam si nimica nu iesea functii au asemanatoare unele cand scriu comentariu unele il suporta altfel // ' etc. Acum am mai inteles cate ceva si va multumesc voua altfel poate nu pricepeam nimica.

Ma pun sa fac cablajul ca doresc sa pun pic 16f628a in soclu sa vad daca doreste sa se comporte ca ecoder dar cu senzori :) si apoi voi vedea ce fac cu ledul ala ca il declar ca sa stea luminat cand este vazut de 1 din cei 2 senzori iar sa se stinga atunci cand nu va mai fi vazut de nici un senzor. Poate voi pune in seara asta niste poze dar mai tarziu cu cablajul si cu placuta daca o sa o bag la corodat :) VA MULTUMESC MULT PENTRU SFATURI SI CEEA CE ATI FACUT PENTRU MINE :)

Link spre comentariu

Nu mai da quote la mesaje daca sunt imediat unul dupa altul. Daca trebuie sa folosesti quote (mesaje despartitoare, portiuni speciale care trebuie citate pentru a clarifica mesajul), sterge ce e neimportant si citeaza numai ce vrei sa subliniezi.

Link spre comentariu
Vizitator aurelian77

Am inteles. Scuze, dar nu am stiut. De sters observ ca nu am de unde sa sterg. Eu am cautat sa modific si denumirea la topic dar nu am gasit de unde sa modific.

Sper sa nu fie cu suparare dar eu nu am mai folosit nici un forum pana acuma. 

Link spre comentariu
Vizitator aurelian77

Am realizat si cablaju cam greu ca am gasit un program si nu eram acomodat cu el dar mie imi place :) Atasez si o poza.

http://imageshack.com/a/img673/8348/MpV0VY.gif

M-am decis a face inca un montaj cu PIC 15F628A mii de multumiri lui Mars01 pentru versiunea 3 mai trebuie un pic sa o modific la ledul care nu prea imi place cum se aprinde adica el va trebui sa lumineze la detectarea unui obiect si sa se stinga dupa ce s1 si s2 nu il mai vede (s1,s2 senzori ).Biparul nu l-am pus deoarece nu face nimica dar o sa ii trag fir si pentru el pe cablaj poate in vitor o sa scoata un zgomot cand contorul a ajuns la 0 si cand un obiect se va apropia si invers adica ala 100 fara sa mai lumineze si ledul doar sa bipuie. :)

Carcasa cu afisorr mai trebuie sa lucrez la ia sa ii pun ornamentul exterior si plastic de protectie + mufe si butoane.

http://imageshack.com/a/img538/3452/CefsbP.jpg

Afisorul folosit este un SH dar este functional (model mai vechi)

http://imageshack.com/a/img537/815/1iNGBQ.jpg

Opoza in test dupa ce am incarcat hex-ul in pic.

http://imageshack.com/a/img538/4735/vxLO3g.jpg

Doresc sa stiu de la meseriasi daca ar fi o varianta mai buna de realizarea unor senzori fata de acesta atasez o poza cu schita.

http://imageshack.com/a/img661/1617/o4fGXc.png

Eventual ma gandesc sa pun niste fototranzistori tip led (voi testa sa vad cum se comporta)

P.S.

Cablajul este facut pe 1000mm* 700mm unde a ramas loc liber voi pune un receptor radio si il voi conecta pe fisa care este lasata libera (la butoane) La baterie va fi un acumulator care in caz de pana ce curent sa stie unde a ramas la venirea curentului.

VA MULTUMESC LA TOTI CARE M-ATI AJUTAT SI MI-ATI DAT SFATURI PRETIOASE.

Voi reveni si cu poza cablajului dupa realizarea fizica.

Sa aveti zile placute si mii de multumiri :)) I'm happy dar si foarte   :somn:

Editat de aurelian77
Link spre comentariu

Salut,

 

Incearca si varianta aceasta, am modificat comportamentul LED-ului sa corespunda cu ce doresti.

 

Ce trebuie sa stii este:

- programul se asteapta ca in mod default (cand nu se detecteaza nimic), starea celor doi senzori ai tai sa fie in HIGH. La fiecare detectie obiect, starea trece in LOW pe semnalul atasat (BUTON_A sau BUTON_B).

- in momentul in care programul detecteaza ca un senzor este activ (este in LOW) atunci LED-ul se aprinde. LED-ul este stins doar atunci atunci cand nici-un senzor nu detecteaza nimic, cu alte cuvinte obiectul de pe banda este in afara senzorilor deci a trecut.

- numaratoarea pe LCD se va incrementa (decrementa) doar cand mai intai senzorii trec prin toate cele 4 combinatii si senzorii ajung ambii din nou in HIGH (inactiv) deci obiectul a trecut. Cu alte cuvinte, daca obiectul se opreste pe banda din ce stie ce motive, pana nu trece complet nu se incrementeaza pe LCD numarul (sau decrementeaza functie din ce directie vine).

 

In simularea Proteus 7.10 am simulat si un encoder. Il pornesti din switch-ul care cupleaza generatorul de semnal 1Hz. Sensul il schimbi din switch-ul dublu.

// Functia de citire a encoderului este inspirata din solutia BUXTRONICS pentru ARDUINO#define R_CW_FINAL   0x1#define R_CW_BEGIN   0x2#define R_CW_NEXT    0x3#define R_CCW_BEGIN  0x4#define R_CCW_FINAL  0x5#define R_CCW_NEXT   0x6// No complete step yet.#define DIR_NONE     0x0// Clockwise step.#define DIR_CW       0x10// Anti-clockwise step.#define DIR_CCW      0x20#define R_START      0x0#define LOW     0#define HIGH    1#define BUTON_A   RA2_bit         // aici voi citi valoarea "butonului -"#define BUTON_B   RA3_bit         // aici voi citi valoarea "butonului +"#define LED       RA0_bit         // aici este LED-ul#define BACKLIGHT   RA1_bit       // aici se leaga BACKLIGHT-ul (iesirea pentru BL)// Lcd pinout/*  PIN LCD     PIN uC  D7          RB7  D6          RB6  D5          RB5  D4          RB4  EN          RB3  RS          RB2*/sbit LCD_RS at RB1_bit;sbit LCD_EN at RB2_bit;sbit LCD_D7 at RB7_bit;sbit LCD_D6 at RB6_bit;sbit LCD_D5 at RB5_bit;sbit LCD_D4 at RB4_bit;// Directie pini Lcdsbit LCD_RS_Direction at TRISB1_bit;sbit LCD_EN_Direction at TRISB2_bit;sbit LCD_D7_Direction at TRISB7_bit;sbit LCD_D6_Direction at TRISB6_bit;sbit LCD_D5_Direction at TRISB5_bit;sbit LCD_D4_Direction at TRISB4_bit;char init_text[] = "Initializare";char txt[] = "Contor: ";char str[3];                            // string care va stoca valoarea contoruluibit bl;                                 // tine minte starea backlight-uluivolatile char pin_A, pin_B;             // variabile pentru stocare stare butoane encoder (senzori)unsigned short counter;                 // contorul care este afisat pe ecranunsigned short old_state_bl;            // stocare stare anterioara buton BLunsigned char state;                    // variabila care memoreaza starea// tabela de stari posibileconst unsigned char ttable[7][4] =  {    // R_START    {R_START,    R_CW_BEGIN,  R_CCW_BEGIN, R_START},    // R_CW_FINAL    {R_CW_NEXT,  R_START,     R_CW_FINAL,  R_START | DIR_CW},    // R_CW_BEGIN    {R_CW_NEXT,  R_CW_BEGIN,  R_START,     R_START},    // R_CW_NEXT    {R_CW_NEXT,  R_CW_BEGIN,  R_CW_FINAL,  R_START},    // R_CCW_BEGIN    {R_CCW_NEXT, R_START,     R_CCW_BEGIN, R_START},    // R_CCW_FINAL    {R_CCW_NEXT, R_CCW_FINAL, R_START,     R_START | DIR_CCW},    // R_CCW_NEXT    {R_CCW_NEXT, R_CCW_FINAL, R_CCW_BEGIN, R_START},  };// functia de citire a encoderului, interpretare directie si debounceunsigned char process() {  volatile unsigned char pinstate;    pin_A = BUTON_A;  pin_B = BUTON_B;  // Obtine starea pinilor de intrare, a butoanelor  pinstate = ((pin_A << 1) | pin_B);  // Determina noua stare functie de pini si de tabela de stari  state = ttable[state & 0xf][pinstate];  if (pin_A == 1 && pin_B == 1) {   // daca Buton A este HIGH SI Buton B este HIGH in aceasi timp     LED = 0;                 // atunci stinge LED-ul  }  else { // altfel, daca si numai unul din butoane este LOW, adica oricare senzor detecteaza ceva     LED = 1;                    // atunci aprinde LED-ul  }  // Intoarce evenimentul generat  return state & 0x30;}void init() {     VREN_bit = 0;                      // Dezactivare Voltage Ref     CMCON = 7;                         // Dezactivare comparatoare     TRISA0_bit = 0;                    // Setare RA0 ca iesire; aici este LED-ul     TRISA1_bit = 0;                    // Setare RA1 ca iesire; aici este BACKLIGHT-ul     LED = LOW;                         // Setare LOW a celor iesirii LED     BACKLIGHT = HIGH;                  // Backlight-ul este default ON asa ca il facem HIGH// Setare RA2, RA3, RA4 ca intrari, aici sunt butoanele     TRISA2_bit = 1;                    // butonul PLUS     TRISA3_bit = 1;                    // butonul MINUS     TRISA4_bit = 1;                    // butonul pentru control BACKLIGHT     TRISB3_bit = 0;                    // Setare RB3 ca si OUTPUT (pentru PWM)     Lcd_Init();                        // Initializare LCD     PWM1_Init(2000);                   // Initializare PWM cu frecventa de 3KHz     PWM1_Set_Duty(128);                // Factor umplere 50% la iesirea PWM (pin RB3)     Lcd_Cmd(_LCD_CLEAR);               // Clear display     Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off     bl = 1;     state = R_START;}void main() {     init();  //apelare functia INIT     Lcd_Out(1, 1, init_text);     /* Cat timp nici-unul din butoane nu este apasat,        programul sta si asteapta apasarea unui buton.        In acest timp, pe ecran este afisat: "Initializare"     */     while (Button(&PORTA, 2, 10, 1) && Button(&PORTA, 3, 10, 1)) {        if (Button(&PORTA, 4, 10, 1)) {             // Detect HIGH pe buton           old_state_BL = 1;                        // updateaza flag        }        if (old_state_BL && Button(&PORTA, 4, 10, 0)) {   // se detecteaza tranzitia de la buton liber la buton apasat           bl = ~bl;                                      // schimba starea backlight-ului           old_state_BL = 0;                              // updateaza flag-ul           BACKLIGHT = bl;        }     }     Lcd_Out(1,1,"                ");               // LCD clear. Se poate face si cu Lcd_Cmd dar parca este mai rapid asa     Lcd_Out(1,1, txt);                             // afisaj pe ecran defaultul de dupa initializare     Lcd_Out(1,12,"0");     while(1) {        int tmpdata;                                // variabila care contine date temporare        if (Button(&PORTA, 4, 10, 1)) {             // Detecteaza HIGH pe buton           old_state_BL = 1;                        // updateaza flag        }        if (old_state_BL && Button(&PORTA, 4, 10, 0)) {   // se detecteaza tranzitia de la buton liber la buton apasat           bl = ~bl;                 // schimba starea backlight-ului           old_state_BL = 0;         // updateaza flag-ul           RA1_bit = bl;        }        tmpdata = process();         // aici chem rutina de citire si interpretare a encoderului        if (tmpdata == DIR_CW) {     // daca directia este CW (clockwise) atunci process() intoarce 0x10  adica DIR_CW           if (counter == 100) {     // daca contorul este 100 atunci            counter = 100;           // ramane 100 indiferent cate pulsuri mai primeste            PWM1_start();            // face galagie in BUZZER pentru 150ms            delay_ms(150);            PWM1_stop();           }           else {                    // altfel            counter++;               // incrementam contorul           }           ByteToStr(counter, str); // convertim contorul din numar in string pentru a putea if afisat           Lcd_Out(1, 10, "   ");   // curatam ecranul de ce a fost anterior pe pozitiile unde se afiseaza contorul           Lcd_Out(1, 10, str);     // afisam valoarea contorului        }        if (tmpdata == DIR_CCW ) {   // daca directia este CCW (counter clockwise) atunci process() intoarce 0x20 adica DIR_CCW           if (counter == 0) {       // daca contorul este 0 atunci            counter = 0;             // ramane 0 indiferent cate pulsuri mai primeste            PWM1_start();            // face galagie in BUZZER  pt 150ms            delay_ms(150);            PWM1_stop();           }           else {            counter--;               // decrementeaza contorul cu o unitate           }           ByteToStr(counter, str); // convertim contorul din numar in string pentru a putea if afisat           Lcd_Out(1, 10, "   ");   // curatam ecranul de ce a fost anterior pe pozitiile unde se afiseaza contorul           Lcd_Out(1, 10, str);     // afisam valoarea contorului        }     }}

Aurelian77 v4.zip

Editat de mars01
Link spre comentariu
Vizitator aurelian77

V4 functioneaza bine cu senzori stie cand sa scada si cand sa creasca numai ca sa pierdut limitarea ledului rosu la "0" si cand ajunge la "100".

Cand pe afisor arata "0" senzorul A daca vede un obiect ar trebui sa nu se mai aprinda ledul rosu doar senzorul B cand vede un obiect va trebui sa lumineze ledul rosu si in cazul acesta pe ecran la trecerea totala de senzori a obiectului sa afiseze "1" fiind adunat.

Iar la afisarea numarului "100" Senzorul A daca ar vedea un obiect sa aprinda ledul rosu iar daca senzorul B va vedea primul sa nu aprinda ledul rosu. In caest caz la trecerea totala a obiectului din raza senzorilor pe ecran va arata numarul "99" fiind scazut

In cazul in care Senzorul A este cu decrementarea si Senzorul B este cu crementarea.

Acuma functioneaza dar nu mai limiteaza sensul obiectelor la "100" respectiv "0"

In integrat au mai ramas 3 pini liberi ma gandesc daca ar fi posibil a alimenta senzori din RA6 si RA7  sa fie RA6 in H doar daca pe afisor va indica mai mult decat "0" si RA7 in H doar daca pe afisor va arata mai putin de 100. In cazul acesta conectez senzori prin niste tranzistoare care vor fi comandate de RA6 si RA7 iar daca afisorul va arata "0" RA6 va fi in L si senzorul nu va mai primi curent si invers cand afisorul va arata "100" RA7 va fi in L iar senzorul care este alimentat din el vu va mai primi curent . in felul acesta scap de aprinderea ledului cand pe afisaj va arata dupa caz "0" sau "100" dar..... in cazul acesta nu mai poate numara deoarece un senzor va fi scos din circuit :((

Link spre comentariu

Incearca si varianta aceasta.

 

Are doar modificari minore, numai incarc topicul cu acelasi cod.

 

Am schimbat pozitia liniilor care controleaza LED-ul si le-am modificat in felul urmator.

 

Din:

if (pin_A == 1 && pin_B == 1) {   // daca Buton A este HIGH SI Buton B este HIGH in aceasi timp     LED = 0;                     // atunci stinge LED-ul}else { // altfel, daca si numai unul din butoane este LOW, adica oricare senzor detecteaza ceva     LED = 1;                     // atunci aprinde LED-ul} 

In:

if (pin_A == 1 && pin_B == 1) {   // daca Buton A este HIGH SI Buton B este HIGH in aceasi timp         LED = 0;                 // atunci stinge LED-ul           }else { // altfel, daca si numai unul din butoane este LOW, adica oricare senzor detecteaza ceva         if (pin_A == 0 && counter < 100) { // daca unul din senzori, pin_A este LOW, activ si counter-ul este <100,            LED = 1;                        // atunci aprinde LED-ul         }         else LED = 0;                      // altfel, counter-ul este 100 si LED-ul este stins         if (pin_B == 0 && counter > 0) {   // daca celelalt senzor, pin_B, este LOW (adica activ) si counter-ul este > 0,            LED = 1;                        // atunci aprinde LED-ul         }         else LED = 0;                      // altfel, counter-ul este 0 si LED-ul este stins     } 

Aurelian77 v4 - BIS.zip

Editat de mars01
Link spre comentariu
Vizitator aurelian77

Mersi o sa o incerc eu m-am gandit sa fac cu niste optocuploare si tranzistoare ca sa pot sa opresc trecerea dupa ce ajunge in "0" sau "100" din tr-un sens. Ar merge deoarece senzoru care va ramane activ cand ar vedea obiectul la scurt fimp va actiona si un optotriac care el va simula senzorul care va fi oprit si invers ele vor fi activate doar la afisarea "0" si respectiv "100" ce ar fi ar fi modificarea cablajului si punerea de noi componente pe cablaj deci in calcule as ajunge tot pe la 20 ron cat costa si 16f887 i/p numai ca am si acest integrat care lucreaza dar e cam pacat sa il tin doar pentru atata ma gandesc din el sa il conectez cu un bt-05 sau altceva cu functii mai complexe sa consum din el macar 75% din resursele oferite de fabrica producatoare si sa folosesc si pini lui 40 la numar mai mult de junatate :) 16f628a il am si observ ca hex-ul ocupa in jurul valorii de 70% si aproape tori pini sunt ocupati deci la pretu lui si la ceea ce face pana acuma eu zic ca este ok sa il las pe el. Placa de  cablaj nu este problema am una de 100*70mm si o folosesc toata in aceasta aplicatie deoarece se aseaza perfect in cutie si se poate prinde perfect de dispozitivele originale a cutiei fara a mai gauri eu cutia sau folosi solutii de lipit. Dar voi incerca si varianta aceasta oferita de tine deoarece pana acuma totu a fost pus exact cum ai gandit tu dispozitivul (ma refer la sursa si logica ei ) modul de a programa si vreau sa zic ca se misca extraordinar de bine. Cat amincercat sa il "pacalesc" nu amreusit ca am dat impulsurile foarte lente ca amlasat un oplict 30 minute apoi l-amtrecut el nu a dat eroare de adunare sau scadere sau la ledul rosu. Deci e super bine conceput.

Link spre comentariu

Stii, esti foarte tenace. Acest lucru este admirabil.

Eu am o gramada de proiecte incepute, toate foarte interesante dar ... adesea zic ca nu am timp sau mai stiu eu ce.

 

Nu te simti obligat sa implementezi solutia propusa de mine. Daca ai deja  ceva care merge atunci este perfect. Eu am postat aici mai mult didactic (cu tot cu greseli) si in speranta ca lumea va incepe sa posteze codul sursa si nu doar fisiere hex (ceea ce nu e un lucru rau per se, dar cred ca nu este suficient).

Editat de mars01
Link spre comentariu
Vizitator aurelian77

Ar fi foarte frumos ca lumea care stie sa pozteze ca tine.

Toate fisierele si in ce au fost facute fmos comentatee ca sa inteleaga si cei ca mine.

Asa cei care vor invata vor veni si ei cu solutii, coduri, proiecte wtc and vor reusi sa invete sau fiecare om va putea sa vina cu adaptari, modernizari, sau chiar formule noi care ar ocupa mai putin fila hex sau ar fi mai corecta facuta.

Dar de obicei si nu dau nume de forumuri unde amintrebat mi sa dat cateva "rezolvari"

Prina a fost un hex ceva de genul demo.(ce inteleg eu dintr-un hex cand eu sunt la inceput de drun?)

Alta solutie a fost "til fac eu cu 100 ron"iti dau hex-ul sau picu gata scris prin posta.( eu caut sa invat nu sa obtin un hex sau un pic scris deagata.)

Sau si mai delicat " Pai invata si tu cum am invatat si noi si vei reusi dupaia " Frumos asta si vreau sa fac sa invat dar......cun daca ei nu pun codul sursa? sau il pun fara a zice ce fac functiile ca sa ini dau si eu seama cum sta treaba?

Altii mi-au zis ca imi este lene si vreau altii sa munceasca pentru mine. Incorect inteles deoarece unde am postat am zis clar doresc cod sursa bine m-am exprimat toate fisierele si in ce au fost facute ca sa pot sa invat daca voiam cineva sa munceasca pentru mine eu ceream din prima doresc un hex sa faca.... si sa fie pentru pic16fxxx.La fel eu nu imi amintesc sa fi cerut asa ceva. Hex-ul il ai si asa moare cum a fost facut codul sursa il vezi inveti din el il modifici intelegi.

Ca eu doresc sa duc la bun sfarsit acest proiect este ca este primu meu proiect si odata ce il duc la bun sfarcit cu ajutorul unor oameni cum ar fi mars01,  thunderer, ETC invat si eu ceva bun si util fiind nou in acest minunat domeniu.

De unde sa stiu eu tot ce aflu de la cei voitori cum sta treaba cu programarea instalarea unui program apoi cum lucrez cu el cum programez cum setez cu osc intern sau osc extern cum activez sau dezactivez functia de RST MCR daca cineva nu imi si zice si da stiu este mult de scris dar cred ca nu doar eu citesc, caut, incerc sa invat cred ca ceea ce scrie un user la multi incepatori le va fi de folos informatiile care sunt postate. Si aici multi cam zic "Ce interes am eu sa invat pe altul ceea ce stiu eu" sau " De ce sa stie altul asa usor sa se chinuie ca mine sa faca o scoala in domeniu o facultate, etc" sau " Moaca eu nu invat " Ei bine eu de meserie sunt zugrav. Explic invat arat la cei care doresc mici secrete " pentru ei mari pentru mine banale uneori" este domeniul meu fireste datorita anilor sa obtin experenta si sa stiu totul sau aproape totul in aceasta meserie nu este fara secrete sau nu este usor cum cred multi oameni odata ce nu respecti  pasii vei vedea ca varul infloreste sau raman brazde etc aici este mod de preparare si tratare a peretelui, temperaturi de lucru, timpi de executare etc nu intru in amanunte ca nu isi au locul aici pe forum dar sunt multe " secrete " ca si in acest minunat domeniu pe care incepatorii nu au de unde sa le si stie.

Cu platitul informatiilor sunt perfect deacord. Uni oameni stiu foarte bine stapanesc domeniul foarte precis fiind la o facultate de asa ceva sau fiind chiar munca lor si nu au bani "cine oare are bani cat ar dori sa aiba?" dar ei prin stiinta lor o inpartasesc si la alti oameni care doresc sa invete iar ei pot sa fie rasplatiti cu componente, pic-uri, alte informatii, sau chiar si bani pentru bunavointa lor si darnicia de a ajuta invata si pe altii. Tot timpul exista formula compensarii " legea compensari" daca nu de la cel care i-ai daruit informatiile atunci vei primi de la altcineva. Si eu in domeniul meu ajut pe oameni care intradevar au nevoie de ajutor si nu numai cu informatii uneori chiar si cu lucrarea facuta si fara a le cere nimica la unele cazuri doar bani pe materiale la alte cazuri cum s-ar zice vin eu cu bani de acasa deoarece nu iau nici macar bani pe materiale " cazur rare si doar la batrani care intradevar nu au deunde " si nu-s miliardar sau milionar doar traiesc ca dumneavoastra intr-o socetate care asa este ea uni cu posibilitati prea mari si nepasatori, alti mediocri, alti lasati de ijbeliste la batranete. Tot timpul eu am avut parte de "legea compensari". La cei cu vile marete si care au bani sa intoarca cu lopata am luat fireste mai mult decat eau de obicei la cei fara posibilitati am pus de la mine si defapt de la cei bogati care au fost tarifati mai mult decat iau de obicei. Temporizatoare si alte chestii gasite pe net le-am facut si pe mine ma ajuta. De ex: tun banal temporizator l-am facut si cu el programez malaxarea materialulu si in timpul ala fac altceva. :) Din nefericire eu inca nu am reusit sa fac ceva eu singur dar sper, si cred ca in viitorul apropiat voi reusi sa imi fac si eu o automatizare singur. De fapt asta este visul meu sa pot singur sa fac lucruri minunate care sa imi usureze munca mea si nu numai a mea.

Link spre comentariu

M-am conversat pe PM cu @aurelian77 si de fapt ultima versiune de soft nu face ce vrea el, ba mai mult strica.

Este vorba de LED-ul rosu care trebuie sa se activeze doar cand se face numarare (intre 0 si 100) dar sa tina cont si de directia din care vine obiectul de numarat.

 

Am refacut sectiunea de aprins a LED-ului. @aurelian77 verifica daca aceasta versiune corespunde cu ce ai tu nevoie.

Din:

if (pin_A == 1 && pin_B == 1) {   // daca Buton A este HIGH SI Buton B este HIGH in aceasi timp         LED = 0;                 // atunci stinge LED-ul           }else { // altfel, daca si numai unul din butoane este LOW, adica oricare senzor detecteaza ceva         if (pin_A == 0 && counter < 100) { // daca unul din senzori, pin_A este LOW, activ si counter-ul este <100,            LED = 1;                        // atunci aprinde LED-ul         }         else LED = 0;                      // altfel, counter-ul este 100 si LED-ul este stins         if (pin_B == 0 && counter > 0) {   // daca celelalt senzor, pin_B, este LOW (adica activ) si counter-ul este > 0,            LED = 1;                        // atunci aprinde LED-ul         }         else LED = 0;                      // altfel, counter-ul este 0 si LED-ul este stins     } 

s-a transformat in:

/* In sectiunea urmatoare ma asigur ca daca variabila contor, care este si afisata pe LCD, a ajuns la limite LED-ul va fi fortat in starea OFF, stins.Probabil ca puteam condensa codul de mai jos in cateva linii dar e bine si asa.*/           if (pin_A == 1 && pin_B == 1) {                // daca Buton A este HIGH SI Buton B este HIGH in aceasi timp              LED = 0;                                    // atunci stinge LED-ul}else {        /* Daca contorul este mai mare ca 0 si mai mic ca 100 deci in intervalul de numarare sau daca acum contorul este 0 dar anterior a fost 1 (deci a scazut de la 1 la 0) sau daca contorul este acum 100 dar anterior a fost 99 (deci a crescut de la 99 la 100) atunci aprinde LED-ul. A trebuit sa aplic artificiul cu ultima stare pentru ca sa aprinda LED-ul si in timpul numararii cand contorul este 0 sau cand este 100. Tineti cont ca pentru fiecare numarare este presupusa detectia a 4 stari ale Butoanelor (00, 10, 11, 01) unde 0 apare cand senzorul detecteaza ceva si 1 cand senzorul nu detecteaza.        */        if ((counter > 0 && counter < 100) || (counter == 0 && old_counter == 1) || (counter == 100 && old_counter == 99))  {                    LED = 1;        }        else {                    LED = 0;        }    }old_counter = counter;   // tinem minte valoarea contorului pentru iteratia viitoare

Aurelian77 v5.zip

Editat de mars01
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