Posto do sada nisam nikad koristio timer-e na PIC mikrokontrolerima ,a sada imam potrebu za time ,zanima me kako to napraviti?
Kako postaviti vrijednosti na PIC-u za Timer0 da on proradi?
Princip rada kako bi to trebalo biti:
Kada na PortA.0 dodje jedan pozitivni impuls od vanjskog senzora on mi pali LED diodu na PortD.0.
Isti taj impuls sa porta A.0 trebao bi aktivirati TIMER0 da krena da broji 3 minute i kad dodje do trece minute treba da ugasi LED diodu na PortD.0
PIC16f877a i timer0
Moderators: pedja089, stojke369, [eDo], trax
Re: PIC16f877a i timer0
Ne znam hoce li ti ove dvije stranice pomoc :/
1.) http://www.microcontrollerboard.com/pic ... orial.html
2.) http://darreltaylor.com/DT_INTS-14/intro.html
1.) http://www.microcontrollerboard.com/pic ... orial.html
2.) http://darreltaylor.com/DT_INTS-14/intro.html
Re: PIC16f877a i timer0
Trebas podesiti INTCON i OPTION_REG registre.
Kada detektujes nesto na PORTA.0 treba da upalis tu svoju LEDicu i startas timer (omogucis ga u INTCON registru). U zavisnosti od kristala kojeg koristis sa PIC-em i podesenim prescalerom u OPTION_REG moras da mjeris vrijeme. Recimo mozes nastimati da ti Timer0 generise interrupt svake sekunde a u interrupt rutini da na svaki TMR0 prekid povecas brojac za 1. Kada brojac dostigne 180 znaci da su ti istekle 3 minute i tad iskljucis LEDicu.
Kada detektujes nesto na PORTA.0 treba da upalis tu svoju LEDicu i startas timer (omogucis ga u INTCON registru). U zavisnosti od kristala kojeg koristis sa PIC-em i podesenim prescalerom u OPTION_REG moras da mjeris vrijeme. Recimo mozes nastimati da ti Timer0 generise interrupt svake sekunde a u interrupt rutini da na svaki TMR0 prekid povecas brojac za 1. Kada brojac dostigne 180 znaci da su ti istekle 3 minute i tad iskljucis LEDicu.
Re: PIC16f877a i timer0
decki nema napretka s timerom 0.
Htio bi staviti primjer jednostavnog programa koji bi se izvrsavao ali ne mogu baca mi neku gresku na serveru.
onda samo ovako opisno.
U glavnoj petlji skeniram cijelo vrijeme tipke koje su prikopcane na portA.0-portA.4
porta.0 pojacava svijetlo
portA.1 smanjiva svijetlo
porta.2 gasi svijetlo---na portD.0 je prikljucena LED dioda.
kada dodje impuls na portA.3 trebao bi se aktivirati timer0 i nakon tri minute ugasiti led diodu na portD.0
tu mi je zapelo kako aktivirati timer i da on ugasi ledicu
Htio bi staviti primjer jednostavnog programa koji bi se izvrsavao ali ne mogu baca mi neku gresku na serveru.
onda samo ovako opisno.
U glavnoj petlji skeniram cijelo vrijeme tipke koje su prikopcane na portA.0-portA.4
porta.0 pojacava svijetlo
portA.1 smanjiva svijetlo
porta.2 gasi svijetlo---na portD.0 je prikljucena LED dioda.
kada dodje impuls na portA.3 trebao bi se aktivirati timer0 i nakon tri minute ugasiti led diodu na portD.0
tu mi je zapelo kako aktivirati timer i da on ugasi ledicu
Re: PIC16f877a i timer0
Ako ti se ne cita datasheet, onda ovo
http://darreltaylor.com/DT_INTS-14/elapsed.html
If Seconds=3 then
GOSUB ResetTime ' Reset Time to 0d-00:00:00.00
GOSUB StopTimer ' Start the Elapsed Timer
endif
http://darreltaylor.com/DT_INTS-14/elapsed.html
If Seconds=3 then
GOSUB ResetTime ' Reset Time to 0d-00:00:00.00
GOSUB StopTimer ' Start the Elapsed Timer
endif
Re: PIC16f877a i timer0
Timer0 nema posebne bitove za aktiviranje/deaktiviranje i on je aktivan cijelo vrijeme. Jedino sta se na Timer0 moze podesiti je interni/vanjski clock, povecanje na rastuci/padajuci brid i djelitelj. Takoder, jedino sta Timer0 moze napraviti automatski je postaviti TMRIF bit u INTCON registru kao signalizaciju da se dogodio overflow (prijelaz sa 0xFF --> 0x00).
U tvom slucaju, za tih 3 minute ne postoji nikakva kombinacija djelitelja jer je vremenski interval prevelik. Ono sta ti trebas napraviti je "pjeske" mjeriti vrijeme i ugastiti tu LEDicu kada vrijeme istekne. Za to ti treba jedna varijabla koju ces postaviti kada dobijes impuls na RA3 i onda ju smanjivati za 1 dok ne dode do nule. Kada dode na nulu, ugasi LEDicu. Za vremenski interval od 1 sekunde opet ne mozes direktno iskoristiti Timer0, ali mozes za npr. 1ms ili 10ms.
Ideja je da na svaki TMRIF bit resetiras Timer0 (postavis TMR0 registar na neku vrijednost koja daje interval od 10ms ili koliko vec treba) i uvecas brojac impulsa timera za 1. Kada taj brojac impulsa timera prijede odredenu vrijednost (npr. 100 za intervale od 10ms jer 100*10ms = 1sec) onda smanjis (ili uvecas) onaj brojac za LEDicu. Kada taj brojac od LEDice dostigne vrijednost kada se ona treba ugasiti, onda ju samo ugasis i to je to. Cekas dalje na impuls sa RA3 koji restira brojac LEDice i ciklus se ponavlja.
Izracun za TMR0 registar ovisi o brzini oscilatora i djelitelju. Jedan od kalkulatora imas i ovdje: PIC Timer Calculator
U tvom slucaju, za tih 3 minute ne postoji nikakva kombinacija djelitelja jer je vremenski interval prevelik. Ono sta ti trebas napraviti je "pjeske" mjeriti vrijeme i ugastiti tu LEDicu kada vrijeme istekne. Za to ti treba jedna varijabla koju ces postaviti kada dobijes impuls na RA3 i onda ju smanjivati za 1 dok ne dode do nule. Kada dode na nulu, ugasi LEDicu. Za vremenski interval od 1 sekunde opet ne mozes direktno iskoristiti Timer0, ali mozes za npr. 1ms ili 10ms.
Ideja je da na svaki TMRIF bit resetiras Timer0 (postavis TMR0 registar na neku vrijednost koja daje interval od 10ms ili koliko vec treba) i uvecas brojac impulsa timera za 1. Kada taj brojac impulsa timera prijede odredenu vrijednost (npr. 100 za intervale od 10ms jer 100*10ms = 1sec) onda smanjis (ili uvecas) onaj brojac za LEDicu. Kada taj brojac od LEDice dostigne vrijednost kada se ona treba ugasiti, onda ju samo ugasis i to je to. Cekas dalje na impuls sa RA3 koji restira brojac LEDice i ciklus se ponavlja.
Izracun za TMR0 registar ovisi o brzini oscilatora i djelitelju. Jedan od kalkulatora imas i ovdje: PIC Timer Calculator
Re: PIC16f877a i timer0
Zahvaljujem na odgovorima,puno mi pomoglo u rjesavanju problema.Sve radi.Nema nista bez citanja datasheeta i duzeg grijanja stolice.