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

Pridružen-a: Sre 31 Jan 2007 9:41 Prispevkov: 9573 Aktiv.: 42.80 Kraj: Mengeš
|
Objavljeno: Sre Apr 04, 2012 12:32 pm Naslov sporočila: Timer v PIC brez interruptov |
|
|
Ravno malce študiram najnižje PIC-e...specifično 10F206. Tile najnižji PICi nimajo interruptov, imajo pa en 8 bitni timer. zanima me, kako uporabljati ta timer oziroma če prav sklepam je edina šansa da berem vrednost timerja in ko pride do nule (recimo), izvedem nek program, ki bi se pri "normalnih" PICih imenoval prekinitvena rutina.
Je to to?
|
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.95 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Sre Apr 04, 2012 1:12 pm Naslov sporočila: |
|
|
Števec-števci so tako kot pri pic-u kot pri AVR-ju bralno pisalni. To pomeni, da ga lahko v vsakem trenutku bereš, ga "popraviš"... ni kakega razloga, da bi čakal na overflow. Mikrokontrolerji, ki imajo prekinitve pa običajno pri prekoračitvi prožijo prekinitev.
Če rabiš neko nekoliko daljšo časovno konstanto, potem ustrezno nastaviš preddelilnik. Potem pač izvedeš vse kar je potrebno. Če je trajanje vsega krajše kot je časovna konstanta potem po koncu čakaš na željeno vrednost v števcu v zanki. Potem števec postaviš na začetno vrednost ter se vrneš na začetek programa. Pri tem moraš biti pozoren, na dolžino kode oz, da nimaš kakega zankanja v sami glavni kodi. Recimo tipke bereš ob vsakem prehodu. Vrednosti shraneš, ter jih obdelaš ob sledečem prehodu.
Recimo, če bi s takim mikrokontrolerjem želel multipleksirat displej, brati DS1820, meriti čas ter brati tipke si bi glavni program razsekal na sektorje enake dolžine katere bi kontroliral s timerjem. Največji problem v danem primeru predstavlja branje senzorja ki traje zelo dolgo. Proceduro bi moral razvleči čez vse sektorje.
Sam sem se v času "legend" 16C54,16c57... tega velikokrat poslužil.
_________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
protoncek Član

Pridružen-a: Sre 31 Jan 2007 9:41 Prispevkov: 9573 Aktiv.: 42.80 Kraj: Mengeš
|
Objavljeno: Sre Apr 04, 2012 1:53 pm Naslov sporočila: |
|
|
Aha...torej paziti je treba da čas, nstavljen v timerju ni krajši od trajanja izvedbe glavne zanke - v tem primeru se namreč lahko zgodi da pride do overflow-a in s tem časovne porušitve. Prav to namreč interrupt pri overflowu zelo dobro kontrolira...težje se poruši čas. Torej : izvedba glavne zanke, potem pa čakanje da pride željena vrednost števca, pa spet izvedba glavne zanke, če prav razumem.
No, seveda je enako treba paziti da čas izvedbe posebnega programčka (a-la prekinitev) spet ni predolga...
Gledal sem namreč na youtube koje tip s tem PICekom naredil 3xPWM za RGB LED... z obzirom da PIC nima PWM-ja, je moral narediti programski PWM, tam pa skoraj rabiš timer.
|
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.95 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Čet Apr 05, 2012 8:54 pm Naslov sporočila: |
|
|
Evo Protonček, glede na to, da ti delaš z AVR-ji sem pripravil primerček za tisto, kar sem zgoraj napisal s Tiny13. (praktično isto bi bilo s pic-em) Spisano je sicer v assemblerju. Sem pa vse zmetal v makroje tako da je vsaj po moji presoji bolj razumljivo. Za test sem pripravil 3 neodvisne kanale. (dodati odvzeti jih ni problem) V danem primeru je na enem demo prikaz regulacije gor-dol avtomatsko, drugem regulacija gor od min-max pa skok na minimum. Tretji regulira od max-min pa skok na maximum.
Tukaj je koda:
Koda: |
;------------------------------------------------
;softwerski PWM tiny13
;testni prikaz
;www.elektronik.si
;int oscilator 1.2mHz (9.6Mhz div8)
;------------------------------------------------
#include "tn13def.inc"
.def stevec=r3
.def tmp=r16
.def stevec2=r17
.def Cas=r18
.def Kontrolni=r19
.equ PwmKanali=0b111
.equ PwmKanal0=0x60
.macro DefCas
dec Cas
brne @0
ldi Cas,(@1*1000/13.56)
.endm
.macro PwmIzhodi
ldi tmp,PwmKanali
out DDRB,tmp
.endm
.macro PwmOn
in stevec,TCNT0
clr XH
ldi XL,PwmKanal0
ldi tmp,@0
add XL,tmp
ld tmp,X
cp tmp,stevec
brne NiEnako
sbi PORTB,@0
NiEnako:
.endm
.macro PreveriCas
mov tmp,stevec
tst tmp
breq KonecPer ;konec pwm perjode
JeEnak:
in stevec,TCNT0
cp stevec,tmp
breq JeEnak
rjmp @0
KonecPer:
.endm
.macro PwmOff
cbi PortB,@0
.endm
.macro SetPwm
clr XH
ldi XL,PwmKanal0
ldi tmp,@0
add XL,tmp
ldi tmp,@1
st X,tmp
.endm
.macro AutoSet
lds tmp,PwmKanal0+@0
sbrc Kontrolni,0
rjmp SetGor
cpi tmp,@1
breq Prevec
inc tmp
rjmp KonecAS
Prevec:
sbr Kontrolni,0b1
rjmp KonecAS
SetGor:
cpi tmp,@2
breq Premalo
dec tmp
rjmp KonecAS
Premalo:
cbr Kontrolni,0b1
KonecAS:
sts PwmKanal0+@0,tmp
.endm
.macro PwmGor
lds tmp,PwmKanal0+@0
cpi tmp,@1
breq Prevec
inc tmp
rjmp KonecAS
Prevec:
ldi tmp,@2
KonecAS:
sts PwmKanal0+@0,tmp
.endm
.macro PwmDol
lds tmp,PwmKanal0+@0
cpi tmp,@1
breq Prevec
dec tmp
rjmp KonecAS
Prevec:
ldi tmp,@2
KonecAS:
sts PwmKanal0+@0,tmp
.endm
.org 0x0
rjmp GlProg
.org 0x009
GlProg:
ldi tmp,low(ramend)
out SPL,tmp ;dolocitev sklada
PwmIzhodi ;določitev pinov ki bodo PWM izhodi
ldi tmp,(1<<CS01)|(1<<CS00) ;vklop timer0 s preddelilnikom 1:64 f=9.6Mhz/8 ==256*64*(1/1.2Mhz)==13.65mS
out TCCR0B,tmp
clr kontrolni
SetPwm 0,250 ;začetno stanje (1.parameter-kanal 2.parameter pwm vrednost)
SetPwm 1,100
SetPwm 2,180
GlZanka: ;0mS
PwmOn 0 ;parameter kanal
PwmOn 1
PwmOn 2
PreveriCas GlZanka
PwmOff 0 ;parameter kanal
PwmOff 1
PwmOff 2
DefCas GlZanka,0.05 ;13.65mS ...1.parameter kam skočit če cas ni potekel 2.parameter cas v S (max 2s) Po poteku casa gre program naprej
AutoSet 0,255,50 ;1.parameter - kanal 2.parameter nizka vrednost PWM 3.parameter visoka vrednost pwm
PwmGor 1,255,100
PwmDol 2,150,255
;tukaj lahko dodaš več kode
rjmp GlZanka
|
Vse se dogaja v glavni zanki. V prilogi je cel projekt. Pa prikaz na youtube: ***klik***
Nekaj kode sem komentiral. Če koga zanima kaka podrobnost, lahko vpraša.
Opis: |
|
 Download |
Ime datoteke: |
PwmT13.zip |
Velikost datoteke: |
6.35 KB |
Downloadano: |
1 krat |
_________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
protoncek Član

Pridružen-a: Sre 31 Jan 2007 9:41 Prispevkov: 9573 Aktiv.: 42.80 Kraj: Mengeš
|
Objavljeno: Čet Apr 05, 2012 10:25 pm Naslov sporočila: |
|
|
Super. Najlepša hvala. Sem že parkrat poskusil in malce študiral asembler, tole pa bo lepa možnost da ga še malo bolj razumem.
|
|
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: 492 dni
Powered by phpBB © 2001, 2005 phpBB Group
|