picolo Postat Noiembrie 9, 2010 Partajează Postat Noiembrie 9, 2010 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
nana Postat Noiembrie 10, 2010 Partajează Postat Noiembrie 10, 2010 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
picolo Postat Noiembrie 10, 2010 Partajează Postat Noiembrie 10, 2010 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
mecaboy Postat Noiembrie 10, 2010 Autor Partajează Postat Noiembrie 10, 2010 Haideti domnilor sa ne calmam si sa ne folosim ambitia pentru lucruri mai productive.Respectele mele Link spre comentariu
nana Postat Noiembrie 11, 2010 Partajează Postat Noiembrie 11, 2010 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
Vizitator Laur91 Postat Februarie 21, 2012 Partajează Postat Februarie 21, 2012 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
godFather89 Postat Februarie 22, 2012 Partajează Postat Februarie 22, 2012 Nu folosesc Arduino si nu m-am documentat in privinta lui, dar din cate vad este doar un set de biblioteci peste AVR-GCC. Deci poti folosi pentru definitia ISR. Uite si un exemplu special pentru Arduino: http://gonium.net/md/2006/12/20/handling-external-interrupts-with-arduino/ Link spre comentariu
Vizitator Laur91 Postat Februarie 22, 2012 Partajează Postat Februarie 22, 2012 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
mecaboy Postat Februarie 22, 2012 Autor Partajează Postat Februarie 22, 2012 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
godFather89 Postat Februarie 22, 2012 Partajează Postat Februarie 22, 2012 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
srdjan Postat Februarie 22, 2012 Partajează Postat Februarie 22, 2012 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? Link spre comentariu
Vizitator Laur91 Postat Februarie 23, 2012 Partajează Postat Februarie 23, 2012 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
mecaboy Postat Februarie 23, 2012 Autor Partajează Postat Februarie 23, 2012 A fost doar un sfat,eu cu subrutine lucrez...mi se pare mai lizibil codul. 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