www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

nastavitve Timer-ja v Bascom AVR
Pojdi na stran 1, 2  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
Kibernetik
Neznanec
Neznanec



Pridružen-a: Sre 13 Okt 2010 7:30
Prispevkov: 9
Aktiv.: 0.05

PrispevekObjavljeno: Tor Mar 13, 2012 8:33 pm    Naslov sporočila:  nastavitve Timer-ja v Bascom AVR Odgovori s citatom

Ima kdo kakšno pametno rešitev za moj sledeči problem:

V Bascom AVR programiram ATTINY 261A.
Zataknilo se je pri Timer-ju.

Kako ga nastavim, da bom po treh sekundah nekaj preklopil; recimo če pritisnem tipko na nekem pinu, čakam tri sekunde in če v tem času ne pritisnem dodatne tipke na drugem pinu, se vklopi nek izhod.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Trolfaca
Neznanec
Neznanec



Pridružen-a: Pon 12 Mar 2012 17:02
Prispevkov: 7
Aktiv.: 0.04
Kraj: Maribor

PrispevekObjavljeno: Tor Mar 13, 2012 9:00 pm    Naslov sporočila:   Odgovori s citatom

Dejansko obstajata dva načina za časovno zakasnitev.
Lahko se uporabljajo funkcije "wait" ali pa vgrajeni timer-ji AVR-ja.
Problem pri funkcijah "wait" je ta, da med potekom funkcije ne moremo poganjati kakršne koli kode.

Tiny261A ima dva vgrajena timer-ja. (timer0 in timer1) Vgrajeni timerji delujejo tako, da se vsak cikel timer-ja njegova vrednost poveča za 1. Ko pride število do nekega števila, ki je preveliko za timerjev register, se vrednost timerja resetira in pride do tako imenovanega "overflova".
Pri določenih nastavitvah timerja, se pri "overflovu" postavi "flag", ki ga lahko procesor bere. Tako lahko narediš preprosto "while" zanko (oziroma pri bascomu se imenuje nekaj v smislu do-loop until).

Timer se lahko poganja iz "CPU clocka", ki je vezan preko "prescalerja", ki deli frekvenco procesorja z vrednostjo prescalerja. vrednosti prescalerja so 8,64,256,1024 za timer 0, timer 1 pa ima kar veliko število prescalerjev na izbiro.

Timer pa lahko nastavimo na tako imenovan "Clear on compare match" način, kjer se timer resetira pred "overflovom", in sice ko pride do vrednosti "output compare registra", ki ga nastavimo na poljubno vrednost, pri tem pa se podobno kot pri "overflovu" sproži "flag".

Povej na kakšni frekvenci poganjaš AVR, dodaj kakšno shemo pa bomo zadevo rešili Very Happy

_________________
piškotek!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
MadMax
Član
Član



Pridružen-a: Pet 09 Sep 2005 22:16
Prispevkov: 4743
Aktiv.: 20.02

PrispevekObjavljeno: Tor Mar 13, 2012 10:06 pm    Naslov sporočila:   Odgovori s citatom

Začetniško podvprašanje z moje strani:
če prav razumem, s timerji dejansko lahko samo naredimo zakasnitve oz. intervale (premik flaga), ne pa da bi recimo direktno lahko prebrali vrednost števca timerja v nekem trenutku?
Da bi stvar delala nekako kot štoparica, ko bi s signalom na ustreznem int pinu tisti trenutek prebral timer, prepisal vrednost v programsko spremenljivko in resetiral timer? Vmes pa prebrano vrednost obdelal/uporabil v karkoli že...
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14673
Aktiv.: 61.94
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Tor Mar 13, 2012 10:11 pm    Naslov sporočila:   Odgovori s citatom

Za bascom ne vem. Sicer so vsi timerji pri AVR-jih in PIC-ih bralno pisalni. Stanje je dosegljivo v reistrih za posamezni timer. Direkno edino ne gre brati preddelilnika.
_________________
lp
Silvo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
rudiP
Član
Član



Pridružen-a: Tor 07 Avg 2007 15:30
Prispevkov: 1234
Aktiv.: 5.67
Kraj: KOPER

PrispevekObjavljeno: Sre Mar 14, 2012 9:25 am    Naslov sporočila:   Odgovori s citatom

Na enostaven način:

Koda:
 

$regfile = "M8def.dat"        ' the used chip
$crystal = 4000000            ' frequency used
$hwstack = 32
$swstack = 8
$framesize = 24


Const Timer0reload = 15
Config Timer0 = Timer , Prescale = 256
Load Timer0 , Timer0reload
On Ovf0 Timer0_isr
Enable Ovf0
Start Timer0
Enable Interrupts

dim timer_tri_sekunde as word

Start_in Alias Pinb.0         ' Vhodni pin za tipko
Config Start_in = Input

Rele Alias Portb.1            ' Izhodni pin za rele
Config Rele = Output


'-------------------------------------------------------------------------------
Do

   If Start_in = 0 And Timer_tri_sekunde = 0 Then
      Timer_tri_sekunde = 3000       'v timer naložimo 3000 vrednost za tri sekunde
      Set Rele                ' Vklopimo rele
   End If

Loop
'-------------------------------------------------------------------------------

Timer0_ISR:
   load timer0, Timer0Reload
   If Timer_tri_sekunde > 0 Then Decrement Timer_tri_sekunde
   If Timer_tri_sekunde = 1 Then Reset Rele

Return

_________________
Lep pozdrav iz Kopra Rudi


Nazadnje urejal/a rudiP Sre Mar 14, 2012 7:11 pm; skupaj popravljeno 1 krat
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
protoncek
Član
Član



Pridružen-a: Sre 31 Jan 2007 9:41
Prispevkov: 9573
Aktiv.: 42.79
Kraj: Mengeš

PrispevekObjavljeno: Sre Mar 14, 2012 10:08 am    Naslov sporočila:   Odgovori s citatom

No, 3 sekunde s timerjem v enem "šusu" ne bo šlo. Pri kristalu 1 MHz je dobrih 100 ms največ, kar dobiš, saj ta tiny nima 16 bitnega timerja. Torej nastaviš timer na 100 ms, potem pa vsakih 100ms povečaš eno spremenljivko v prekinitveni rutini. Ko ta doseže 30(=3 sek /100 ms), preklopiš željeni izhod.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
rudiP
Član
Član



Pridružen-a: Tor 07 Avg 2007 15:30
Prispevkov: 1234
Aktiv.: 5.67
Kraj: KOPER

PrispevekObjavljeno: Sre Mar 14, 2012 10:36 am    Naslov sporočila:   Odgovori s citatom

V podanem primeru je kristal 4MHz ter se lahko izvede timer 3 sekunde v enem šusu !
_________________
Lep pozdrav iz Kopra Rudi
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
protoncek
Član
Član



Pridružen-a: Sre 31 Jan 2007 9:41
Prispevkov: 9573
Aktiv.: 42.79
Kraj: Mengeš

PrispevekObjavljeno: Sre Mar 14, 2012 11:26 am    Naslov sporočila:   Odgovori s citatom

z 8 bitnim timerjem? Shame on you
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Kibernetik
Neznanec
Neznanec



Pridružen-a: Sre 13 Okt 2010 7:30
Prispevkov: 9
Aktiv.: 0.05

PrispevekObjavljeno: Sre Mar 14, 2012 3:20 pm    Naslov sporočila:   Odgovori s citatom

Trenutno imam kristal 12Mhz. Mi je pa vseeno kaj dam. Imam tudi nekaj drugih procesorjev; AtMega8, AtMega16...

Konkreten problem je sledeč:

Kontrolirati moram stek motorja. Torej pritisnem tipko "start", rele motorja sklene in motor se zavrti. Na motor je nameščena hallova sonda - enkoder (hall ic) ki mi da nekaj pulzov na obrat. Torej če pritisnem tipko start in dobim pulze z enkoderja prižgem zeleno luč. Če po treh sekundah od pritiska na tipko start ne dobim nekaj pulzov iz enkoderja, prižgem rdečo luč. Rezultat dober/slab je prisoten dokler ne pritisnem tipke potrditev. Po potrditvi je uP ponovno pripravljen na naslednje merjenje "steka".

Hvala vsen za info! Applause
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
protoncek
Član
Član



Pridružen-a: Sre 31 Jan 2007 9:41
Prispevkov: 9573
Aktiv.: 42.79
Kraj: Mengeš

PrispevekObjavljeno: Sre Mar 14, 2012 3:26 pm    Naslov sporočila:   Odgovori s citatom

Za tako enostavno zadevo je škoda mege....vzameš omenjeni tiny in narediš, kot sem napisal. Spremenljivko, ki jo povečuješ vsakih 100 ms lahko resetira impulz iz hallove sonde: ko sonda da impulz, jo postaviš na nulo. Če slučajno pride do 30 (23 sekunde), bo to pomenilo da ni pulzos iz sonde in bo rdeča luč - tako bo 3 sekunde preteklo samo če teh pulzov ne bo - tudi med samim delovanjem - npr. če se motor ustavi, in takrat bi se zadeva samodejno ustavila.
Ker ne rabiš točnosti lahko uporabiš notranji takt procesorja (npr. 1MHz).
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
rudiP
Član
Član



Pridružen-a: Tor 07 Avg 2007 15:30
Prispevkov: 1234
Aktiv.: 5.67
Kraj: KOPER

PrispevekObjavljeno: Sre Mar 14, 2012 6:54 pm    Naslov sporočila:   Odgovori s citatom

protoncek je napisal/a:
z 8 bitnim timerjem? Shame on you


Do sedaj je še zmeraj delalo !

Koda:


const Timer0Reload = 15
config timer0=timer,prescale = 256
load timer0 , Timer0Reload
on ovf0 Timer0_isr
enable ovf0
start timer0
enable interrupts
'Add your code here

Timer0_ISR:
   load timer0, Timer0Reload
   'Add your ISR code here
  return

'Timer value explination
' The timer is a 8Bit timer, it overflows when the timer reaches 256
' The AVR is running at 4000000Hz, the prescaler is 256
' Each tick is 0,064 ms  -  (1 / CPUSpeed in KHz ) * Prescaler
' The timer needs  15 ticks to reach the required time  ( 15 * 0,064 = 0,96ms)
' The start value for the timer must be set to 241 so that it will overflow at 256 after 15 ticks
' NOTE: The load command does the inversion for you (256-value or 65536-value)



AVR_CALC_TIME.JPG
 Opis:
 Velikost datoteke:  43.48 KB
 Pogledana:  3 krat

AVR_CALC_TIME.JPG



_________________
Lep pozdrav iz Kopra Rudi
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
rudiP
Član
Član



Pridružen-a: Tor 07 Avg 2007 15:30
Prispevkov: 1234
Aktiv.: 5.67
Kraj: KOPER

PrispevekObjavljeno: Sre Mar 14, 2012 7:13 pm    Naslov sporočila:   Odgovori s citatom

protoncek je napisal/a:
No, 3 sekunde s timerjem v enem "šusu" ne bo šlo. Pri kristalu 1 MHz je dobrih 100 ms največ, kar dobiš, saj ta tiny nima 16 bitnega timerja. Torej nastaviš timer na 100 ms, potem pa vsakih 100ms povečaš eno spremenljivko v prekinitveni rutini. Ko ta doseže 30(=3 sek /100 ms), preklopiš željeni izhod.


Protonček: nisi dobro pogledal podani primer. Timer je nastavljen tako, da sproži prekinitev vsako milisekundo. Ko pritisneš na tipko se naloži v timer_tri_sekunde vrednost 3000 kar odgovarja trajanju treh sekund . Ob vsaki prekinitvi časovnika se odšteje vrednost v timer_tri_sekunde. Ko ima ta vrednost 1
je potekel čas 3 Sekund - 1 in rele se izklopi.

_________________
Lep pozdrav iz Kopra Rudi
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14673
Aktiv.: 61.94
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Sre Mar 14, 2012 7:23 pm    Naslov sporočila:   Odgovori s citatom

rudiP je napisal/a:
V podanem primeru je kristal 4MHz ter se lahko izvede timer 3 sekunde v enem šusu !


Protonček ima prav. Hardware tega ne dopušča, pa ne glede na to s čim boš program napisal. Pri max. preddelilniku 1:1024 se bo pri clocku 4Mhz števec enkrat obrnil v času 65536 mi S (256*1024*1/4000000)

_________________
lp
Silvo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Kibernetik
Neznanec
Neznanec



Pridružen-a: Sre 13 Okt 2010 7:30
Prispevkov: 9
Aktiv.: 0.05

PrispevekObjavljeno: Sre Mar 14, 2012 7:28 pm    Naslov sporočila:   Odgovori s citatom

Zadevo sem rešil brez "Timer-ja".

"Cycle time" sem nekoliko zabremzal z "waitms" in štel cikle ko je pritisnjena tipka "start". Tisti čas treh sekund je okviren, točnost niti ni potrebna.

Koda:

'DEFINIRAJ uP
$regfile = "attiny261.dat"
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32

'DEFINIRAJ I/0 PORTE
Config Pina.2 = Input
Config Pina.3 = Input
Config Pina.4 = Input
Config Porta.0 = Output
Config Porta.1 = Output

'VKLOPI INTERNE "PULLUP" UPORE ZA STABILNO STANJE
Porta.2 = 1
Porta.3 = 1
Porta.4 = 1

'POIMENUJ I/O PORTE
Tipka_reset Alias Pina.2
Tipka_start Alias Pina.3
Enkoder Alias Pina.4
Slab Alias Porta.0
Dober Alias Porta.1

'DOLOČI TIP SPREMENLJIVKE
Dim A As Bit
Dim Stevec_pulzov As Byte
Dim Stevec_ciklov As Byte

'DO - LOOP ZANKA
Do

If Tipka_start = 0 And Dober = 0 And Slab = 0 Then
   Stevec_ciklov = Stevec_ciklov + 1
   If Enkoder = 1 Then A = 1
   If Enkoder = 0 And A = 1 Then
      Stevec_pulzov = Stevec_pulzov + 1
      A = 0
      End If

   If Stevec_pulzov > 5 Then Set Dober
   If Stevec_ciklov > 250 Then Set Slab
End If

If Tipka_reset = 0 Then
   A = 0
   Stevec_pulzov = 0
   Stevec_ciklov = 0
   Reset Dober
   Reset Slab
End If

Waitms 2

Loop
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Kibernetik
Neznanec
Neznanec



Pridružen-a: Sre 13 Okt 2010 7:30
Prispevkov: 9
Aktiv.: 0.05

PrispevekObjavljeno: Sre Mar 14, 2012 7:38 pm    Naslov sporočila:   Odgovori s citatom

Bi pa nastavil notranji oscilator, pa mi nekako ne gre :-/
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran 1, 2  Naslednja
Stran 1 od 2

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 493 dni


Powered by phpBB © 2001, 2005 phpBB Group