AVR, Timer kao Counter - Bascom

Rasprava o AVR mikrokontrolerima, AVR projekti i drugo vezano za AVR...

Moderators: pedja089, stojke369, trax, InTheStillOfTheNight

Post Reply
STIPA
Penjem se :)
Penjem se :)
Posts: 75
Joined: 22-03-2006, 15:58

AVR, Timer kao Counter - Bascom

Post by STIPA »

Poštovani,
limač sam što se tiče programiranja i AVR, ali trenutno se učim na nekakvom programu, kodu, koji mi treba, a stvar je u tome da mi trebaju dva countera koji ce istovremeno brojati impulse na ulazima T0 i T1. Timer sam dekalrirao kao Timer1=Counter, a ne znam da li je moguće istovremeno koristiti dva countera, i ako je moguće na koji način to izvesti, ili nekako drukčije. (Kod sam pisao za Atmega32)

Unaprijed hvala, i hvala na razumjevanju.
juremm
Pocetnik na forumu
Pocetnik na forumu
Posts: 26
Joined: 24-09-2010, 07:54

Re: AVR, Timer kao Counter - Bascom

Post by juremm »

Stipa,

u reviji Svet elektronike je g. Mitrović objavio seriju članaka, gdje su razrađeni i timerji/counterji - jasno sve za Bascom-AVR.

Programi su ovdje: http://www.svet-el.si/za-download/progr ... -mikropin2

Članke traži na www.svet-el.si (išči članke MikroPin).

Svet elektronike će biti od 20.- 22. februarja na sajmu IFAM v Novem Sadu, vabljeni na sajam!

Lep pozdrav!
Jure
STIPA
Penjem se :)
Penjem se :)
Posts: 75
Joined: 22-03-2006, 15:58

Re: AVR, Timer kao Counter - Bascom

Post by STIPA »

juremm wrote:Stipa,

u reviji Svet elektronike je g. Mitrović objavio seriju članaka, gdje su razrađeni i timerji/counterji - jasno sve za Bascom-AVR.

Programi su ovdje: http://www.svet-el.si/za-download/progr ... -mikropin2

Članke traži na http://www.svet-el.si (išči članke MikroPin).

Svet elektronike će biti od 20.- 22. februarja na sajmu IFAM v Novem Sadu, vabljeni na sajam!

Lep pozdrav!
Jure

Poštovani, potrebno mi je da Atmega8 (ne 32) na pravi način koristi svoje tajmere i da služe istovremeno kao brojači impulsa u sekundi. Tj. koliko impulsa na ulazima T0 i T1 u nekoj poznatoj vremenskoj jedinici. Taj dio koda u Bascom-u mi je ključan za daljni moj rad,pa ako tko zna da mi pomogne.
User avatar
Kukinjos
Pravi forumaš
Pravi forumaš
Posts: 1724
Joined: 28-03-2012, 18:01
Location: Split

Re: AVR, Timer kao Counter - Bascom

Post by Kukinjos »

Evo ti kod za Bascom AVR i ATmegu8 u kojem koristiš 8 bitni Timer/Counter 0 kao brojač silaznih ivica impulsa sa PORTD.4 (T0) i 16 bitni Timer/Counter 1 kao brojač na PORTD.5 (T1). Timer/Counter 2 se koristi kao timer za generiranje interrupta svakih 4ms kako bi u finalu, nakon 250 tikova dobili jednu sekundu i tada pročitali stanje brojača 0 i 1, prebacili vrijednosti u varijable, te resetirali njihova stanja. LED spojen na PORTB.0 će blinkat u ritmu 1Hz, a na serijskom (rs232) izlazu (PORTD.0 - Rx i PORTD.1 Tx), ćeš imat ispis vrijednosti brojača T0 i T1. Program je provjeren i radi na stvarnom hardware-u.

Code: Select all

'****************************************************************
'*  Name    : Stipa_timer.bas                                   *
'*  Author  : Kukinjos                                          *
'*  Notice  : Copyright (c) 2013                                *
'*          : All Rights Reserved                               *
'*  Date    : 14.03.2013                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************


$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32



Config Portb = Output                                       ' PORT ZA IZLAZ SIGNALA
Config Portd = Input                                        ' PORT ZA ULAZ SIGNALA

Dim A As Byte                                               ' VARIJABLA ZA TIMER/COUNTER 0 (8 BITA)
Dim B As Word                                               ' VARIJABLA ZA TIMER/COUNTER 1 (16 BITA)

Dim N As Byte                                               ' POMOĆNA VARIJABLA ZA BROJENJE TIKOVA OD 4ms
Dim Led As Bit                                              ' POMOĆNA VARIJABLA KOJOM SE PALI LED SVAKIH 1s


'------------------------- TIMER 2, 4ms INTERRUPT ------------------------------
Const Timer_reload = 125                                    ' TIMER2 RELOAD ZA 4ms NA 8MHz
Config Timer2 = Timer , Prescale = 256                      ' PRESKALER ZA TIMER2
Load Timer2 , Timer_reload                                  ' UPIŠI VRIJEDNOST ZA 4ms PRI 8 MHz
On Ovf2 Tick                                                ' KAD TIMER ODBROJI IDI NA IRQ. TICK
Enable Timer2                                               ' DOPUSTI INTER. ZA TIMER2
Start Timer2                                                ' POKRENI TIMER2
Enable Interrupts                                           ' DOPUSTI GLOBALNO INTERRUPTE

'------------------------------ POČETAK ----------------------------------------

Config Timer0 = Counter , Edge = Falling                    ' POSTAVI TIMER/COUNTER 0 U MOD BROJAČA ZA L IMP.
Config Timer1 = Counter , Edge = Falling                    ' POSTAVI TIMER/COUNTER 1 U MOD BROJAČA ZA L IMP.

Portb = 255                                                 'NA MOJOJ PLOČI OVO GASI LED-ICE (STK500)
Portd = 255                                                 ' POSTAVI PULL-UP NA ULAZE


'---------------------------- GLAVNA PETLJA ------------------------------------


Do



Portb.0 = Led                                               ' UPALI ILI UGASI LED NA PORTB.0

If N = 10 Then                                              ' KAD N BUDE 10 POŠALJI VRIJEDNOSTI
                                                           ' NA SERIJSKI PORT (RS232) SA
   Print "T0= " ; A                                         ' BROJAČA T0 (PORTD.4)  I
   Print "T1= " ; B                                         ' BROJAČA T1 (PORTD.5)

End If



Loop

'-------------------------------------------------------------------------------

'********************************* PODPROGRAMI *********************************

'******************************* INTERRUPT RUTINE ******************************



'----------------------------- INTERRUPT SVAKIH 4 ms ---------------------------

Tick:

   Incr N                                                   ' POVEĆAJ BROJAĆ TIKOVA OD 4 ms.

   If N = 250 Then                                          ' AKO JE IZBROJANO 250 TIKOVA (1 SEKUNDA)

      Toggle Led                                            ' INVERTIRAJ STANJE LED-ICE

      A = Tcnt0                                             ' PREBACI VRIJEDNOSTI IZ BROJAČA 0 U A
      B = Tcnt1                                             ' ISTO NAPRAVI I S BROJAČEM 1 U B
      Tcnt0 = 0                                             ' RESETIRAJ BROJAČ 0 ZA PONOVNO BROJANJE
      Tcnt1 = 0                                             ' ISTA STVAR SAMO ZA BROJAČ 1

      N = 0                                                 ' RESETIRAJ BROJ TIKOVA

   End If



   Load Timer2 , Timer_reload                               ' UPIŠI VRIJEME I PONOVNO POKRENI TIMER

Return                                                      ' VRATI SE IZ INTERRUPT-A
'-------------------------------------------------------------------------------
Cezare, star sam i nemoćan, ali poslušaj moj savjet ....
STIPA
Penjem se :)
Penjem se :)
Posts: 75
Joined: 22-03-2006, 15:58

Re: AVR, Timer kao Counter - Bascom

Post by STIPA »

Kukinjos wrote:Evo ti kod za Bascom AVR i ATmegu8 u kojem koristiš 8 bitni Timer/Counter 0 kao brojač silaznih ivica impulsa sa PORTD.4 (T0) i 16 bitni Timer/Counter 1 kao brojač na PORTD.5 (T1). Timer/Counter 2 se koristi kao timer za generiranje interrupta svakih 4ms kako bi u finalu, nakon 250 tikova dobili jednu sekundu i tada pročitali stanje brojača 0 i 1, prebacili vrijednosti u varijable, te resetirali njihova stanja. LED spojen na PORTB.0 će blinkat u ritmu 1Hz, a na serijskom (rs232) izlazu (PORTD.0 - Rx i PORTD.1 Tx), ćeš imat ispis vrijednosti brojača T0 i T1. Program je provjeren i radi na stvarnom hardware-u.

[/code]
Uvaženi kolega, mnogo ti hvala. Hvala!. Može još samo jedno pitanje. Kad bi na sličan način radili mjerenje vremena između dva impulsa koje se pojave na nekom ulazu, kako to učiniti? Naravno, ne očekujem gotov prog, nego samo pomoć ako je moguće. Znači mjerenje impulsa između 1-2 (prvog pojavljenog i drugog impulsa),2-3,3-4,4-5,5-6,6,7...ili slično.
User avatar
Kukinjos
Pravi forumaš
Pravi forumaš
Posts: 1724
Joined: 28-03-2012, 18:01
Location: Split

Re: AVR, Timer kao Counter - Bascom

Post by Kukinjos »

Zavisno od rezolucije koju hoćeš postići, koristiš timer0 ili timer2 za 8 bita, ili timer1 za 16 bita. Postaviš ga kao timer, odrediš preskaler, zavisno od minimalne rezolucije. Startaš ga na neki događaj (if PINB.x = 0 then start timerx) i zaustavljaš ga (if 'nešto' then stop timerx). Zatim pročitaš odbrojanu vrijednost iz varijable tcntx. To bi bilo u globalu mjerenje dužine nekog događaja.
Cezare, star sam i nemoćan, ali poslušaj moj savjet ....
Post Reply