Sari la conținut
ELFORUM - Forumul electronistilor

Probleme de incepatori


Postări Recomandate

Salutare baieti, Am si eu o nedumerire legata de un program scris in Bascom, pentru un MCU Atmega8. Este vorba de o comanda a 4 sub-meniuri cu ajutorul unui buton. Am un singur buton disponibil. Codul merge bine si arata asa:------------------------------------------------------------------------------------Buton = Pinc.2If Buton = 0 Then Waitms 40If Buton = 0 Then Incr NrBitwait Pinc.2 , SetEnd IfEnd If If Nr = 5 Then Nr = 1 End IfSelect Case Nr Case 1 : Call Submeniu1 Case 2 : Call Submeniu2 Case 3 : Call Submeniu3 Case 4 : Call Submeniu4End Select------------------------------------------------------------------------------Problema care o supun atentiei este adaugarea unei rutine care sa-mi citeasca apasarea butonului (acelasi!) un timp de 5 secunde (sa zicem...) si daca se intampla acest lucru sa trec la un "Submeniu5". Pare simplu (pentru cei care stiu) dar eu nu am reusit sa-l fac pana acuma. Daca stie cineva o solutie, multumesc anticipat!

Se face cu timer in care incarci valoarea de 5 secunde , daca la expirarea timerului butonul este in continuare apasat sari la submeniul5 ., nu am timp acum dar daca nu te prinzi iti scriu eu exemplul .
Link spre comentariu

Multumesc de raspuns!Am incercat sa creez o rutina de program cum am inteles-o eu. Ceva tot nu-mi iese. Cum sa setez timerul la 5 secunde?--------------------------------------------------------------------------------------------$regfile = "m8def.dat" ' specify the used micro$crystal = 4000000 ' used crystal frequency$baud = 19200 ' use baud rate$hwstack = 32 ' default use 32 for the hardware stack$swstack = 10 ' default use 10 for the SW stack$framesize = 40'asta e subrutina la care trebuie sa ajung cu apasarea butonului mai mult de 5 secundeDeclare Sub Subrutina5'configureaza prescalerul la 0,256 ms, maximum cat permite la ceas de 4MHzConfig Timer0 = Timer , Prescale = 1024'incarca timerul la 5 secundeTimer0 = 255 'ACEASTA VALOARE NU STIU CUM SA O CALCULEZ LA 5 SECUNDE!'//////////////////////cam asa arata programul gandit de mine:///////////////////////////////////////Buton = Pinc.2 'debounce la apasare scurta butonIf Buton = 0 Then Waitms 40 'testeaza daca butonul este apasat 5 secundeIf Buton = 0 Then 'daca se apasa butonulStart Timer0 'porneste timerulOn Timer0 Subrutina5 Nosave 'daca trec 5 secunde de la apasare, goto subrutina 5Bitwait Pinc.2 , Set ' asteapta relaxarea butonuluiStop Timer0 'daca se ia mana de pe buton, opreste timerul------------------------------------------------------------------------------------------Nu stiu daca am gandit bine acest program. Astept pareri daca e cineva priceput in BASCOM AVR.

Link spre comentariu

Dacă butonul e testat de fiecare dată în bucla infinită iar Bascom are predefinite rutine de delay e destul de simplu.

  timeout_uc = 0;  // buclă infinită  while (1)  {    // butonul e apăsat    if (IS_INPUT_ACTIVE)    {      // aşteaptă 100 de milisecunde      delay_ms(100);      // incrementează counterul      timeout_uc++;      // A trecut limita de 5 secunde?      if (timeout_uc > 50)  // 50 * 100 = 5000ms      {        // apelează subrutina cerută        do_something();        // Reset timeout        timeout_uc = 0x00;      } // end if (timeout_uc > 50)    }    else    {      // Butonul nu e apăsat, ţine indexul pe zero      timeout_uc = 0x00;    } // end if (IS_INPUT_ACTIVE)  // Restul de cod poate fi pus aici  } // end while (1)

Varianta a doua implică folosirea unui timer şi a întreruperilor, cum a spus şi danzup. Ştim că la prescaler maxim incrementarea timerului se face o dată la 0,256ms. Pentru 5 secunde vom avea deci nevoie de 19531 de incrementări. Varianta simplă e folosirea timerului pe 16 biţi, care poate număra pînă la 65535. Varianta mai complicată e folosirea a unui index definit de noi, incrementat şi testat în rutina de tratare a întreruperii.

 

Mergem pe varianta simplă. Folosim întrerupere pentru apăsarea butonului şi una pentru timer, la top overflow de exemplu. În întreruperea de la buton vom avea două lucruri de făcut:

- iniţializăm valoarea timerului pe 16 biţi cu 46004 (0xB3B4);

- setăm flagul pentru întreruperea de top overflow a timerului 1.

În momentul în care flagul pentru întreruperea dată de timer este setat, counterul va începe să numere de la valoarea pe care i-am dat-o noi. Aceasta am calculat-o ca fiind valoarea maximă la care poate ajunge timerul minus numărul de paşi calculaţi pentru 5 secunde. După ce flagul a fost setat şi timerul a început să se incrementeze pe fundal, restul codului continuă normal, pînă în clipa în care timerul ajunge la valoarea maximă. Aici automat apare întreruperea în care trebuie să facem următoarele lucruri:

- verificăm dacă butonul mai este apăsat şi, dacă da, se execută subrutina cerută;

- ştergem flagul pentru întreruperea de overflow.

 

Asta e tot.

Link spre comentariu

ASA se face :$regfile = "m8def.dat" ' specify the used micro$crystal = 4000000 ' used crystal frequency$baud = 19200 ' use baud rate$hwstack = 32 ' default use 32 for the hardware stack$swstack = 10 ' default use 10 for the SW stack$framesize = 40Dim Buton As BitConfig Timer1 = Timer , Prescale = 1024Enable InterruptsStart Timer1Timer1 = 46004On Ovf1 Sub5 ' Sau La Fel De Bine Poti Scrie : On Timer1 Sub5DoButon = Pinc.2If Buton = 0 Then Waitms 40 Buton = Pinc.2 If Buton = 0 Then Start Timer1 Timer1 = 46004 End IfEnd If' aici faci alte chestii .....LoopSub5:Buton = Pinc.2If Buton = 0 Then ' aici faci ce vroiai sa faci daca e apasat mai mult de 5secunde Stop Timer1End IfReturn

Link spre comentariu

Va multumesc baieti, la toti, pentru ajutor.Acum am inteles cum vine treaba cu setarea timerului la 5 secunde. Daca timerul e pe 16 biti, el numara de la 0 la 65535 unde se petrece Overflow adica o ia din nou de la zero. Daca vreau sa folosesc optiunea Ovf1 atunci din valoarea maxima de 65535 scad valoarea de 5 secunde raportata la prescalerul pe care-l folosesc si incarc acea valoare rezultata in timer dupa care il pornesc sa numere. El, Timer1, incepe sa numere de la acea valoare pana la valoarea maxima la care e capabil sa numere, adica 5 sec. cat vreau eu, dupa care cade la zero, Ovf1. Daca are loc Ovf1, atunci sar la subrutina dorita, si acolo pun restul de cod pe care vreau sa-l execut. Asta e tot!Inca odata va multumesc mult, de ajutor. Toate bune, Ovidiu.

Link spre comentariu

Pai nu mai vreau sa fie apasat la expirarea timpului! Trecerea la meniul 5 trebuie sa fie facuta sigur fara sa mai fie nevoie de continuarea apasarii butonului. Dealtfel, dupa ce intru in meniul 5, butonul va fii folosit din nou pentru unele setari de acolo, iar daca nu apas nici un buton timp de 5 secunde (iarasi!), va reveni in vechiul meniu 1. Asta e o rutina de intrare in programare sau cum s-ar zice SETUP MODE, daca acel buton va fii tinut apasat 5 secunde. Nu am la dispozitie un alt buton caci altfel ar fii usor. Deja aparatul functiona in momentul cand v-am cerut acest ajutor, cu doua butoane, unul de MODE iar altul de SETUP. Nu am loc in aparat de 2 butoane ci numai de unul singur. Al doilea buton l-am pus cu fire separate pana voi gasi rutina de program care sa-mi faca functia de SETUP MODE pe acelasi buton, la o apasare mai lunga. Adica ceea ce am discutat pana acuma. Mai studiez, oricum ideea pe care am deslusit-o din exemplele date imi e de ajutor. Multumesc inca odata. Ovidiu.

Link spre comentariu
  • 3 săptămâni mai târziu...

Salutari, nu am facut thread nou incat nu cred ca e nevoie pentru niste simple intrebari de incepator

Mentionez ca nu am lucrat niciodata cu microcontroller dar am observat cate chestii se pot face cu ele, si cat imi pot usura

munca ( sau complica ) , mai bine zis joaca avand in vedere ca e doar un hobby si nici nu lucrez in domeniu

 

1)

Intentionez sa iau vreo 4~5 bucati de ATMEGA8L-8PU de la adelaida si de aici alte intrebari

observ ca are 8k memorie, destul cat sa ma doara degetele de la instructiuni, de asemenea presupun ca are viteza de 8mhz

observand ca asta e modul de numire al microcontrollerelor ( memorie/frecventa )

2) trebuie folosit un quartz care sa fie de aceasi viteza cu controllerul ( 4mhz/8mhz ) sau unul generic de 4mhz/8mhz cum zice in datasheet

3) microcontrollerul de mai sus presupun ca poate fii programat folosind programatorul asta

observand ca e isp ( in system programming sau ceva de genu ) ( pinii miso mosi sck )

4) poate fii folosit programatorul de mai sus cu avr studio 4 ? cand selectez controllerul selectez pe atmega8 ,atmega8l, sau

trebuie sa fie exact atmega8L-8PU ?

 

original voiam sa pornesc cu attiny dar am zis sa il iau pe ATMEGA8L-8PU in caz ca ma hotarasc sa fac ceva mai complex ( sigur )

Link spre comentariu

Salutari, nu am facut thread nou incat nu cred ca e nevoie pentru niste simple intrebari de incepatorMentionez ca nu am lucrat niciodata cu microcontroller dar am observat cate chestii se pot face cu ele, si cat imi pot usura munca ( sau complica ) , mai bine zis joaca avand in vedere ca e doar un hobby si nici nu lucrez in domeniu1)Intentionez sa iau vreo 4~5 bucati de ATMEGA8L-8PU de la adelaida si de aici alte intrebariobserv ca are 8k memorie, destul cat sa ma doara degetele de la instructiuni, de asemenea presupun ca are viteza de 8mhz observand ca asta e modul de numire al microcontrollerelor ( memorie/frecventa )2) trebuie folosit un quartz care sa fie de aceasi viteza cu controllerul ( 4mhz/8mhz ) sau unul generic de 4mhz/8mhz cum zice in datasheet3) microcontrollerul de mai sus presupun ca poate fii programat folosind programatorul asta observand ca e isp ( in system programming sau ceva de genu ) ( pinii miso mosi sck )4) poate fii folosit programatorul de mai sus cu avr studio 4 ? cand selectez controllerul selectez pe atmega8 ,atmega8l, sau trebuie sa fie exact atmega8L-8PU ?original voiam sa pornesc cu attiny dar am zis sa il iau pe ATMEGA8L-8PU in caz ca ma hotarasc sa fac ceva mai complex ( sigur )

1) ai inteles gresit ! 8Kb e memnoria flash , microcontrolerul mergand pana la 20Mhz sau chiar 25Mhz asa cum le overclockez eu in mod curent iar 8Mhz e valabil doar pentru varianta de putere mica adica cu L , cele cu P conform datasheet merg pana la 16Mhz cu cristal quartz extern2) esti extrem de confuz si nu inteleg ce zici acolo !Vezi ca are intern si un oscilator Rc calibrat care merge de la 1Mhz si pina la 8Mhz ( valoarea lui fiind programabila in rage-ul mentionat ) si nu are nevoie de cristal de quartz extern3)poate fi programat cu acel programator doar cu programele care il recunosc !!!4)NU ! Nu merge cu avrstudio4 ! Avr studio nu merge decat cu programatoarele tip STK 200,300,500 s.a.m.d.Orice atmel poate fi folosit cu orice cristal de quartz intre cativa Khz si 20Mhz.....25MhzEu curent folosesc cristale de genul : 11,153976Mhz sau 38,1khz asa ca nu inteleg ce zici tu despre generic ???!???Citeste mai bine pdf-urile pentru ca ai inteles multe gresit !iar raspunsurile astea puteai sa ti le dai singur daca citeai pe net mai mult despre atmel .
Link spre comentariu

Alătură-te conversației

Poți posta acum și să te înregistrezi mai târziu. Dacă ai un cont, autentifică-te acum pentru a posta cu contul tău.
Notă: Postarea ta va necesita aprobare moderator înainte de a fi vizibilă.

Vizitator
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Răspunde la acest subiect...

×   Alipit ca text avansat.   Restituie formatare

  Doar 75 emoji sunt permise.

×   Linkul tău a fost încorporat automat.   Afișează ca link în schimb

×   Conținutul tău precedent a fost resetat.   Curăță editor

×   Nu poți lipi imagini direct. Încarcă sau inserează imagini din URL.

×
×
  • 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