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 

Timer v PIC brez interruptov

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
protoncek
Član
Član



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

PrispevekObjavljeno: Sre Apr 04, 2012 12:32 pm    Naslov sporočila:  Timer v PIC brez interruptov Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Silvo
Moderator
Moderator



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

PrispevekObjavljeno: Sre Apr 04, 2012 1:12 pm    Naslov sporočila:   Odgovori s citatom

Š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
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.80
Kraj: Mengeš

PrispevekObjavljeno: Sre Apr 04, 2012 1:53 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Silvo
Moderator
Moderator



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

PrispevekObjavljeno: Čet Apr 05, 2012 8:54 pm    Naslov sporočila:   Odgovori s citatom

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.



PwmT13.zip
 Opis:

Download
 Ime datoteke:  PwmT13.zip
 Velikost datoteke:  6.35 KB
 Downloadano:  1 krat


_________________
lp
Silvo
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.80
Kraj: Mengeš

PrispevekObjavljeno: Čet Apr 05, 2012 10:25 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
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: 492 dni


Powered by phpBB © 2001, 2005 phpBB Group