Sari la conținut
ELFORUM - Forumul electronistilor

Selector


mecaboy

Postări Recomandate

Nu-s de mult timp pe aici, si scuze daca s-a simtit jignit cineva mai cu experienta.Incerc sa invat si am inceput prin a citi cate ceva.Cand am vazut ceva complet contrar teoriei prezenta prin carti,am zis sa-mi dau cu parerea. Greseala mea.Raman la parerea ca nu asa nu asa se face debouncing si nu asa se foloseste o intrerupere indiferent de scopuri.Si rutina de mai sus nu face debouncing pe ambele fronturi.(adica: daca apas buton si stau cu el apasat mai mult de 100ms , la ridicare am sa am iar apasare falsa.)Am sa scriu si eu ceva linii de cod:(adica copy/paste)wiring.c:00042 unsigned long millis()00043 {00044 unsigned long m;00045 uint8_t oldSREG = SREG;00046 00047 // disable interrupts while we read timer0_millis or we might get an00048 // inconsistent value (e.g. in the middle of the timer0_millis++)00049 cli();00050 m = timer0_millis;00051 SREG = oldSREG;00052 00053 return m;00054 }...00077 void delay(unsigned long ms)00078 {00079 unsigned long start = millis();00080 00081 while (millis() - start <= ms)00082 ;00083 }Poate gresesc, dar cred ca e o cacofonie sa generezi o intrerupere in care sa folosesti delay(100).

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

imi pare bine ca ai pus codu ala acu sa te intreb o chestie daca tu intri in functia millis() si conservi Sreg ca sa dezactivezi intreruperile ca sa citesti timer0_millis care nu prea vad ce poate fi !! Macar daca pui un cod pune tot sa inteleg ce zici !!Insa daca vroiai sa dezactivezi intreruperile ca sa nu mai apara alt eveniment cat timp executi bucla de delay sa stii ca tocmai de aia am scris delay-ul in intrerupere ca sa ramana flagul de intrerupere activ cat execut delay astfel incat sa nu mai citesc inca o noua activare a intreruperi in acest timp astfel realizand debounceingul. Acum la ce ai zis tu picolo: "Si rutina de mai sus nu face debouncing pe ambele fronturi.(adica: daca apas buton si stau cu el apasat mai mult de 100ms, la ridicare am sa am iar apasare falsa.)"Acu daca activezi intreruperea pe LOW pentru ca nu trebe sa o activez neaparat pe event(rising sau faling) si ai pull up activ nu mai face nici o interpretare gresita la ridicare.

Link spre comentariu

imi pare bine ca ai pus codu ala acu sa te intreb o chestie daca tu intri in functia millis() si conservi Sreg ca sa dezactivezi intreruperile ca sa citesti timer0_millis care nu prea vad ce poate fi !! Macar daca pui un cod pune tot sa inteleg ce zici !!Insa daca vroiai sa dezactivezi intreruperile ca sa nu mai apara alt eveniment cat timp executi bucla de delay sa stii ca tocmai de aia am scris delay-ul in intrerupere ca sa ramana flagul de intrerupere activ cat execut delay astfel incat sa nu mai citesc inca o noua activare a intreruperi in acest timp astfel realizand debounceingul. Acum la ce ai zis tu picolo: "Si rutina de mai sus nu face debouncing pe ambele fronturi.(adica: daca apas buton si stau cu el apasat mai mult de 100ms, la ridicare am sa am iar apasare falsa.)"Acu daca activezi intreruperea pe LOW pentru ca nu trebe sa o activez neaparat pe event(rising sau faling) si ai pull up activ nu mai face nici o interpretare gresita la ridicare.

Chiar ca nu mai intleg nimic. Avea dreptate admin ole cu inchiderea topicului.Eu cred ca faci misto de mine:1. codul pe care am zis ca l-am copy/paste era din rutinele arduino folosite de tine; 2. cum sa se produca o intrerupere tip "pin change" fara sa aiba loc un "event" de tip rising sau faling? (am si eu o rugaminte: cum arata un astfel de cod activat "pe LOW" ? asa ca exemplu)
Link spre comentariu

Conform datasheetului Atmega8 pag64:"The external interrupts are triggered by the INT0, and INT1 pins. Observe that, if enabled, the interrupts will trigger even if the INT0..1 pins are configured as outputs. This feature provides a way of enerating a software interrupt. The external interrupts can be triggered by a falling or rising edge or a low level. This is set up as indicated in the specification for the MCU Control Register – MCUCR. When the external interrupt is enabled and is configured as level triggered, the interrupt will trigger as long as the pin is held low....Low level interrupts on INT0/INT1 are detected asynchronously. This implies that these interrupts can be used for waking the part also from sleep modes other than Idle mode. The I/O clock is halted in all sleep modes except Idle mode...."No acu sper ca ai inteles ca nu sunt doar event triggered events adica sa ai nevoie de o tranzitie low up sau up low.Inca ceva eu nu folosesc arduino eu folosesc avr-gcc in fine sintaxa e asemanatoare. Sper ca ai inteles acum !!!

Link spre comentariu
  • 1 an mai târziu...
Vizitator Laur91

Salutare Stie cineva sa-mi spuna daca pentru Arduino exista functii de intrerupere pentru ca am vazut ca functia ISR nu o recunoaste ( cel putin nu stiu de ce librarie apartine )Pinii de intrerupere externa ii stiu dar nu ma ajuta in cazul meu.

Link spre comentariu
Vizitator Laur91

Acum m-am lamurit , nu pot folosi nici functia ISR pentru intreruperi deoarece este valabila pentru pinii digitali ai placii arduino iar eu vroiam sa folosesc pentru pin analogic.Am sa explic si de ce : Am facut un program de robot sumo pe o placa Arduino Duemilanove si am intampinat niste probleme la detectia adversarului.Robotul se roteste in ring , dar nu reactioneaza la prezenta unui obiect ( adica nu porneste spre el , da doar un mic semn de ezitare ) si am vazut si motivul dar nu stiu care ar fi solutia :Am verificat valorile returnate de senzori prin serial monitor si intr-adevar acesti dau valori situate peste pragul de detectie cand nu este nimic si cateva valori sub pragul de detectie in fata obiectului dar pentru ca robotul se roteste relativ repede , pana sa se opreasca la intalnirea acelor valori deja trece de obiect si continua cautarea... ( asa s-ar explica acea ezitare ) El nu ia in considerare acele putine valori returnate pentru a atacaMotiv pentru care CAUT un soi de intreruperi in program ( chiar si cu break ) sau orice alt fel de solutie , ca robotul meu sa reactioneze la PRIMA valoare data si sa atace adversarul pentru ca altfel sunt fortat sa-l fac lent pentru concurs ceea ce nu-i ok...Nu stiu daca instructiunea switch ar fi de ajutor spre exempluAtasez programul in Arduino , rog frumos daca stie cineva cum as putea rezolva asta sa-mi scrie

Program arduino.txt

Link spre comentariu

Eu vad doua posibilitati:

-folosesti un mic delay dupa IF-uri,acest lucru l-ar ajuta sa i-a decizia inainte de a se schimba starea pinilor

 

SAU

 

-Inloc de GO,faci subrutine pentru deciziile robotului.Exemplu:

 

int Viteza = 0;                                      void Inainte(){                           analogWrite(MotorS_P1, Viteza);                            digitalWrite(MotorS_P2, LOW);                                                      digitalWrite(MotorD_P1, LOW);                            analogWrite(MotorD_P2, Viteza);                            }                                                    void Inapoi(){                                                        analogWrite(MotorS_P1, LOW);                            digitalWrite(MotorS_P2, Viteza);                                                      digitalWrite(MotorD_P1, Viteza);                            analogWrite(MotorD_P2, LOW);                          }void loop(){                                                    if (Foto_Rez_Stanga == LOW & Foto_Rez_Dreapta == LOW){                            Inainte();                                                      }                                                                            }

Folosesc P1 si P2 deoarece actionez motorul printr-o punte H

 

Sper sa te ajute

Link spre comentariu

Acum m-am lamurit , nu pot folosi nici functia ISR pentru intreruperi deoarece este valabila pentru pinii digitali ai placii arduino iar eu vroiam sa folosesc pentru pin analogic.

Nu am citit restul, insa poti folosi AC-ul (analog comparator) - daca uc-ul folosit dispune de asa ceva - pentru a genera o intrerupere pentru semnale analogice.
Link spre comentariu
Vizitator Laur91
Eu vad doua posibilitati:

-folosesti un mic delay dupa IF-uri,acest lucru l-ar ajuta sa i-a decizia inainte de a se schimba starea pinilor

 

SAU

 

-Inloc de GO,faci subrutine pentru deciziile robotului.Exemplu:

 

Pana acum am incercat un delay la primul if din program dupa go(255,255) si am constatat ca acea ezitare de care am spus ( pe care o are dupa ce trece putin de obiect ) o inlocuieste cu pornirea pe langa obiect pana la terminarea delay-ului apoi isi continua cautarea.

Alt delay nu stiu ce ar putea schimba dar am sa vad unde as mai putea pune . Si totusi nu as fi multumit chiar daca ar merge aceasta solutie , pentru ca e testata pe un obiect static , iar algoritmul trebuie sa functioneze corect in orice situatie (pentru alti roboti ) pentru concurs

 

 

Subrutinele ce avantaje au ? ce se executa mai repede ? mi mi se pare ca din contra sunt mai multe instructiuni

 

poti folosi AC-ul (analog comparator) - daca uc-ul folosit dispune de asa ceva - pentru a genera o intrerupere pentru semnale analogice.

 

Din cate stiu nu are analog comparator Arduino din pacate... nici nu am gasit pe undeva despre asta

 

 

ISR(ADC_vect)? semnaleaza finalizarea unei conversii indiferent daca esti in modul single conversion sau free running. sau ce intrerupere ai vrea pentru pinii analogici?

 

Nu cunosc multe despre intreruperi le-am luat in calcul ca pe o posibila solutie si avand in vedere ca functia Arduino attach.interrupt () se foloseste la intreruperi externe si e valabila doar la 2 pini Digitali in cazul meu , vreau sa aflu daca exista functii de intreruperi doar in program care sa poata fi folosite si pentru pini analogici . Daca da , atunci as dori niste detalii , cum sa le folosesc

Sau ce solutie as putea folosi

 

 

Va multumesc pentru timpul acordat

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