Jump to content


Photo

Probleme de incepatori


  • Please log in to reply
822 replies to this topic

#16 OFFLINE   danzup

danzup

    Membru avansat

  • Membri
  • PipPipPipPip
  • 2,016 posts

Posted 26 February 2010 - 09:56 AM

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.2

If Buton = 0 Then
Waitms 40
If Buton = 0 Then
Incr Nr
Bitwait Pinc.2 , Set
End If
End If

If Nr = 5 Then
Nr = 1
End If
Select Case Nr
Case 1 : Call Submeniu1
Case 2 : Call Submeniu2
Case 3 : Call Submeniu3
Case 4 : Call Submeniu4
End 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 .

Cu_reclama

Cu_reclama
  • Membri

#17 OFFLINE   yo6pir

yo6pir

    Electronist

  • Membri
  • PipPip
  • 882 posts
  • Locatie:Târgu-Mures

Posted 26 February 2010 - 08:16 PM

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 secunde

Declare Sub Subrutina5

'configureaza prescalerul la 0,256 ms, maximum cat permite la ceas de 4MHz

Config Timer0 = Timer , Prescale = 1024

'incarca timerul la 5 secunde

Timer0 = 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 buton
If Buton = 0 Then Waitms 40 'testeaza daca butonul este apasat 5 secunde
If Buton = 0 Then 'daca se apasa butonul
Start Timer0 'porneste timerul
On Timer0 Subrutina5 Nosave 'daca trec 5 secunde de la apasare, goto subrutina 5
Bitwait Pinc.2 , Set ' asteapta relaxarea butonului
Stop 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.

#18 OFFLINE   yo6pir

yo6pir

    Electronist

  • Membri
  • PipPip
  • 882 posts
  • Locatie:Târgu-Mures

Posted 28 February 2010 - 09:45 PM

Am incercat programul in aceasta varianta si nu merge !
E ceva acolo care-mi scapa. E cineva cu vreun sfat?

#19 OFFLINE   ratza

ratza

    Lepră

  • Membri
  • PipPipPipPipPip
  • 4,970 posts
  • Locatie:Vîlcean în Sibiu

Posted 01 March 2010 - 09:01 AM

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.

#20 OFFLINE   danzup

danzup

    Membru avansat

  • Membri
  • PipPipPipPip
  • 2,016 posts

Posted 01 March 2010 - 11:03 AM

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 = 40


Dim Buton As Bit
Config Timer1 = Timer , Prescale = 1024
Enable Interrupts
Start Timer1
Timer1 = 46004
On Ovf1 Sub5 ' Sau La Fel De Bine Poti Scrie : On Timer1 Sub5

Do


Buton = Pinc.2
If Buton = 0 Then
Waitms 40
Buton = Pinc.2
If Buton = 0 Then
Start Timer1
Timer1 = 46004
End If
End If
' aici faci alte chestii .....

Loop


Sub5:
Buton = Pinc.2
If Buton = 0 Then


' aici faci ce vroiai sa faci daca e apasat mai mult de 5secunde
Stop Timer1


End If
Return

#21 OFFLINE   nana

nana

    Membru

  • Membri
  • PipPip
  • 403 posts

Posted 01 March 2010 - 12:24 PM

Cum va dat voua o perioada de 0,256ms la frecv de 4Mhz si cu prescaler de 1024 ? ca mie dupa calcule imi da 0,322 ms ce corespunde pentru o frecv de 3096,25 Hz !!

#22 OFFLINE   ratza

ratza

    Lepră

  • Membri
  • PipPipPipPipPip
  • 4,970 posts
  • Locatie:Vîlcean în Sibiu

Posted 01 March 2010 - 01:18 PM

4000000 / 1024 = 3906,25
1 / 3906,25 = 0,000256s adică 0,256ms.

#23 OFFLINE   srdjan

srdjan

    Membru avansat

  • Membri
  • PipPipPipPip
  • 1,499 posts

Posted 01 March 2010 - 01:30 PM

nu-s cumva microsecunde?

#24 OFFLINE   ratza

ratza

    Lepră

  • Membri
  • PipPipPipPipPip
  • 4,970 posts
  • Locatie:Vîlcean în Sibiu

Posted 01 March 2010 - 02:48 PM

Ba da, fix 256.

#25 OFFLINE   yo6pir

yo6pir

    Electronist

  • Membri
  • PipPip
  • 882 posts
  • Locatie:Târgu-Mures

Posted 02 March 2010 - 11:36 PM

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.

#26 OFFLINE   ratza

ratza

    Lepră

  • Membri
  • PipPipPipPipPip
  • 4,970 posts
  • Locatie:Vîlcean în Sibiu

Posted 03 March 2010 - 09:16 AM

Daca are loc Ovf1, atunci sar la subrutina dorita, si acolo pun restul de cod pe care vreau sa-l execut.

Corect, dar nu uitaţi să verificaţi butonul să vedeţi dacă la expirarea timpului mai e apăsat sau nu.

#27 OFFLINE   yo6pir

yo6pir

    Electronist

  • Membri
  • PipPip
  • 882 posts
  • Locatie:Târgu-Mures

Posted 03 March 2010 - 11:12 PM

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.

#28 OFFLINE   DannyBuzz

DannyBuzz

    Nou venit

  • Membri
  • Pip
  • 3 posts

Posted 04 March 2010 - 12:40 AM

Sunt nou pe acest forum si nu stiu cum sa deschid un subiect(un topic)ma poate ajuta cineva?

#29 OFFLINE   naghi32

naghi32

    Nou venit

  • Membri
  • Pip
  • 61 posts

Posted 25 March 2010 - 12:03 PM

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 )

Cu_reclama

Cu_reclama
  • Membri

#30 OFFLINE   danzup

danzup

    Membru avansat

  • Membri
  • PipPipPipPip
  • 2,016 posts

Posted 25 March 2010 - 12:45 PM

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 )

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 extern
2) 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 extern
3)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.....25Mhz
Eu 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 .




0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users