nickrvl Postat August 17, 2015 Partajează Postat August 17, 2015 I-am dat de cap, cu toate ca Bascom accepta linii de comanda succesive pe acelas rind despartite de ":" uite ca cea ce vreau eu nu accepta !? de aici a fost problema acum functioneaza "reglementar" cu rezistentele interne activate si butoane direct catre masa: Config Portd.3 = InputConfig Portd.4 = InputPortd.3 = 1Portd.4 = 1But1 Alias Pind.3But2 Alias Pind.4Dim Valoare As WordValoare = 100DoIf But1 = 0 Then Incr Valoare Gosub Salt End IfIf But2 = 0 Then Decr Valoare Gosub Salt End IfLoopSalt:Locate 1 , 1Lcd "Valoare" ; " = " ; Valoare ; " "Waitms 250Return "Nico" a functionat si varianta cu "Debounce" insa cu doua mentiuni, functia nu o pot conditiona intr-o singura line ca "If" adica "daca apas buton1 creste valoarea cu o unitate" dupa care sare la afisaj si in plus pe afisaj se vedea doar cind era butonul apasat (alta ciudatenie) in momentul in care il eliberam diparea afisajul, momentan sint multumit.... Link spre comentariu
nickrvl Postat August 17, 2015 Partajează Postat August 17, 2015 (editat) Adevarat......, insa din nou dilema, aici functioneaza corect asa "amestecat": Do If Enca = 0 ThenIncr ValoareIf Valoare > 150 Then Decr ValoareDo : If Enca = 1 And Encb = 1 Then Goto Salt : LoopEnd If If Encb = 0 ThenDecr ValoareIf Valoare < 5 Then Incr ValoareDo : If Enca = 1 And Encb = 1 Then Goto Salt : LoopEnd IfLoop Daca tot o dadui in butoane ma joc si cu un encoder..... Editat August 17, 2015 de nickrvl Link spre comentariu
Liviu M Postat August 17, 2015 Partajează Postat August 17, 2015 Daca te referi la linia: Do : If Enca = 1 And Encb = 1 Then Goto Salt : Loop nu cred ca e aceeasi situatie. Pentru Do If Enca = 1 And Encb = 1 Then Goto Salt e o singura instructiune. Link spre comentariu
nico_2010 Postat August 18, 2015 Partajează Postat August 18, 2015 "Nico" a functionat si varianta cu "Debounce" insa cu doua mentiuni, functia nu o pot conditiona intr-o singura line ca "If" adica "daca apas buton1 creste valoarea cu o unitate" dupa care sare la afisaj si in plus pe afisaj se vedea doar cind era butonul apasat (alta ciudatenie) in momentul in care il eliberam diparea afisajul, momentan sint multumit.... De ce nu folosesti tu functia ENCODER ? Functioneaza cu "Debounce" insa subrutina "salt" nu prea are ce incrementa/decrementa in forma initiala propusa de tine. cam asa ar trebui sa arate programelul tau: $regfile = "m8def.dat"Config Debounce = 30 Config Lcd = 16 * 2Config Lcdpin = Pin , Db7 = Portb.7 , Db6 = Portb.6 , Db5 = Portb.5 , Db4 = Portb.4 , E = Portb.3 , Rs = Portb.0Cursor OffClsConfig Portd.3 = InputConfig Portd.4 = InputPortd.3 = 1 ' nu setate pe 0 logicPortd.4 = 1But1 Alias Pind.3But2 Alias Pind.4Dim Valoare As Word, old_value as wordValoare = 100old_value=0Do'If But1 = 0 Then Incr Valoare : Gosub Salt'If But2 = 0 Then Decr Valoare : Gosub SaltDebounce But1 , 0 , up 'Debounce But2 , 0 , down if old_value<> value thenLocate 1 , 1Lcd "Valoare" ; " = " ; Valoare ; " "old_value=valueend ifLoopEndup:incr valoareif value>300 then value=300 'numarul 300 a fost ales arbitrarreturndown:decr valueif value<0 the value = 0return Link spre comentariu
nickrvl Postat August 18, 2015 Partajează Postat August 18, 2015 (editat) Mi-am dat seama ca se poate si cu "Debounce" insa parca tot varianta cu "If" i-mi suride deoarece e o modalitate simpla si "cunoscuta", parerea mea, si pe deasupra a iesit si un pic mai mic programul: $regfile = "m8def.dat"Config Lcd = 16 * 2Config Lcdpin = Pin , Db7 = Portb.7 , Db6 = Portb.6 , Db5 = Portb.5 , Db4 = Portb.4 , E = Portb.3 , Rs = Portb.0Cursor OffClsConfig Portd.3 = InputConfig Portd.4 = InputPortd.3 = 1Portd.4 = 1But1 Alias Pind.3But2 Alias Pind.4Dim Valoare As WordValoare = 100DoIf But1 = 0 Then Incr Valoare Gosub Salt End IfIf But2 = 0 Then Decr Valoare Gosub Salt End IfLoopSalt:Locate 1 , 1Lcd "Valoare" ; " = " ; Valoare ; " "Waitms 350ReturnEnd Functia "Encoder" nu o suport....., adica nu face ce cred eu ca ar trebuii....., succesiunea logica preferata de mine e urmatoarea: $regfile = "m8def.dat"Config Lcd = 16 * 2Config Lcdpin = Pin , Db7 = Portb.7 , Db6 = Portb.6 , Db5 = Portb.5 , Db4 = Portb.4 , E = Portb.3 , Rs = Portb.0Cursor OffClsConfig Portd.6 = InputConfig Portd.7 = InputPortd.6 = 1Portd.7 = 1Enca Alias Pind.6Encb Alias Pind.7Dim Valoare As WordValoare = 100Inceput:Do : If Enca = 1 And Encb = 1 Then Exit Do : LoopDo If Enca = 0 ThenIncr ValoareIf Valoare > 150 Then Decr ValoareDo : If Enca = 1 And Encb = 1 Then Goto Salt : LoopEnd If If Encb = 0 ThenDecr ValoareIf Valoare < 5 Then Incr ValoareDo : If Enca = 1 And Encb = 1 Then Goto Salt : LoopEnd IfLoopSalt:Locate 1 , 1Lcd "Valoare" ; " = " ; Valoare ; " "Goto InceputEnd deoarece: - daca intimplator encoderul se "intepeneste" intr-o pozitie (1 logic) atunci "valoare" creste sau descreste incontrolabil pina la capat daca nu se schimba pozitia encoderului. -daca se roteste ecoderul rapid sau foarte rapid "valoare" i-si va modifica valoarea strict in directia care este rotit (chiar daca rar sau incet), altfel la "turatii mari" (sic ) "valoare" i-si modifica valoarea aleatoriu dupa cum e prins pe pozitie encoderul de viteza de reactie a mc-ului. Astfel rutina e conditionata doar de viteza mc-ului sau mai bine spus de intirzierea ce o produce afisarea...., altfel ar functiona fara repros, asa cum e si la 8Mhz ai lui Atmega + intirzierea pomenita e Ok, l-as fi vrut mai rapid totusi mai ales la rotatii rapide dar asta e, e bine si asa. Oare cu digiti/leduri o fi mai rapid? e buna intrebarea, acum mi-a venit...! si cred ca da dar mi-e lene sa schimb configurarea placii de probe, ramine de probat in viitor..... Editat August 18, 2015 de nickrvl Link spre comentariu
nico_2010 Postat August 19, 2015 Partajează Postat August 19, 2015 Ce fel de encoder folosesti? In alta ordine de idei, logica folosita de tine pentru citirea encoderului este gresita. Pentru documentare, arunca un ochi aici: http://www.qsl.net/pa3ckr/bascom%20and%20avr/encoders/. Link spre comentariu
Liviu M Postat August 19, 2015 Partajează Postat August 19, 2015 De acord cu Nico, la un encoder se interpreteaza schimbarile de stare, nu starile "statice". Link spre comentariu
nickrvl Postat August 19, 2015 Partajează Postat August 19, 2015 (editat) Encoderul este mecanic, nu-i mai am/retin modelul/tipul insa in "pauze" are contactele NO iar in lucru contactele NC se succed in functie de sens rotatie, adica unul clasic zic eu. Il am conectat conform schitei de mai jos: In aceasta configuratie am incercat si functia "Encoder" despre care spun ca nu ma multumit exact conform Help. Momenten nu prea inteleg cum e cu citirea starilor, incerc in functie de timp sa ma documentez. Cum am eu se citeste care contact/pin sa inchis (astfel dindu-se sensul si incrementeaza) si asteapta pina ce se deschid ambele contacte altfel nu merge mai departe ("protectie" pentru a nu incrementa pina la "maxim" daca are contact imperfect), mai e inca o line de program pe care am introdus-o deoarece o lua razna la rotatii mari/rapide. Daca spuneti ca e gresit inseamna ca asa este insa momentan nu inteleg ce...... Editat August 19, 2015 de nickrvl Link spre comentariu
nico_2010 Postat August 19, 2015 Partajează Postat August 19, 2015 Reprezentarea encoderului este corecta, abordarea software este gresita. Cele doua contacte se inchid si se deschid in quadratura (decalat cu 90 de grade). Succesiunea starilor logice la rotirea in sensul acelor de ceasornic este 00->01->11->10, iar la rotirea in sens invers este: 10->11->01->00. Aceste valori pot fi folosite pentru stabilirea sensului de rotatie, utilizand o intrerupere sau interogarea schimbarii frontului de tensiune. Link spre comentariu
nickrvl Postat August 19, 2015 Partajează Postat August 19, 2015 (editat) De aceasta succesiune tine cont si programelul meu, aceasta succesiune 00->01->11->10 este "ideala" sau teoretica pentru ca in practica contactele mecanice dau rateuri la doi trei pasi ai encoderului imposibil sa nu dea comanda falsa si de aici incepe "aiureala", programelul meu e "super" comparativ cu functia "Encoder" din Help, vorbesc de Help-ul din Bascomul meu, exemplul/linkul de mai sus vad are alta abordare, o sa vad daca e vorba despre altceva saptamina aceasta in functie de timp.... Sau de fapt vrei sa spui ca este musai sa am la pinii mc-ului 1 logic (+5 V) atunci cind sind contactele facute? cum am eu am 1 logic in pauza si 0 logic cind sint contactele facute. Editat August 19, 2015 de nickrvl Link spre comentariu
nico_2010 Postat August 19, 2015 Partajează Postat August 19, 2015 De aceasta succesiune tine cont si programelul meu, aceasta succesiune 00->01->11->10 este "ideala" sau teoretica pentru ca in practica contactele mecanice dau rateuri la doi trei pasi ai encoderului imposibil sa nu dea comanda falsa si de aici incepe "aiureala", programelul meu e "super" comparativ cu functia "Encoder" din Help, vorbesc de Help-ul din Bascomul meu, exemplul/linkul de mai sus vad are alta abordare, o sa vad daca e vorba despre altceva saptamina aceasta in functie de timp.... Sau de fapt vrei sa spui ca este musai sa am la pinii mc-ului 1 logic (+5 V) atunci cind sind contactele facute? cum am eu am 1 logic in pauza si 0 logic cind sint contactele facute. Succesiunea nu este "teoretica" ci este reala. In practica, ignorand fenomenul de vibratii mecanice ce insoteste stabilirea/ruperea unui contact, vor apare acele "aiureli" de care vorbesti tu. Tot in realitate (si in practica) citirea starii unui contact se face de cel putin 2 ori: prima data pentru stabilirea faptului ca, prin actionarea contactului, pinul la care este conectat si-a schimbat nivelul logic si a doua oara - dupa un timp scurt - pentru a se stabili daca noul nivel logic este mentinut. Asa se implementeaza functia "debounce". Programelul tau ignora tocmai aceasta functie. Dintre programele (ca "e" mai multe) prezentate in link al doilea si al treilea merita atentia de a fi studiate. Referitor la ultima ta afirmatie, nu am spus asa ceva. Uite un alt exemplu de implementare a encoderului: http://dl6gl.de/software/drehencoder-mit-bascom sau http://rn-wissen.de/wiki/index.php?title=Drehencoder (foloseste Google translate) Link spre comentariu
nickrvl Postat August 19, 2015 Partajează Postat August 19, 2015 Succesiunea nu este "teoretica" ci este reala. In practica, ignorand fenomenul de vibratii mecanice ce insoteste stabilirea/ruperea unui contact....... Ba succesiunea "este pur teoretica" tocmai pentru ca "in practica" se intimpla acea vibratie mecanica si o da peste cap, sint cu encoderul in mina si sub nici o forma impulsurile nu se succed ordonat conform teoriei, sint abateri grave de la oridinea succesiunii, am doua encodere ambele noi primul este mai ferm si momentan l-am considerat nesigur/neprecis, l-am pus pe al doilea care este mai "moale" acesta este un dezastru total lucreaza mai prost, l-am schimbat cu primul...... Referitor la ultima ta afirmatie, nu am spus asa ceva. Pai nu era o afirmatie cu sensul de acuzatie, era o intrebare in idea ca poate i-mi scapa ceva in nivelul logic al pinilor..... Am incercat citeva programele din exemple si nu ma incinta nici unul, de fapt nu i-mi ies...., singurul care "misca" este acesta: $regfile = "m8def.dat"$crystal = 4000000 ' used crystal frequency$baud = 19200 ' use baud rate$hwstack = 32 ' default use 32 for the hardware stack$swstack = 10 ' default use 10 for the SW stack$framesize = 40 ' default use 40 for the frame spaceConfig Lcd = 16 * 2Config Lcdpin = Pin , Db7 = Portb.7 , Db6 = Portb.6 , Db5 = Portb.5 , Db4 = Portb.4 , E = Portb.3 , Rs = Portb.0Cursor OffClsDim B As ByteDim Valoare As WordValoare = 100Config Portd.6 = InputConfig Portd.7 = InputPortd.6 = 1Portd.7 = 1Do B = Encoder(pind.6 , Pind.7 , Links , Rechts , 1) ' ^--- 1 means wait for change which blocks programflow ' ^--------^---------- labels which are called ' ^-------^---------------------------- port PINs' Print BWaitms 10LoopEndLinks:Locate 1 , 1Lcd "left " ; B ; " "Decr ValoareLocate 2 , 1 : Lcd Valoare ; " "ReturnRechts:Locate 1 , 1Lcd "right " ; B ; " "Incr ValoareLocate 2 , 1 : Lcd Valoare ; " "ReturnEnd dar cu rezultate mediocre. Pina acum tot programelul meu e mai bun, daca e cineva cu un exemplu concret mai bun poate inteleg si eu "cum si ce" altfel merg inainte cu ce am.... Link spre comentariu
nico_2010 Postat August 20, 2015 Partajează Postat August 20, 2015 "Ba succesiunea "este pur teoretica" tocmai pentru ca "in practica" se intimpla acea vibratie mecanica si o da peste cap, sint cu encoderul in mina si sub nici o forma impulsurile nu se succed ordonat conform teoriei, sint abateri grave de la oridinea succesiunii, am doua encodere ambele noi primul este mai ferm si momentan l-am considerat nesigur/neprecis, l-am pus pe al doilea care este mai "moale" acesta este un dezastru total lucreaza mai prost, l-am schimbat cu primul......" Nu, succesiunea este cea reala. Ai incercat sa pui condensatori de 10n intre pinii encoderului si masa? Pana la urma care sunt cele doua tipuri de encodere pe care le ai? Foto. LE: Toate programele indicate prin link-urile postate au fost testate personal si functioneaza chiar la viteze de rotire relativ obisnuite pentru mana umana. LLE: Atentie: encoderele rotative (mecanice) sunt de diferite tipuri. Unele dau un impuls per detenta, altele dau 2 impusuri per detenta, iar altele dau 4 impulsuri per detenta. Mai exista si pseudoencodere care contin 2 contacte, normal deschise, si ,functie de sensul de rotatie, se vor obtine impusuri doar pe unul din pini. Link spre comentariu
nickrvl Postat August 20, 2015 Partajează Postat August 20, 2015 Acestea sint encoderele pe care le-am reverificat azi, in gol/pauza contacte NO, in timpul rotirii cu un pas se inchid respectiv deschid pe rind contactele pina ajunge iarasi in pauza, locul unde sta mecanic pe loc, se simte si se aude un tacanit. Are si condensatori pe contacte, se vad in poza. Ordinea de inchidere e simbolizata mai jos, de aici am plecat cu "logica" pentru programul facut. - pasul 0 este considerat pauza/in gol, ambele contacte deschise ambii pini ai Mc-ului au 1 logic, bucla Do...Loop unde se asteapta inchiderea unui contact care da sensul rotatiei. - pasul 1, contactul A inchis, PIND.6 = 0 logic, incrementeaza Valoare, intra in alta bucla Do...Loop pentru a evita vibratiile mecanice/intreruperile mecanice (cea care rupe logica, acea succesiune logica) unde asteapta pasul 4, toate contactele deschise. -pasul 4, toate contactele deschise, iese din a doua bucla Do...Loop, sare la afisare valori, sare la inceput unde este a trei bucla Do...Loop unde ramine pina ce toate contactele sint deschise, aceasta este necesara la rotatii rapide unde foarte des Mc-ul surprinde encoderul in pozitia in care celalalt contact este inchis si astfel decrementeaza valoarea, cu aceasta ultima linie de comanda am reusit sa-i fac "miscarea" lina. Singurul inconvenient al acestei solutii e faptul ca daca encoderul este tinut fortat cu un contact inchis programul nu mai executa nimic altceva de acea tind sa inteleg si sa concep o alta rutina cu Timer in care citirea sa se faca la anumite intervale eventual intreruperi astfel sa mai poata fi rulat si "altceva" in caz de blocaj mecanic insa de la a vrea pina la a face e mult, timpul ma omoara..... Din pacate doar azi mai pot experimenta de miine o saptamina nu sint prin zona, eventual mai pot doar scrie cite ceva..... Link spre comentariu
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum