Sari la conținut
ELFORUM - Forumul electronistilor

Selector


mecaboy

Postări Recomandate

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
  • Răspunsuri 27
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • mecaboy

    6

  • nana

    5

  • picolo

    5

  • ole

    2

Top autori în acest subiect

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

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

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

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

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

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

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. :aplauze

Link spre comentariu

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. :aplauze

@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

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

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

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

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