mecaboy Postat Noiembrie 5, 2010 Partajează Postat Noiembrie 5, 2010 Buna seara.Am si eu o mica dilema,momentan am un lapsus si nu reusesc sa fac un selector.Trebuie sa fac un selector care sa contine un singur buton push si care la o apasare sa-mi treaca pe hight o iesire,inca o apasare-o alta iesire,etc.Folosesc arduino atmega 328,exemplu de cod as prefera sa fie in basic sau chiar pentru ARDUINO.Multumesc Link spre comentariu
Vizitator Postat Noiembrie 5, 2010 Partajează Postat Noiembrie 5, 2010 Buna seara.Am si eu o mica dilema,momentan am un lapsus si nu reusesc sa fac un selector.Trebuie sa fac un selector care sa contine un singur buton push si care la o apasare sa-mi treaca pe hight o iesire,inca o apasare-o alta iesire,etc. Folosesc arduino atmega 328,exemplu de cod as prefera sa fie in basic sau chiar pentru ARDUINO. Multumesc Vezi intai aici si apoi asta. Pe urma citeste a doua fraza pe care ai scris-o si zi ce-ai inteles. Mai departe incearca http://lmgtfy.com/?q=arduino+push+button+selector Daca tot n-ai gasit ce cautai inseamna ca trebuie sa incerci sa te descurci singur modificand exemplele de mai jos. Sunt lectii pentru citirea unui buton si rotirea unor LED-uri, cu tot cu cod si filme pe youtube: http://www.ladyada.net/learn/arduino/lesson5.html Link spre comentariu
mecaboy Postat Noiembrie 6, 2010 Autor Partajează Postat Noiembrie 6, 2010 Perfec,multumesc frumos.Dupa ce voi adapta softul,am sa revin cu codul aici...poate le va fi de ajutor si altora. Multumesc frumos ===EDIT=== Codul modificat pentru cerintele mele.Multumesc pentru ajutor int switchPin = 2; // switch is connected to pin 2int led1Pin = 12;int led2Pin = 11;int led3Pin = 10;int val; // variable for reading the pin statusint val2; // variable for reading the delayed statusint buttonState; // variable to hold the button stateint lightMode = 0; // What mode is the light in?void setup() { pinMode(switchPin, INPUT); // Set the switch pin as input pinMode(led1Pin, OUTPUT); pinMode(led2Pin, OUTPUT); pinMode(led3Pin, OUTPUT); }void loop(){ val = digitalRead(switchPin); // read input value and store it in val delay(10); // 10 milliseconds is a good amount of time val2 = digitalRead(switchPin); // read the input again to check for bounces if (val == val2) { // make sure we got 2 consistant readings! if (val != buttonState) { // the button state has changed! if (val == LOW) { // check if the button is pressed if (lightMode == 0) { // if its off lightMode = 1; // turn lights on! } else { if (lightMode == 1) { // if its all-on lightMode = 2; // make it blink! } else { if (lightMode == 2) { // if its blinking lightMode = 3; // make it wave! } else { if (lightMode == 3) { // if its waving, lightMode = 0; // turn light off! } } } } } } buttonState = val; // save the new state in our variable } if (lightMode == 0) { digitalWrite(led1Pin, LOW); digitalWrite(led2Pin, LOW); digitalWrite(led3Pin, LOW); } if (lightMode == 1) { digitalWrite(led1Pin, HIGH); digitalWrite(led2Pin, LOW); digitalWrite(led3Pin, LOW); } if (lightMode == 2) { digitalWrite(led1Pin, LOW); digitalWrite(led2Pin, HIGH); digitalWrite(led3Pin, LOW); } if (lightMode == 3) { digitalWrite(led1Pin, LOW); digitalWrite(led2Pin, LOW); digitalWrite(led3Pin, HIGH); } } Link spre comentariu
nana Postat Noiembrie 6, 2010 Partajează Postat Noiembrie 6, 2010 eu sincer faceam in alt mod .Foloseam o intrerupere externa si incrementam portul respectiv la fiecare apasare cand intram in intrerupere.Eu iti pot da un exemplu de C:ISR(vect de intrerupere extern){if(PORTx&0x80) //veriff daca activ carry adica am portul de genu b 10000000carry=1; //Fac transport 1elsecarry=0; //Fac transport 0PORTx=(PORTX<<1)|carry;delay(100); //Pt debouncing}Aceasta este o metoda universala adica merge pe orice port si pe cati pini ai nevoie modificand doar masca de biti; Se putea face si mai simplu sau mai complicat in functie de nevoie. Link spre comentariu
mecaboy Postat Noiembrie 6, 2010 Autor Partajează Postat Noiembrie 6, 2010 Da,ai dreptate. Link spre comentariu
ywar2 Postat Noiembrie 6, 2010 Partajează Postat Noiembrie 6, 2010 Salut. Nu ma pricep eu prea bine la programare dar exemplul de mai jos ar trebui sa mearga. Succes!!! $regfile = "M8def.dat" ' use the Mega8'configurez intrareaConfig Pinc.0 = Input 'push-buton conectat la masa Portc = &B00000001 'pull-up input'configurez iesirileConfig Pind.0 = Output 'LED1Config Pind.1 = Output 'LED2Config Pind.2 = Output 'LED3'variabileDim Led As Byte 'numarul LED-ului aprins'***************************************************** Led = 0 'pornesc cu LED1=APRINS Portd = 6 'LED1=APRINS, restul stins '===============================================Do If Pinc.0 = 0 Then 'este apasat butonul? Waitms 100 'este apasat doar o singura data Sound Pind.3 , 500 , 100 'sunet pe tasta ( briz-briz-uri '============================================ Incr Led 'trec la LED-ul urmator If Led = 3 Then Led = 0 'daca a fost ultimul sar la primul '============================================ If Led = 0 Then Portd.0 = 1 Else Portd.0 = 0 'aprind LED1 daca a fost selectat If Led = 1 Then Portd.1 = 1 Else Portd.1 = 0 'aprind LED2 daca a fost selectat If Led = 2 Then Portd.2 = 1 Else Portd.2 = 0 'aprind LED3 daca a fost selectat End IfLoop'***************************************************** Link spre comentariu
ole Postat Noiembrie 7, 2010 Partajează Postat Noiembrie 7, 2010 eu sincer faceam in alt mod .Foloseam o intrerupere externa si incrementam portul respectiv la fiecare apasare cand intram in intrerupere.Eu iti pot da un exemplu de C:ISR(vect de intrerupere extern){if(PORTx&0x80) //veriff daca activ carry adica am portul de genu b 10000000carry=1; //Fac transport 1elsecarry=0; //Fac transport 0PORTx=(PORTX<<1)|carry;delay(100); //Pt debouncing}Aceasta este o metoda universala adica merge pe orice port si pe cati pini ai nevoie modificand doar masca de biti; Se putea face si mai simplu sau mai complicat in functie de nevoie.Eu am o intrebare: Din ce stiam starea pinului o citesti cu PINx, nu? Link spre comentariu
picolo Postat Noiembrie 7, 2010 Partajează Postat Noiembrie 7, 2010 eu sincer faceam in alt mod .Foloseam o intrerupere externa si incrementam portul respectiv la fiecare apasare cand intram in intrerupere.Eu iti pot da un exemplu de C:ISR(vect de intrerupere extern){if(PORTx&0x80) //veriff daca activ carry adica am portul de genu b 10000000carry=1; //Fac transport 1elsecarry=0; //Fac transport 0PORTx=(PORTX<<1)|carry;delay(100); //Pt debouncing}Aceasta este o metoda universala adica merge pe orice port si pe cati pini ai nevoie modificand doar masca de biti; Se putea face si mai simplu sau mai complicat in functie de nevoie.Eu am o intrebare: Din ce stiam starea pinului o citesti cu PINx, nu?Am si eu trei intrebari: Ce mai conteaza daca pinu' se citeste cu PINx sau CUCUx daca in ISRavem delay(100) ? (100 de ani ? sau ce?). debouncing se face ori hard ori nu asa ca mai sus.pararea mea. Link spre comentariu
Vizitator Postat Noiembrie 7, 2010 Partajează Postat Noiembrie 7, 2010 nana nu a dat un cod complet, a schitat doar o solutie care e corecta. In plus a mai presupus ca selectorul are 8 pozitii si asta este hardcoded in subrutina cand face & cu constanta 0x80. ole, citirea se face intr-adevar cu PINx dar in subrutina de intrerupere nu e nevoie de citire. ATmega328 are implementat hardware functia Pin Change Interrupt. Saltul la subrutina de intrerupere se face hardware, la schimbarea unui pin. Se presupune ca inainte au fost setate corespunzator intreruperile incat sa se activeze la apasarea butonului. Nu e nevoie de citire in interiorul subrutinei pentru ca din moment ce am ajuns acolo inseamna ca butonul a fost deja apasat si datorita sistemului hardware de intreruperi programul a sarit fortat la subrutina data. picolo, delay(100) inseamna delay 100 ms, asa e sintaxa la Arduino Debouncing-ul se face aproape intotdeauna software. Teoretic s-ar putea face si hardware dar nu se practica. Oricum, mecaboy s-a descurcat si a adaptat corect un cod dat la nevoile lui. Link spre comentariu
picolo Postat Noiembrie 7, 2010 Partajează Postat Noiembrie 7, 2010 nana nu a dat un cod complet, a schitat doar o solutie care e corecta. In plus a mai presupus ca selectorul are 8 pozitii si asta este hardcoded in subrutina cand face & cu constanta 0x80. ole, citirea se face intr-adevar cu PINx dar in subrutina de intrerupere nu e nevoie de citire. ATmega328 are implementat hardware functia Pin Change Interrupt. Saltul la subrutina de intrerupere se face hardware, la schimbarea unui pin. Se presupune ca inainte au fost setate corespunzator intreruperile incat sa se activeze la apasarea butonului. Nu e nevoie de citire in interiorul subrutinei pentru ca din moment ce am ajuns acolo inseamna ca butonul a fost deja apasat si datorita sistemului hardware de intreruperi programul a sarit fortat la subrutina data. picolo, delay(100) inseamna delay 100 ms, asa e sintaxa la Arduino Debouncing-ul se face aproape intotdeauna software. Teoretic s-ar putea face si hardware dar nu se practica. Oricum, mecaboy s-a descurcat si a adaptat corect un cod dat la nevoile lui. @RoGeorge: sa inteleg ca este corect sa stau 100 de ms (sau alta unitate de masurare a timpului pierdut) intr-o intrerupere ca sa stabilesc daca un buton se balbaie ? Link spre comentariu
Vizitator Postat Noiembrie 7, 2010 Partajează Postat Noiembrie 7, 2010 Nu este gresit, cel mult ineficient.Metoda optima depinde de ce resurse dispui si ce preferi sa sacrifici. Link spre comentariu
nana Postat Noiembrie 8, 2010 Partajează Postat Noiembrie 8, 2010 Ca sa va lamuresc pe toti !! Unu e nu am scris codul exact conform sintaxei !!2 Nu ma intereseaza ce e pe PINx pentru ca daca o sa te uiti in datasheet PINx respectiv PORTx sunt 2 reg separate PINx daca incerc sa il citesc in programu respectiv o sa imi dea tot timpul acceasi valoare pentru ca tu trebuie sa configurezi respectivul port ca iesire nu ca intrare. Deci in concluzie tot portx ramane ca eu operez shiftarile de biti pe iesire adica pe PORTx.3 picolo debouncing-ul daca nu iti convine metoda mea da tu un exemplu mai bun, sau daca vrei fal hardware.Iar aici nu inteleg intr-un asemenea cod in care ai doar intreruperea principala ce te doare ca ramai in intrerupere 100ms. Daca crezi ca ai tu frecv mai mare de apasare pe butonul ala mai mare de 10Hz esti invitatul meu sa dai un exemplu mai bun. Link spre comentariu
picolo Postat Noiembrie 8, 2010 Partajează Postat Noiembrie 8, 2010 Ca sa va lamuresc pe toti !! Unu e nu am scris codul exact conform sintaxei !!2 Nu ma intereseaza ce e pe PINx pentru ca daca o sa te uiti in datasheet PINx respectiv PORTx sunt 2 reg separate PINx daca incerc sa il citesc in programu respectiv o sa imi dea tot timpul acceasi valoare pentru ca tu trebuie sa configurezi respectivul port ca iesire nu ca intrare. Deci in concluzie tot portx ramane ca eu operez shiftarile de biti pe iesire adica pe PORTx.3 picolo debouncing-ul daca nu iti convine metoda mea da tu un exemplu mai bun, sau daca vrei fal hardware.Iar aici nu inteleg intr-un asemenea cod in care ai doar intreruperea principala ce te doare ca ramai in intrerupere 100ms. Daca crezi ca ai tu frecv mai mare de apasare pe butonul ala mai mare de 10Hz esti invitatul meu sa dai un exemplu mai bun.Pana sa discutam despre rolul intreruperilor si modul lor de utilizare cred ca este cazul sa lamurim o problema:Debouncing-ul nu prea are legatura cu frecventa cu care sunt eu capabil sa apas un buton; in principal, incearca sa elimine tranzitiile multiple care la apasare sau ridicare,date de neuniformitatea suprafetelor de contact, inertie, ... chinezarie.Si, Da nana, plecand de la ce am zis mai sus: sunt capabil sa apas un buton la mai mult de 10Hz. Link spre comentariu
nana Postat Noiembrie 9, 2010 Partajează Postat Noiembrie 9, 2010 Ba picolo vad ca esti nou pe aici in primu rand cred ca nu ai inteles cum am facut eu programu si dece am zis ca poti sa apesi cu o frecv mai mare de 10Hz dar hai sa nu mai punem posturi aiurea !Nustiu ce experienta ai tu legata de MCU-uri mai ales AVR insa eu de vre-o 5 ani m-am saturat de ele zi de zi. Asa ca fami si mie o placere pana vad macar o linie de cod de la tine tineti derqu gura si daca vrei sa vb la subiect fa-o si da exemple, demonstreaza ca stii ceva. Ca de din astia cu gura mare care vb fara sa stie pe ce lume se afla e plina romania !! Link spre comentariu
ole Postat Noiembrie 9, 2010 Partajează Postat Noiembrie 9, 2010 Ok ok...gata cu cearta!!! Vorba lui @nana: daca vreti sa demonstrati ceva veniti cu "dovezi" si situatii concrete si vorbiti politicos ca altfel inchid topicul. 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