 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
Kibernetik Neznanec

Pridružen-a: Sre 13 Okt 2010 7:30 Prispevkov: 9 Aktiv.: 0.05
|
Objavljeno: Tor Mar 13, 2012 8:33 pm Naslov sporočila: nastavitve Timer-ja v Bascom AVR |
|
|
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 |
|
 |
Trolfaca Neznanec

Pridružen-a: Pon 12 Mar 2012 17:02 Prispevkov: 7 Aktiv.: 0.04 Kraj: Maribor
|
Objavljeno: Tor Mar 13, 2012 9:00 pm Naslov sporočila: |
|
|
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
_________________ piškotek! |
|
Nazaj na vrh |
|
 |
MadMax Član


Pridružen-a: Pet 09 Sep 2005 22:16 Prispevkov: 4743 Aktiv.: 20.02
|
Objavljeno: Tor Mar 13, 2012 10:06 pm Naslov sporočila: |
|
|
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 |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.94 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Tor Mar 13, 2012 10:11 pm Naslov sporočila: |
|
|
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 |
|
 |
rudiP Član

Pridružen-a: Tor 07 Avg 2007 15:30 Prispevkov: 1234 Aktiv.: 5.67 Kraj: KOPER
|
Objavljeno: Sre Mar 14, 2012 9:25 am Naslov sporočila: |
|
|
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 |
|
 |
protoncek Član

Pridružen-a: Sre 31 Jan 2007 9:41 Prispevkov: 9573 Aktiv.: 42.79 Kraj: Mengeš
|
Objavljeno: Sre Mar 14, 2012 10:08 am Naslov sporočila: |
|
|
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 |
|
 |
rudiP Član

Pridružen-a: Tor 07 Avg 2007 15:30 Prispevkov: 1234 Aktiv.: 5.67 Kraj: KOPER
|
Objavljeno: Sre Mar 14, 2012 10:36 am Naslov sporočila: |
|
|
V podanem primeru je kristal 4MHz ter se lahko izvede timer 3 sekunde v enem šusu !
_________________ Lep pozdrav iz Kopra Rudi |
|
Nazaj na vrh |
|
 |
protoncek Član

Pridružen-a: Sre 31 Jan 2007 9:41 Prispevkov: 9573 Aktiv.: 42.79 Kraj: Mengeš
|
Objavljeno: Sre Mar 14, 2012 11:26 am Naslov sporočila: |
|
|
z 8 bitnim timerjem?
|
|
Nazaj na vrh |
|
 |
Kibernetik Neznanec

Pridružen-a: Sre 13 Okt 2010 7:30 Prispevkov: 9 Aktiv.: 0.05
|
Objavljeno: Sre Mar 14, 2012 3:20 pm Naslov sporočila: |
|
|
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!
|
|
Nazaj na vrh |
|
 |
protoncek Član

Pridružen-a: Sre 31 Jan 2007 9:41 Prispevkov: 9573 Aktiv.: 42.79 Kraj: Mengeš
|
Objavljeno: Sre Mar 14, 2012 3:26 pm Naslov sporočila: |
|
|
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 |
|
 |
rudiP Član

Pridružen-a: Tor 07 Avg 2007 15:30 Prispevkov: 1234 Aktiv.: 5.67 Kraj: KOPER
|
|
Nazaj na vrh |
|
 |
rudiP Član

Pridružen-a: Tor 07 Avg 2007 15:30 Prispevkov: 1234 Aktiv.: 5.67 Kraj: KOPER
|
Objavljeno: Sre Mar 14, 2012 7:13 pm Naslov sporočila: |
|
|
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 |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.94 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Sre Mar 14, 2012 7:23 pm Naslov sporočila: |
|
|
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 S (256*1024*1/4000000)
_________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
Kibernetik Neznanec

Pridružen-a: Sre 13 Okt 2010 7:30 Prispevkov: 9 Aktiv.: 0.05
|
Objavljeno: Sre Mar 14, 2012 7:28 pm Naslov sporočila: |
|
|
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 |
|
 |
Kibernetik Neznanec

Pridružen-a: Sre 13 Okt 2010 7:30 Prispevkov: 9 Aktiv.: 0.05
|
Objavljeno: Sre Mar 14, 2012 7:38 pm Naslov sporočila: |
|
|
Bi pa nastavil notranji oscilator, pa mi nekako ne gre :-/
|
|
Nazaj na vrh |
|
 |
|
|
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
|