Sari la conținut
ELFORUM - Forumul electronistilor

Ajutor 15F628A C++


Vizitator aurelian77

Postări Recomandate

 

M-am conversat pe PM cu @aurelian77 

 

Am mai renuntat eu *) la urmarit niste topicuri din cauza ca aveau intorsaturi ciudate. Nu-i cazul aici, mars01 a clarificat lucrurile, da' tot mi se pare aiurea procedeul. In general refuz sa discut pe privat ceva ce se potriveste mai bine pe public (de altfel l-am si trimis pe aurelian77 pe public cand mi-a trimis mesaje private referitoare la problema asta).

 

*) Nu c-ar avea vreo importanta.

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

Eu am discutat mai multe aspecte pe privat si a aparut si problema aceasta. A clarificat-o acolo si numai acest aspect a fost discutat acolo. A fost o remarca ca asa cum am facut in penultima varianta, nu mai mergea deloc sincronizarea intre butoane si LED, cel putin nu asa cum intentiona el si a explicat public.

In rest totul este public.

 

Liviu, am aceasi parere. Suntem pe un forum si e bine ca toata lumea sa beneficieze atat de partile bune cat si din partile gresite. Cand vezi ceva gresit, stii ce nu trebuie sa faci asa ca este tot instructiv.

De altfel tocmai am rugat un coleg sa deschida un topic nou pentru o alta aplicatie de care are nevoie.

Link spre comentariu
Vizitator aurelian77

Am verificat v5 si intradevar ledul rosu nu se mai aprinde cand ajunge la valoarea 100 si  0 dar el trebuia sa se aprinda cand senzorul de scadere vedea un obstacol in caz ccand pe afisor arata valoarea maxima adica 100..... ma exprim gresit dar eu cred ca tot nu merge facut din program fara a se aduce niste optocuploare care sa dea tensiune pe senzori adica sa ii conditioneze.

De fapt corec ar fi :

Sa presupunem ca avem o usa de acces fiind blocata cu ledul rosu.

In incapere trebuie sa intre masim 100 de oameni.

Senzori sunt montatiunul pe o parte a usi si altul pe partea cealalta

afisorul arata la inceput valoarea 0 deci daca un om va fi in incapere nu va putea iesi deoarece senzorul din interior avand valoarea pe afisor o nu va mai actiona ledul rosu care sa zicem ca este un sistem de blocare a usi.

Dar daca un om va veni din exterior si va vrea sa intre senzorul din exterior va lumina ledul rosu usa se va deblocaomul va putea sa treaca in partea ailalta cand senzorul nu il mai vede usa se va bloca si ca arata pe afisor 1. Adica a intrat o persoana.

Cand vor intra 100 de persoane senzorul din exterior nu va mai lumina ledul rosu usa va ramane blocata si el nu va putea intra dar daca cineva din interior va vrea sa iasa senzorul din interior il va vedea va lumina ledul rosu usa se va debloca iar el dupa ce va iesi si nu va mai fi vazut de senzori il va scadea .

orice numar intre 1 si 99 ambi senzori vor actiona ledul si va debloca usa 

Din soft se zic ca nu merge fara optocuploare deoarece este functia de ecoder adica el stie sa numere sau sa scada sub formula 00 modul de asteptare 10 vede un obiect lumineaza ledul usa se deblocheaza 11 si celalalt senzorr il vede 01 primu senzor nu il mai vede 00 usa se blocheaza si obiectul este numarat un ciclu complet odata ce la 0 sau la 100 un senzor dupa caz nu ar trebui sa lumineze ledul si sa actioneze deschiderea usi atunci formula de ecoder ar fi nula adica ar trebui sa plece 0, 1 , 0, 0 Dar daca pe 2 pini montam 2 optocuploare care ele sa stie de senzorul 1 si senzorul 2 sa le dea tensiune atunci ar merge in program am zice cand valoarea este mai mica sau egala cu "0" pinu care tine optocuplu de la senzorul 1 sa fie in "L" alta valoare pana la 100 si mai departe sa fie in "h" iar pinul care este optocuplul care tine senzorul 2 el sa fie tinut in "h" la oricare valoare intr "0" si "99" dar cand se va afisa valoarea "100" el sa fie pus in logic "L".

Acuma ar sti sa faca ceea ce  trebuie numai ca la fiecare senzor va mai pleca cate un optocuplor care el va simula senzorul oprit si in cazul aceste daca primul senzor ar fi oprit din exterior nu ar mai putea intra nimeni dar din exterior da fiind valoarea "100" iar optocuplu de la senzorul 1 in "L" daca din interior iese cinecva senzorul din interior il vede fiind in "h" adica cu alimentare cand il vede da impluls la led ledul se aprinde un optocuplu va simula senzorul s1 se face formula 01, 11(facuta de optocuplu), 01,  00 si asa va intra si celalalt senzor in normal cu "h" la optocuplu si tensiune pe el.

In v5 totul este ok dar pana cand intra 100 de oameni ei nu vor mai putea iesi sau de fatp de cand este pus in functiune fiind usa inchisa nimeni nu poate sa intre senzori nu vor aprinde ledul.

Mai pe inteles cred ca ar fi sa presupunem ca sistemul va fi conectat cu un interfon de bloc nu chiar interfon doar cu yala unui interfon 1 senzor este afara unul in interiorul scarii cand ajung 100 de locatari oameni, obiecte etc in interior din exterior sa nu se mai poata intra dar din interior sa se poata iesi daca este la 0 sa nu se poata iesi din interior soar sa se poata intra din exterior.

"AM PUS CU INTERFON SI OAMENI CA EXEMPLU DEOARECE FIRESTE DACA TOTI CEI 100 DE OAMENI IES CE ROST AR MAI AVEA SA SE BLOCGEZE DIN INTERIOR SPRE EXTERIOR CA NU AR MAI FI NICI UN OM DAR EU NU DORESC SA IL FOLOSESC LA EX. DAT ESTE PE O BANDA DECI PE BANDA SUNT SI N STANGA SI IN DREAPTA 100 SAU MII DE OHIECTE.IAR BANDA POATE SA SE PLIMBE IN AMBELE SENSURI DEPINDE DE CULOARE OBIECTE DE ALTA CULOARE BANDA SE VA INVARTI INVERS SI ELE VOR FI DATE AFARA DE PE IA SI IAR ISI VASCHIMBA SENSUL DECI SE NUMARA DIN 1000 OBIECTE COLORATE DOAR 100 OBIECTE COLORATE CARE SUNT SI SORTATE RESUL SE VOR SCADE AUTOMAT DE LA MERSUL BENZII SI FUNCTIA DE ECODER"

Link spre comentariu
Vizitator aurelian77

Discutia daca se tine pe privat sau direct aici tot aia ar fi.

Daca era inca un user care sa vina cu o inbunatatire sau o ideie automat ca nu era frumos sa purtam discutii pe privat dar daca doar un user face modificari la ceea ce face el nu vad de ce ar trebui sa vorbim aici cand nu este si a 3 a persoana implicata e ca si cum am vorbi tot ca pe un privat :)) Discutie publica dar intre 2 persoane :)) Si daca este privata tot intre cele doua persoane nu vad pe cine ar afecta deoarece participanti nu prea sunt..... O sa pun si eu versiunea mea facuta in Pascal cel vechi. Pun codul sursa complet poate un user ar fi interesat sa invete functia adc_red cum l-am facut  eu numai ca este in pascal si am folosit pic 16f887 I/P ca acesta se rgaseste in Help.Simularea in proteus si tot codul + schema si PCB gata de printat o sa vorbesc cu mars01 poate le pune el sau imi zice cum se pot pune. Aici se pare ca doar un om stie ceva si doreste sa isi arate adevarata valoare care nu ma indoiesc ca o are este un om de valoare foarte rar se poate gasi asa ceva in zilele acestea sau poate la Romani. 

P.S.

Proiectul este doar didactic si se admite a se posta surse in orice program  nu musai Pascal sau C++ iar cei care sunt "meseriasii" ar putea sa isi arate valoarea venind cu o optimizare formule mai bune inbunatatiri etc ca asa isi arata ei valoarea de meseriasi.

Odata ce proiectul este functional nu ma cred ca ar face ceva pentru cineva gratis daca aduc la sursa o modificare care arata ca acelsi lucru se poate face cu jumatate de memorie si avantaje la cod modificat cum ar fi se misca mai repede sau alte avantaje foarte marunte si neinsemnate pentru proiect dar didactic ar avea valoare foarte mare in realizarea unor alte proiecte care intradevar suntem limitati de memorie etc.

Deci la ora asta nimeni nu face nimica pentru nimeni ci doar dovedim ca se poate face cu formule mai simple poate ocupa o capacitate mai mica etc adica aratam meseria din noi in cazul asta toti avem de invatat de la fiecare eu cred ca de la toti momentan doar de la o persoana si a mai fost una pe la inceput care ii multumesc si ei am inteles cum sta treaba cu librariile valabila pentru Pascal , C++ si Basic.

Si in domeniu asta fascinant sunt chiar prost dar macar doresc sa invat "nimeni nu sa nascut invatat" sau poate ma insel eu!Iar toti am primit ajutor la inceput cu toate ca la uni nu ne place sa recunoastem dar asta e la mintea cocosului.

Revin imediat si cu sursa completa functionala poate unora o sa le fie de folos macar fragmente de cod daca nu toata.

Link spre comentariu
Vizitator aurelian77
    // initializarea variabilelorvar buton, buton1, buton2 : word; //v ariabilele pentru butoaneCO,nrproduse: byte;text: array[16] of char; // afisor 16 caractere se trece 20 daca are 20 de caractereprocedure testare;   begin    buton1 := Adc_Read(0);     //buton 1 este citirea ADC-ului                               // ADC = analog to digital convertor                               // butonul citeste valoarea analogica a semnalului, o trasforma in digital intre                               // valoarea 0 si 1024;    delay_ms(300);    buton2 := Adc_Read(0);      // citeste al doilea buton    if buton1=buton2   then co:=1;  //  daca but 1 egal cu but 2 CO=1    if (buton1<>buton2)then co:=2;   //  daca but 1 diferit de but 2 CO=2    case co of               //  implementyarea cazurilor    1:    begin       PORTD:=0;    end;    2:    begin    buton := Adc_Read(0);    if ((buton >= 1) and (buton <= 400))//intre 1 si 400 va incrementa (aduna)    then    begin    Lcd_Out(1, 1, ' NR. PRODUSE: :');    Lcd_Out(2, 1, 'INTRA Nr.:');    nrproduse:=nrproduse+1;// functia de adunare sau incrementare mai corect    if nrproduse > 9 then //     begin     PORTC:=4;     Lcd_Cmd(Lcd_Clear);     nrproduse:=10;// am limitat la 10 si nu am mai trecut 100 datorita faptului de simulare in proteus se poate pune cat se doreste de ex 888     Lcd_Out(1, 1, ' MOMENTAN SUNT'); /// va afica vand va ajunge numararea la valoarea declarata in cauzul de fata 10     Lcd_Out(2, 1, ' MAXIM PRODUSE ');    PORTD:=0;    end    else    begin    PORTD:=1;    PORTC:=0;    delay_ms(100);    end;    end;   if ((buton >= 400) and (buton <= 600))   //Intre valoarea 400 si 600 blocheaza senzorul si afiseaza "GABARIT DEPASIT"    then    begin     Lcd_Out(1, 1, '     ATENTIE    ');   // se monteaza senzor ultrasunete pentru a limita inaltimea     Lcd_Out(2, 1, 'GABARIT DEPASIT ');  //  La afisare ledul nu va mai da impuls    PORTD:=0;    PORTC:=0;     end;   if ((buton >= 900) and (buton <= 1024))   // daca este intre 900 si 1024      //se trece pe manual cititorul de culoare va functiona continu   //iar s1 si s2 nu vor mai functiona    then    repeat    begin        buton := Adc_Read(0);     Lcd_Out(1, 1, '     TRECERE    ');// primul rand     Lcd_Out(2, 1, '     MANUAL     ');// al doilea rand DACA SE DORESTE SA APARA DE EX:1 LA MIJLOCUL AFISAJULUI PE RANDUL 2 SE SCRIE   Lcd_Out(2, 8, '1');    PORTD:=1;     end;     until  (buton <= 899) ;    if ((buton >600) and (buton <= 900))    then    begin      PORTC:=0;      if nrproduse <=1 then    begin     Lcd_Out(1, 1, ' Nu sunt produse  ');        PORTC:=1;        nrproduse:=0;    end    else    begin    Lcd_Out(1, 1, 'DE PE BANDA :');    Lcd_Out(2, 1, 'IESE PRODUS     ');    nrproduse:=nrproduse-1;    PORTD:=1;    delay_ms(100);    end;    end;    end;  end;end;     // program principalbegin  ADCON1 := $80; // Configure intrarile analogica ca punct de referinta in Vdd  TRISA  := 255;     // PORTA intrare    (tris reprezinta initializarea porturilor in iesire sau intrare)  TRISD  := 0; //portulD = iesire  Lcd_Init(PORTD);             // Initialize LCD on PORTD  Lcd_Cmd(LCD_CURSOR_OFF);     // Turn off cursor  Lcd_Cmd(Lcd_Clear);          // stergere informatii LCD  //O ideie mai buna de stergere afisaj vazuta la mars01 nu am gasit in Help '                '  16 spatii daca lcd este de 16 daca este de 20 se pun 20 de spatii  TRISC := 0;           // declarare port C ca iesire  PORTC := 0;          // Initialize PORTC  Lcd_Out(1, 1, 'NR PRODUSE:');    // afisare pe display la linia 1 , coloana 1 textul: nr produse  nrproduse:=0;     // initializarea nr masinilor in o  repeat            //   repetare procedura    begin    testare;          //sare la procedura testeaza    ByteToStr(nrproduse, text);      // transforma variabila de tip byte in variabila tip text pt                                   // a putea fi afisata pe display    Lcd_Out(1, 14, text);        // printeaza pe lcd la randul 1 coloana 14 numzrul masinilor    end;   until (1=0);     // pana cand 1=0( la nesfarsit)end.     //sfarsit program

Asta este versiunea 2 nu este final deoarece mai lucrez la ia adaugand noi functi senzori si butoane o sa ii implementez si o interfata cu telefonul  prin BT-05 eventual o iesire pe un roter cu un ESP pentru cules de date statistici etc si un cantar care va selecta si dupa greutate am mai luat si 3 module vocale care va anunta vocal evenimentele ete in lucru deoarece acuma am trecut sa invat C++ o sa o fac de la capat in C++ poate altfel pe schema mai am si 2 motoorase care ridica un senzor in sus pentru a nu vedea obiectul si il cogoara dupa trecerea lui initial asa am gandito atunci dar acum am atasat optocuploare care incgide semnalul unui senzor la trecerea unui obiect vazut de primul senzor si invers .

Am pus mai multe infornatii si urmeaza sa pun mai multe culese de la senzorul de culoare si cel de greutate + gabarit depasit care vor fi  transnise si stocate pe un servar local sau un sdcard (mai trebuie sa ma documentez toti senzori ii pun RF 433Mhz cod fix  mai precis de la cutie nu va veni nici un fir totul va fi pe 433Mhz BT Wlan in cutie va avea si un clot de sdcard si mai cumpar si un modul GSM 900 sa fac o comunicare si GSM prin comenzi sms cu confirmari. 

Multe nu isi au rostul dar doar asa invat cel mai bine in viitor LCD-ul va fi unu grafic apoi Grafic color si in final si cu comenzi tactile dar in functie de cat de repede invat programarea si cum voi cumpara modulele ca sa le testez fizic 

In proteus totul este ok ce mai are MCR activ si butn de Reset OSC intern cu posibilitatea de a putea folosi pini ca I/O dar o sa il trec pe OSC extern 

Aici totul se da si se cere didactic care dupa cum se vede nu isi au rostul toate dar interesul este sa pot sa asimilez functii si cum se aplica corect pentru noi proiecte.

TIN SA MULTUMESC CELOR CARE AU PARTICIPAT LA ACEST TOPIC DIN PRIMA GRESIT DAR MIE MI-AU DAT CURAJ SI AMBITIE DE A TRECE LA CUCRURI MAI COMPLICATE SI ATRACTIVE SUNT OAMENI SPECIALI SI CU VALOARE EI INCURAJEAZA UN NCEPATOR CHIAR DACA EL PUNE INTREBARI TAMPITE E LA INCEPUT DE DRUM MAI CA NU STIE NIMICA DEBUSOLAT DEOARECE NU ESTE PE UN PROGRAM ANUME OBOSIT EU AM PRINS PESTE 24 ORE NEDORMITE DAND JOS DE PE NET EXEMPLE PDF-URI AM INTRAT PE PAGINA PIC CA SA INTELEG MAI BINE SCHEMA BLOC SI LOGICA A PICULUI IN HELP ETC AUTONAT SA SCRIU SI TAMENII CAND OBOSEALA ISI ZICE CUVANTUL DAR ALTFEL EU NU POT AVANSA TREBUIE SA FAC EFORT SI SA REUSSC SA INTELEG LOGIC TOATE FUNCTIILE.

Voi posta si sursa noua mai ordonata si fireste mai frunos comentata ca la mars01 care este un exemplu a facut tot codul in 5 versiuni pana acuma si sincer pe privat nu i-am zis ca am reusit sa fac in Pascal ce dorem deci el se putea ofensa de cate ori a fost intors si chiar sa creada ca cineva are chefde glume proaste pe timpu lui liber sau putea sa zica de ce sa fac eu treaba unui om toata dar aici este valoarea el nu a considerat ca imi face mie aparatul ci a facut un lucru cap caoda dupa cum am reusit sa ma fac inteles doar de dragul de a invata si altii frumos cu simulare cu cod sursa hata facut si hex-ul adica tot si nu o data pana acuma de 6 ori frumos si explicat ca asa arunca in scarda un hex si gata ial ardei in pic si fati treaba ce ai vrut aia ai primit si din hex ce intelegeam ? eu sau altul ?

In modul cel mai sincer i-am si zis ca de la el nu ma asteptam de atata ajutor si informati pretioasa. Foarte rar dar exista si oameni care sunt intradevar de valoare si darnici cu stiinta.

Editat de aurelian77
Link spre comentariu
Vizitator aurelian77

Codul sursa un pic mai asezat

// initializarea variabilelorvar buton, buton1, buton2 : word; //v ariabilele pentru butoaneCO,nrobiecte: byte;text: array[16] of char;procedure testare;   begin    buton1 := Adc_Read(0);     //buton 1 este citirea ADC-ului                               // ADC = analog to digital convertor                               // butonul citeste valoarea analogica a semnalului, o trasforma in digital intre                               // valoarea 0 si 1024;    delay_ms(300);    buton2 := Adc_Read(0);      // citeste al doilea buton    if buton1=buton2   then co:=1;  //  daca but 1 egal cu but 2 CO=1    if (buton1<>buton2)then co:=2;   //  daca but 1 diferit de but 2 CO=2    case co of               //  implementyarea cazurilor    1:    begin       PORTD:=0;    ///Lcd_Out(2, 1,'Asteapta');    end;    2:    begin    buton := Adc_Read(0);    if ((buton >= 1) and (buton <= 400))    then    begin    Lcd_Out(1, 1, ' PE BANDA :');    Lcd_Out(2, 1, 'INTRA OBIECT');    nrobiecte:=nrobiecte +1;    if nrobiecte > 9 then    begin     PORTC:=4;     Lcd_Cmd(Lcd_Clear);     nrobiecte:=10;     Lcd_Out(1, 1, '        MOMENTAN     ');     Lcd_Out(2, 1, ' OBIECTE MAXIME ');    PORTD:=0;    end    else    begin    PORTD:=1;    PORTC:=0;    delay_ms(100);    end;    end;   if ((buton >= 400) and (buton <= 600))    then    begin     Lcd_Out(1, 1, '     ATENTIE    ');     Lcd_Out(2, 1, 'GABARIT DEPASIT ');    PORTD:=0;    PORTC:=0;     end;   if ((buton >= 900) and (buton <= 1024))    then    repeat    begin        buton := Adc_Read(0);     Lcd_Out(1, 1, '     TRECERE    ');     Lcd_Out(2, 1, '     MANUAL    ');    PORTD:=1;     end;     until  (buton <= 899) ;    if ((buton >600) and (buton <= 900))    then    begin      PORTC:=0;      if nrobiecte <=1 then    begin     Lcd_Out(1, 1, '    0 OBIECTE    ');        PORTC:=1;        nrobiecte:=0;    end    else    begin    Lcd_Out(1, 1, 'DE PE BANDA:');    Lcd_Out(2, 1, 'IESE OBIECT     ');    nrobiecte:= nrobiecte -1;    PORTD:=1;    delay_ms(100);    end;    end;    end;  end;end;     // program principalbegin  ADCON1 := $80;                    // Configure intrarile analogica ca punct de referinta in Vdd  TRISA  := 255;                    // PORTA intrare    (tris reprezinta initializarea porturilor in iesire sau intrare)  TRISD  := 0;                      //portulD = iesire  Lcd_Init(PORTD);             // Initialize LCD on PORTD  Lcd_Cmd(LCD_CURSOR_OFF);     // Turn off cursor  Lcd_Cmd(Lcd_Clear);          // stergere informatii LCD  TRISC := 0;           // declarare port C ca iesire  PORTC := 0;          // Initialize PORTC  Lcd_Out(1, 1, 'NR OBIECTE:');    // afisare pe display la linia 1 , coloana 1 textul: NR OBIECTE nrobiecte:=0;     // initializarea nr. obiecte  in o  repeat            //   repetare procedura    begin    testare;          //sare la procedura testeaza    ByteToStr(nrmasini, text);      // transforma variabila de tip byte in variabila tip text pt                                   // a putea fi afisata pe display    Lcd_Out(1, 14, text);        // printeaza pe LCD la randul 1 coloana 14 nr. obiectelor    end;   until (1=0);     // pana cand 1=0( la nesfarsit)end.
Link spre comentariu

Aurel eu m-am confuzat.

Sunt foarte multe elemente pe care le mentionezi si crede-ma mie personal, imi este greu sa inteleg ce doresti sa faci. Probabil nu ma duce capul, sunt prea multe nuante.

 

Ce am inteles eu si modul in care functioneaza programul acum, este:

 

Ai o banda rulanta care merge in ambele sensuri, Inainte si Revers.

 

Pe aceasta banda rulanta vor fi transportate obiecte a caror culoare va fi evaluata printr-un LED (ma rog LED-ul este simbolul pentru cititorul de culoare).

Pe banda rulanta avem doi senzori de pozitie plasati succesiv, unul dupa celalalt.

Ii botezam: Intrare si Iesire.

 

Atunci cand un obiect trece complet de cei doi senzori, acel obiect este numarat si contorul este afisat pe un afisaj LCD.

 

Avem un numar minim de obiecte ce vor fi contorizate, in cazul nostru '0' si un numar maxim de obiecte care vor fi contorizate, in cazul nostru '100'.

 

Bun.

 

Cazul A) Pornim banda rulanta. Sensul Inainte.

 

La un moment dat apare un obiect. La inceput nu este detectat de nici-un senzor. LED-ul este OFF. Este transportat mai departe. Este detectat mai intai de senzorul Intrare. In acest moment LED-ul este facut ON (era OFF anterior) daca si numai daca contorul afisat pe LCD este mai mic ca 100. Mai apoi este detectat si de senzorul Iesire (fiind in continuare detectat si de primul senzor). In cele din urma este detectat doar de senzorul Iesire, iar la final numai este detectat de nici-un senzor.  In acest moment si numai acum, contorul este incrementat cu 1 si este afisat pe LCD dar doar daca valoarea contor este mai mica decat 100. Tot acum, pentru ca nici-un senzor nu detecteaza un obiect, LED-ul este facut OFF.

 

Mergem mai departe, obiect dupa obiect este detectat si numarat, afisat numarul lor pe LCD. Ne apropiem de numarul maxim, am ajuns la numarul de obiecte detectate 99.

Apare pe banda si al 100 lea obiect. Trece de primul senzor (Intrare), se face ON la LED. Trece si de al 2 lea senzor (Iesire), intr-un final trece de ambii senzori si numai este detectat de nici-unul. In acest moment pe LCD apare numarul 100 iar LED-ul este facut OFF.

 

Dar hop ca apare si al 101 lea obiect pe banda transportoare. Este detectat de primul senzor (Intrare) dar acum fiindca am atins anterior cifra maxima de obiecte contorizate (adica 100) LED-ul numai este facut ON ci ramane in starea anterioara adica OFF. Trece si de al doilea senzor (Iesire) si ajunge in punctul unde numai este detectat de nici-un senzor. In acest moment ar fi trebuit sa fie incrementat contorul iar pe afisaj sa apara 101. Dar deoarece am atins maximul acest lucru nu se va mai intampla. Pentru nici-un eventual al 102 lea obiect si tot asa.

 

In acest moment sa zicem ca banda isi inverseaza sensul de deplasare. 

Ajungem la cazul B.

-----------------------------------------------------------------------------

 

Cazul B) Pornim banda rulanta. Sensul Revers.

 

La un moment dat apare un obiect. La inceput nu este detectat de nici-un senzor. LED-ul este in starea OFF. Obiectul avanseaza si atinge primul senzor care in acest caz este senzorul IesireLED-ul este facut ON daca si numai daca contorul de pe LCD este intre 1 si 100. (Daca valoarea contor afisata pe ecran este atunci LED-ul ramane OFF.) Obiectul atinge al doilea senzor, in acest caz este senzorul Intrare, eventual trece de ambii senzori si daca valoarea contor este diferita de 0 atunci valoarea contor va fi decrementata cu 1 si se va afisa pe LCD.

 

Trec obiectele, sunt numarate (decrementate) pana cand intr-un final apare obiectul cu numarul 0.

Trece de senzori, la primul senzor se aprinde LED-ul, cand trece de senzori se stinge LED-ul si valoarea contor afisata devine 0.

 

Dar sa zicem ca mai apare un obiect pe banda. Cand este detectat de primul senzor numai este aprins LED-ul pentru ca am atins limita inferioara anterior si nici numai este decrementat contorul afisat pe LCD atunci cand trece de ambii senzori.

------------------------------------------------------------------------------

Imi dau seama ca nu am tratat cazurile speciale cand banda isi schimba sensul in timp ce un obiect este detectat de unul sau de ambii senzori iar contorul este in unul din cazurile: contor = 0, contor = [1 ... 99] si contor = 100.

La acest lucru te referi cand spui ca programul nu face ce doresti?

 

LE: Cred ca se poate modifica tabela de stari a encoderului astfel incat sa detecteze o tranzitie la fiecare jumatate de ciclu encoder adica atunci cand se trece din 00 in 01 pentru sens CW si de la 00 la 10 pentru sens CCW (counter clockwise) unde 00, 01, 11, 10 sunt cele 4 stari ale encoderului (sau in cazul nostru al celor 2 senzori care joaca rolul encoderului).

Editat de mars01
Link spre comentariu
Vizitator aurelian77

Corect la mine in program este cu functia de adc_red altfel nu stiam sun sa o fac fiind nou 

Varianta de tine cu ecoder este mult mai fiabila si mult mai superioara fata de a mea 

La mine senzori erau montati pe motorase care doar 1 putea sa vada un obiect acum pe optocupluri care ii ia la unu alimentarea cand primu va vedea un obirct nu conteaza care este intrare sau iesire.

Ledul rosu (detector de culoare) se ocupa cu : cand un obiect pe banda ajunge la un senzor apoaratul deconecteaza celalalt senzor dar el este verificat de senzorul de culoare daca are de ex verde snzorul lasa banda sa ruleze mai departe daca nu va da invers sens deci obiectul nu va intra si aici el va fi inpins de pe banda odata "dat jos" de pe banda (dat jos nu va fi va fi preluat de alta banda si alt circuit idem il va verifica dupa alta culoare etc ca mai este inaltime, greutate , etc nu intru in amanunt aici) bamda isi va urma sensul de aducere obiecte si se va repeta in continuare pana cand banda va avea 100 intrari (dupa caz noi trecem 100 la mine in exemplu am pus doar 10 ca es facut cand il simulam in proteus) Nr este neglijabil deoarece nr. se pune in program poate fi si 5 .

In concluzie totu este in 3 benzi care sunt conectate intre ele si nuta obiectele catre senzori care verifica culoarea ele vor ajunge dupa caz in cutiuta unde le este locul cu nr care este trecut in program de aici va fi alte automatizari care vor pune capacel la recipient si vor aduce alt recipient si dau reset la montajul care deaja va fi la 100 lund de la capat operatia ... etc.

Eu am dat ex cu o camera si oameni ca mi sa parut a fi cel mai corect dat.

banda nu este din banda cauciucata ci din role una langa alta care ruleaza iar trecerea de poe o banda si alta se face tot cu niste role unde acolo va ajunge obiectele care nu au culaorea etc sa zicem parametri care stie senzori ca ar fi bune urmand fi verificate de alt sistem idem mai putin parametri de verificare fireste.

MCR-ul deaceea eu l-am lasat activ ca sa il pot folosi la rola care va aduce un alr trcipient si sa o ia de la capat.

Obiectul intrat trebuie sa fie si scazut daca nu este in paranetri dupa citirea lui (la senzori de culoare greutate, etc.

Partea cu ecoderul este super ca in proiect scap de nulte alte componente care sunt necesare dupa cum este facut de mine cum ar fi motorase prima data apoi optocuploare dispar deci este bine. Dezbaterea este aici doar strict legata de conditia de numarare si activarea ledului rosu. Restul fiind de la ledul rosu care comanda banda de la senzorul de greutate care nu este pomenit senzor gabarit depasit care ste cu mult inaintea numararii etc lucruri car nu afecteaza modulul acesta,

C a sa pot sa fiu eu multumit ce am stiut sa fac am facut dar ce versiune vine este foarte buna si utila mie in final eu cu experienta care ma ajutati sa o capat voi face programul final intr-un singur pic care sa faca tot si atunci voi fi multumit psihic ca de am invatat si am unit toat codurile intr-un singur MCR fireste iau doar variantele cele mai bune momentam mars01 ca de la alti nu am ce lua.

Finalul doresc sa il scriu eu cu functii si soluti date de useri dar sa il aranjez eu dupa cum invat intr-un singur PIC potent a tine taoate informatiile altfel nu as putea sa am satisfactie fara sa fac nimic eu. 

La trecera in alt PIC stiu destul de bine ca nu o sa copi simplu bucati din sursa ci voi aloca fiecare bucat cu alte date de ex schimbarea unui pin sau a portului si lucrul acesta este util mie ca capat experenta inteleg functii modul de aplicare migrarea unui cod la alt pic etc deci partea asta o sa i-mi bat eu capu cu ia ca sa i-mi fie bine :) lucru util pe vitor in alte programele.

P.S.

Fiecare care face ceva nu este multumit ca merge daca nu si stie modul de functionare si intelege cum a fost creiat

O virgula daca se pune intr-o sursa gata facuta si mai face ceva bun onu care a puso va fi foarte multumit deoarece a invatat ceva nou.

Ceva gata facut nu aduce multumire ci doar bucurie in exploatare.

Pentru curiosi 

Acest dispozitiv este noprofit daca lumea se gandeste la bani sau utilitate dar, nu se poate compara banii cu bucuria si cu inteligenta.

Bani au rostul lor iar creatia, bucuria, placerea, cunoasterea este altceva pt. mine mult mai mult decat bani 

Link spre comentariu
Vizitator aurelian77

Am rearanjat codul cu explicatii si am mai adaugat buzer in caz in care sunt "0" si iese 1 de pe banda "caz care sar datora unei erori" si in cazul in care 10 obiecte deaja au intrat in recipient "caz in care va suna buzerul si recipientul va fi inlocuit iar se va actiona RST-ul" codul fiind :

program 5;    // Initializarea variabilelorvar buton, buton1, buton2 : word;  // Variabilele pentru butoaneCO,nr: byte;text: array[16] of char;procedure testare;   begin    buton1 := Adc_Read(0);         // Buton 1 este citirea ADC-ului                                   // ADC = analog to digital convertor                                   // Butonul citeste valoarea analogica a semnalului, o trasforma in digital intre                                   // Valoarea 0 si 1024;    delay_ms(300);    buton2 := Adc_Read(0);         // Citeste al doilea buton    if buton1=buton2   then co:=1; // Daca but 1 egal cu but 2 CO=1    if (buton1<>buton2)then co:=2; // Daca but 1 diferit de but 2 CO=2    case co of                     // Implementyarea cazurilor    1:    begin       PORTD:=0;    // Lcd_Out(2, 1,'Asteapta');    end;    2:    begin    buton := Adc_Read(0);    if ((buton >= 1) and (buton <= 400)) // daca butonul are valoarea intre 1 si 400 inseamna ca este apasat butonul intra obiect    then    begin    Lcd_Out(1, 1, 'IN RECIPIENT:');      // Comanda Lcd_Out afiseaza pe display la linia x coloana y mesajul text""    Lcd_Out(2, 1, 'INTRA OBIECT');    nr:=nr+1;                            // Incrementeaza nr obiecte    if nr      > 10 then                 // Daca nr obiectelor > 10        begin     PORTC:=4;                           // aprinde led parcare plina     Lcd_Cmd(Lcd_Clear);                 // sterge LCD     nr:=10;     //Lcd_Out(1, 1, 'MOMENTAN SUNT');   // Comanda Lcd_Out afiseaza pe display la linia x coloana y mesajul text""     Lcd_Out(2, 1, ' MAXIM OBIECTE ');     PORTD:=0;     Sound_Play(1000, 2000);             // Porneste buzer    end    else    begin    PORTD:=1;    PORTC:=0;    delay_ms(100);    end;    end;   if ((buton >= 400) and (buton <= 600))    then    begin     Lcd_Out(1, 1, '     ATENTIE    ');     Lcd_Out(2, 1, 'GABARIT DEPASIT ');    PORTD:=0;    PORTC:=0;     end;   if ((buton >= 900) and (buton <= 1024))    then    repeat    begin        buton := Adc_Read(0);     Lcd_Out(1, 1, '       MOD      ');     Lcd_Out(2, 1, '      MANUAL    ');    PORTD:=1;     end;     until  (buton <= 899) ;    if ((buton >600) and (buton <= 900))    then    begin      PORTC:=0;      if nr <=1 then    begin     Lcd_Out(1, 1, ' BANDA LIBERA ');        PORTC:=1;        nr:=0;    Sound_Play(1000, 2000);               // Porneste buzer    end    else    begin    Lcd_Out(1, 1, 'DE PE BANDA :');    Lcd_Out(2, 1, 'IESE OBIECT     ');    nr:=nr-1;                            // scade nr obiecte    PORTD:=1;    delay_ms(100);    end;    end;    end;  end;end;     // Program principalbegin  ADCON1 := $80;                // Configure intrarile analogica ca punct de referinta in Vdd  TRISA  := 255;                // Portul A = intrare    (tris reprezinta initializarea porturilor in iesire sau intrare)  TRISD  := 0;                  // Portul D = iesire  Lcd_Init(PORTD);              // Initialize LCD on PORTD  Lcd_Cmd(LCD_CURSOR_OFF);      // Turn off cursor  Lcd_Cmd(Lcd_Clear);           // Stergere informatii LCD  Sound_Init(PORTD, 1);         // Initialize sound at RD1  TRISC := 0;                   // Declarare port C ca iesire  PORTC := 0;                   // Initialize PORTC  Lcd_Out(1, 1, 'NR OBIECTE:'); // Afisare pe display la linia 1 , coloana 1 textul: NR OBIECTE  nr      :=0;                 // Initializarea nr obiecte in o  repeat                       // Repetare procedura    begin    testare;                   // Sare la procedura testeaza    ByteToStr(nr, text);       // Transforma variabila de tip byte in variabila tip text pt                               // A putea fi afisata pe display    Lcd_Out(1, 14, text);      // Printeaza pe LCD la randul 1 coloana 14 numzrul obiectelor    end;   until (1=0);                // Pana cand 1=0( la nesfarsit)end.
Editat de aurelian77
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