zvonacfirst Posted June 5, 2022 Share Posted June 5, 2022 Va salut. Vreau sa folosesc intr-un proiect un modul potentiometru digital X9C103. Ma tot chinui cu sketch-ul si nu ii dau de cap la partea de store wiper position. M-am inspirat din datasheet pag. 7, tabelul din dreapta sus si am testat tot felul de succesiuni ale comenzilor. In rest totul este ok, pot folosi UP si DOWN pentru a misca cursorul virtual, dar nu ii pot memora pozitia. Daca vine cineva cu o idee il rog sa nu fie timid. Multumesc. Codul este urmatorul: const int UP_ButtonPin = A0; const int DOWN_ButtonPin = 12; const int CS_ButtonPin = 13; int UP_ButtonState = 0; int DOWN_ButtonState = 0; int CS_ButtonState = 0; const int INC_OutPin = 10; const int UD_OutPin = 11; const int CS_OutPin = 9; int loop_cnt = 0; void setup() { pinMode(UP_ButtonPin, INPUT_PULLUP); pinMode(DOWN_ButtonPin, INPUT_PULLUP); pinMode(CS_ButtonPin, INPUT_PULLUP); pinMode(INC_OutPin, OUTPUT); pinMode(UD_OutPin, OUTPUT); pinMode(CS_OutPin, OUTPUT); digitalWrite(INC_OutPin, HIGH); digitalWrite(UD_OutPin, HIGH); digitalWrite(CS_OutPin, LOW); } const int loopPeriod = 50; void loop() { loop_cnt = loop_cnt + 1; //Read the level of Up/Down/CS button UP_ButtonState = digitalRead(UP_ButtonPin); DOWN_ButtonState = digitalRead(DOWN_ButtonPin); CS_ButtonState = digitalRead(CS_ButtonPin); //Check if Up/Down/CS Button is Pressed //When Button is Pressed, Level becomes LOW if (CS_ButtonState == LOW) { digitalWrite(INC_OutPin, HIGH); delay(loopPeriod); digitalWrite(CS_OutPin, HIGH); delay(loopPeriod); digitalWrite(CS_OutPin, LOW); delay(loopPeriod); } else { delay(loopPeriod*3); } if (UP_ButtonState == LOW) { digitalWrite(UD_OutPin, HIGH); delay(loopPeriod); digitalWrite(INC_OutPin, LOW); delay(loopPeriod); digitalWrite(INC_OutPin, HIGH); delay(loopPeriod); } else if (DOWN_ButtonState == LOW) { digitalWrite(UD_OutPin, LOW); delay(loopPeriod); digitalWrite(INC_OutPin, LOW); delay(loopPeriod); digitalWrite(INC_OutPin, HIGH); delay(loopPeriod); } else { delay(loopPeriod*3); } } Link to comment
Mircea Posted June 5, 2022 Share Posted June 5, 2022 (edited) Multumesc pentru link la datasheet, e o practica buna cand ceri ajutor. Pe mai multe pagini zice: The current counter value is stored in non-volatile memory when CS is returned HIGH while the INC input is also HIGH. Nu ai pus schema, insa cred ca toate butoanele sunt in "1" (vad PULLUP) cand sunt neapasate. Deci, odata CS revenit in "1", iar INC deja in "1" atunci se salveaza automat. Edited June 5, 2022 by Mircea Link to comment
zvonacfirst Posted June 5, 2022 Author Share Posted June 5, 2022 (edited) Multumesc @Mircea Butoanele sunt HIGH si devin LOW cand sunt apasate. Se vede asta din sketch. Pe pinul INC am deja HIGH cand apas butonul pentru memorare iar pinul CS devine HIGH, am verificat asta masurand. Tensiunea pe pinul CS poate fi intre -1V si +7V. Ar trebui sa memoreze. De ce nu se intampla? Schema nu cred ca este relevanta, trei butoane si trei iesiri care duc la modulul potentiometrului nu spun mare lucru. Daca a utilizat cineva un asemenea modul si are sketch-ul disponibil, sunt dispus sa testez si acel sketch. Edited June 5, 2022 by zvonacfirst Link to comment
Bandi Szasz Posted June 5, 2022 Share Posted June 5, 2022 (edited) Nu am folosit personal X9C103 dar daca folosesti arduino de ce nu folosesti o librarie gata facuta ? Cam asta e singurul avantaj a lui "arduino" fata de alte platforme (PIC de exemplu) ca nu trebuie sa iti bati capu prea mult cu datasheet-uri ca gasesti librarii gata facute, pentru X9C103 il ai pe acesta de exemplu: https://github.com/RobTillaart/X9C10X Edited June 5, 2022 by Bandi Szasz Link to comment
Bandi Szasz Posted June 5, 2022 Share Posted June 5, 2022 (edited) P.S Daca alimentarea este acelasi cea ca ma gandesc ca este, incearca sa pui un mic delay la inceputul metodei de setup(). Poate nu apuca X9C103 sa porneasca calumea si il deranjeaza ceva cand setezi pinii HIGH/LOW si nu apuca sa seteze corect valoarea defapt salvata. Edited June 5, 2022 by Bandi Szasz Link to comment
zvonacfirst Posted June 5, 2022 Author Share Posted June 5, 2022 (edited) Acum 1 oră, Bandi Szasz a spus: gasesti librarii gata facute Nu corespund nevoilor mele. Am tot cautat. Exista o solutie pe care am gasit-o pe net si am testat-o pe breadboard: se pune un buton intre +5V si pinul CS al potului digital, cu o rezistenta catre GND. Adica nu se mai trece prin Arduino. Asa merge. Dar am cablajul deja facut si nu as vrea sa-l macelaresc. 1 oră în urmă, Bandi Szasz a spus: Poate nu apuca X9C103 sa porneasca Din moment de functiile UP si DOWN functioneaza inseamna ca a pornit. Edited June 5, 2022 by zvonacfirst Link to comment
Guest Posted June 5, 2022 Share Posted June 5, 2022 Din ce citesc la pagina 6, adica: "The device is selected when the CS input is LOW. The current counter value is stored in non-volatile memory when CS is returned HIGH while the INC input is also HIGH" inteleg ca "store" se face automat la o utilizare normala a pontentiometrului (adica CS HIGH/LOW/HIGH/LOW ...) Dar intr-adevar trebuie sa: "CS Deselect Time (STORE) Min 20ms" Link to comment
zvonacfirst Posted June 5, 2022 Author Share Posted June 5, 2022 Eu inteleg ca CS trebuie sa fie LOW pentru ca sa functioneze,. Daca pinul CS este pe HIGH nu mai regleaza. Si este normal deoarece ar trebui sa intre in secventa de memorare. Pinul INC este deja in HIGH dar la apasarea butonului mai este o linie care il pune in HIGH, asta preventiv. Apoi urmeaza linia care pune CS in HIGH, ceea ce corespunde cerintei. Apoi CS este trecut in LOW ca sa deblocheze reglarea potului. Delayul este de 50ms dupa fiecare linie. Link to comment
Guest Posted June 5, 2022 Share Posted June 5, 2022 (edited) Nu cred ca ai inteles bine. CS se pune in LOW cand vrei sa trimiti ceva la potentiometru. Dupa ce faci asta pui CS = HIGH. Daca vrei ca datele trimise de tine sa fie si memorate, lasi timp 20 ms potentiometrului sa faca asta si abia apoi faci CS = HIGH. Si trebuie sa te gaseasca si cu INC = HIGH daca vrei sa memoreze ultimile valori. Nu este o facilitate speciala. Nu trebuie sa pui nimic la pornire, in setup(). Simplu, nu ? Acum 40 minute, zvonacfirst a spus: Exista o solutie pe care am gasit-o pe net si am testat-o pe breadboard: se pune un buton intre +5V si pinul CS al potului digital, cu o rezistenta catre GND. Tare gluma Edited June 5, 2022 by Guest Link to comment
Mircea Posted June 5, 2022 Share Posted June 5, 2022 (edited) Alex, ce inteleg eu de acolo: CS este tinut in 0 cat te joci cu INC. Dupa ce INC trece in 1, adica ai apasat si relaxat butonul, CS trebuie adus in 1 dupa tIC care este minim 1us, dar tinut in 1 minim tCPH = 20ms. Asa arata in AC timing diagram. Edited June 5, 2022 by Mircea Link to comment
zvonacfirst Posted June 5, 2022 Author Share Posted June 5, 2022 Acum 24 minute, Liviu.Mihaiu a spus: Tare gluma Nu este nicio gluma. Am testat asta si merge. Numai ca eu vreau sa pun si o telecomanda. @Mircea, asa inteleg si eu. CS este in 0 pentru a putea utiliza INC. Apoi CS se pune in 1 si INC tot 1 pentru memorare. Apoi CS se pune din nou in zero. Iar delayul de 50ms cred ca este suficient. Am pus si delay de 100 si tot nu merge. Link to comment
Guest Posted June 5, 2022 Share Posted June 5, 2022 Te rog sa incerci cum ti-am spus. Renunta la rutina aia cu: if (CS_ButtonState == LOW) Si incepe rutinele care trateaza Up/Down cu CS=LOW. Si termina-le cu CS=HIGH. Teoretic cam asa se face. Nu prea ai debounce la butoane. Dar sunt suficiente delay in program. Acum 4 ore, zvonacfirst a spus: digitalWrite(INC_OutPin, HIGH); digitalWrite(UD_OutPin, HIGH); digitalWrite(CS_OutPin, LOW); Iar din in setup sterge asta. si pune CS=HIGH Link to comment
zvonacfirst Posted June 5, 2022 Author Share Posted June 5, 2022 (edited) @Liviu.Mihaiu, asta inseamna ca butonul pentru memorare devine de prisos. Cum zici tu inseamna ca se face memorarea la finalul fiecarei rutine UP sau DOWN. Am sa incerc maine sa vad ce si cum. Acum 15 minute, Liviu.Mihaiu a spus: Dar sunt suficiente delay in program. Acele delay sunt necesare pentru a da ragaz potentiometrului digital sa "isi revina" dupa fiecare comanda. Acum 15 minute, Liviu.Mihaiu a spus: Iar din in setup sterge asta. si pune CS=HIGH Adica se le pun pe toate trei HIGH. Ar avea o logica. Cat sunt in repaos sunt toate pe HIGH. La apasarea unui buton rutina nicepe cu CS=LOW si se termina cu CS=HIGH pentru a memora pozitia cursorului. Asta daca am inteles bine. Edited June 5, 2022 by zvonacfirst Link to comment
zvonacfirst Posted June 5, 2022 Author Share Posted June 5, 2022 Cam asa? const int UP_ButtonPin = A0; const int DOWN_ButtonPin = 12; //const int CS_ButtonPin = 13; int UP_ButtonState = 0; int DOWN_ButtonState = 0; //int CS_ButtonState = 0; const int INC_OutPin = 10; const int UD_OutPin = 11; const int CS_OutPin = 9; int loop_cnt = 0; void setup() { pinMode(UP_ButtonPin, INPUT_PULLUP); pinMode(DOWN_ButtonPin, INPUT_PULLUP); // pinMode(CS_ButtonPin, INPUT_PULLUP); pinMode(INC_OutPin, OUTPUT); pinMode(UD_OutPin, OUTPUT); pinMode(CS_OutPin, OUTPUT); digitalWrite(INC_OutPin, HIGH); digitalWrite(UD_OutPin, HIGH); digitalWrite(CS_OutPin, HIGH); } const int loopPeriod = 50; void loop() { loop_cnt = loop_cnt + 1; //Read the level of Up/Down/CS button UP_ButtonState = digitalRead(UP_ButtonPin); DOWN_ButtonState = digitalRead(DOWN_ButtonPin); // CS_ButtonState = digitalRead(CS_ButtonPin); //Check if Up/Down/CS Button is Pressed //When Button is Pressed, Level becomes LOW /* if (CS_ButtonState == LOW) { digitalWrite(INC_OutPin, HIGH); delay(loopPeriod); digitalWrite(CS_OutPin, HIGH); delay(loopPeriod); digitalWrite(CS_OutPin, LOW); delay(loopPeriod); } else { delay(loopPeriod*3); } */ if (UP_ButtonState == LOW) { digitalWrite(CS_OutPin, LOW); delay(loopPeriod); digitalWrite(UD_OutPin, HIGH); delay(loopPeriod); digitalWrite(INC_OutPin, LOW); delay(loopPeriod); digitalWrite(INC_OutPin, HIGH); delay(loopPeriod); digitalWrite(CS_OutPin, HIGH); delay(loopPeriod); } else if (DOWN_ButtonState == LOW) { digitalWrite(CS_OutPin, LOW); delay(loopPeriod); digitalWrite(UD_OutPin, LOW); delay(loopPeriod); digitalWrite(INC_OutPin, LOW); delay(loopPeriod); digitalWrite(INC_OutPin, HIGH); delay(loopPeriod); digitalWrite(CS_OutPin, HIGH); delay(loopPeriod); } else { delay(loopPeriod*3); } } Totusi ce nu inteleg este de ce la memorare nu functioneaza schema dintabelul de la pagina 7 din datasheet. La UP si DOWN functioneaza dar la memorare nu. Link to comment
Mircea Posted June 5, 2022 Share Posted June 5, 2022 Poate e vremea sa lasi balta programul scris si sa scrii unul de test. Nu o bucla, ci o simpla rulare care sa faca un INC de 10 ori sa zicem. Nu folosesc <> ca sa comentez. Toate iesirile sunt in HIGH. 1. digitalWrite(CS_OutPin, LOW); delay de 1us sa zicem sau 1-2 cicluri de ceas, nu e nevoie de ms; 2. excludem U/D caci vrem sa incrementam, si e deja HIGH. 3. Repeti de 10 ori LOW/HIGH pentru INC. digitalWrite(INC_OutPin, LOW); delay de 1us sa zicem sau 1-2 cicluri de ceas, nu e nevoie de ms; digitalWrite(INC_OutPin, HIGH); delay de 1us sa zicem sau 1-2 cicluri de ceas, nu e nevoie de ms; 4. digitalWrite(CS_OutPin, HIGH); delay(50); Nu e diferit de ce ai scris tu ca secventa, doar timpii sunt diferiti. Nu depinzi de butoane externe, nu ai probleme de debounce. Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now