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

Pridružen-a: Tor 27 Maj 2008 14:16 Prispevkov: 13 Aktiv.: 0.06 Kraj: Črna na Koroškem
|
Objavljeno: Čet Maj 29, 2008 6:31 pm Naslov sporočila: Časovna zanka v C |
|
|
Pozdravljeni!
Upam da pišem v pravilno izbo, problem pa imam sledeč:
Pica programiram v Mplabu in sicer v C jeziku.
Zanima me, če je nasledna časovna while zanka pravilno zastavljena:
Po formuli za izračun TMR0 za 10MHz clock, predelilnik 256 dobim vrednost za zakasnitev 10ms TMR0=97
Sam bi potreboval daljše zakasnitve, zato sem zanko zastavil takole:
OPTION_REG=0x07 //nastavitev preddelilnika na 256
cas=0;
TMR0=0;
while(TMR0<97 && cas<50) //Zakasnitev 5s
{
cas++;
}
Ali res sedaj ta zanka deluje tako da vsakih 10ms za 1 poveča spremenljivko čas, in to 50krat, kar bi zneslo 50x 10ms = 5s?
Zadeve žal še ne morem preizkusiti saj si nisem še sestavil programatorja!
hvala za pomoč! |
|
Nazaj na vrh |
|
 |
gumby Član


Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 18.42
|
Objavljeno: Čet Maj 29, 2008 6:51 pm Naslov sporočila: |
|
|
V C imas funkciji delay_us() in delay_ms()... ne bi bilo bolj enostavno to uporabit?
edit: preizkusiš lahko tudi brez programatorja, MPLAB ima vgrajen simulator/debugger. _________________ Tule nisem več aktiven. |
|
Nazaj na vrh |
|
 |
Glitch Član

Pridružen-a: Pet 07 Apr 2006 11:40 Prispevkov: 1477 Aktiv.: 6.32
|
Objavljeno: Čet Maj 29, 2008 7:52 pm Naslov sporočila: |
|
|
gumby je napisal/a: |
V C imas funkciji delay_us() in delay_ms()... ne bi bilo bolj enostavno to uporabit?
|
C sam po sebi nima teh funkcij, zato je ta predlog precej zavajajoč. Razen, če si mislil, da poleg prevajalika za C (MPLAB in PIC) pride tudi knjižnica s temi funkcijami. |
|
Nazaj na vrh |
|
 |
trully1 Član

Pridružen-a: Pet 14 Nov 2003 20:20 Prispevkov: 216 Aktiv.: 0.91 Kraj: Železniki
|
Objavljeno: Čet Maj 29, 2008 8:05 pm Naslov sporočila: |
|
|
Zdravo
Ne vem če bo tvoja funkcija funkcioniral, nisem je pa preizkusil.
Sam bi se lotil na sledeč način:
Kot si že sam ugotovil bi pri delilniku 256 in 10MHz uri potreboval približno 97 ciklov.
TMR0 je 8 bitni števec zato bi ga nastavil na 256-97=159
Za 5 s zakasnitev se mora zgoditi overflov števca TMR0 500x:
97*500*256/(10MHz/4)=4,9664s
Koda:
...
Koda: |
cas = 500; //spremenlivka mora biti v pravilnega tipa
//inicializacija števca
TMR0=159;
OPTION_REG=0x07
INTCON.TMR0IF=0; // zastavico za prekinitev brišemo , prekinitve ob overflovu ni vklopljena
while(1)
{
if (INTCON.TMR0IF==1) //Pogledamo če je prišlo do overflova, če ni se ne bo naredilo nič
{
TMR0=159; //nastavimo ponovno da bo preteklo 10ms
INTCON.TMR0IF=0; // zbrišemo zastavico za overflov
if (cas==0) // pogledamo, če je že poteklo 5s?
{ //JA ŽE
cas =500;
//<= sem noter pride tvoja rutina
}
else cas--; //NE ŠE NI
}
} |
Ne vem če je čist pravilna sintaksa ker ne vem kater C uporablaš. V principu bi pa moglo delat. Če rabiš nastavit drugo zakasnitev nastaviš samo novo vrednost spremenljivki "cas".
Upam da ti bo pomagalo
LP Matjaž |
|
Nazaj na vrh |
|
 |
gumby Član


Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 18.42
|
Objavljeno: Čet Maj 29, 2008 8:06 pm Naslov sporočila: |
|
|
Glitch je napisal/a: |
C sam po sebi nima teh funkcij, zato je ta predlog precej zavajajoč. Razen, če si mislil, da poleg prevajalika za C (MPLAB in PIC) pride tudi knjižnica s temi funkcijami. |
Ja, v knjiznici so...
C sam po sebi itak nima nobene funkcije
edit:quote _________________ Tule nisem več aktiven.
Nazadnje urejal/a gumby Čet Maj 29, 2008 8:39 pm; skupaj popravljeno 1 krat |
|
Nazaj na vrh |
|
 |
gumby Član


Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 18.42
|
Objavljeno: Čet Maj 29, 2008 8:38 pm Naslov sporočila: |
|
|
Takole nekako pa zgleda z uporabo prekinitev:
Koda: |
#include <16F876A.h>
#use delay(clock=20000000)
#define S_MAX ((20000000*5)/(4*256*256))
int konec=0;
long int stevec=0;
#int_rtcc
void tmr0_isr()
{
if(++stevec==S_MAX)
konec=1;
}
void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
set_timer0(0);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
while(!konec)
;
// tule se program nadaljuje po 5s
} |
_________________ Tule nisem več aktiven. |
|
Nazaj na vrh |
|
 |
Glitch Član

Pridružen-a: Pet 07 Apr 2006 11:40 Prispevkov: 1477 Aktiv.: 6.32
|
Objavljeno: Čet Maj 29, 2008 8:44 pm Naslov sporočila: |
|
|
gumby je napisal/a: |
Ja, v knjiznici so...
|
OK |
|
Nazaj na vrh |
|
 |
j0e Član

Pridružen-a: Tor 27 Maj 2008 14:16 Prispevkov: 13 Aktiv.: 0.06 Kraj: Črna na Koroškem
|
Objavljeno: Tor Jun 03, 2008 2:05 pm Naslov sporočila: |
|
|
Hvala vsem za pomoč!
V knjižnici nimam ukazov delay_ms, zato sem sedaj zadevo rešil s pomočjo interruptov (hvala trully za razlago), tako da zadeva sedaj deluje!
Koda: |
void time5 (void)
{
int cas;
cas = 0;
//inicializacija števca
TMR0=97;
OPTION=0x07;
TMR0IF=0; //pobrisana zastavica
while(cas<500)
{
if (TMR0IF==1) //Čakam do owerflowa
{
TMR0=97; //ponastavimo števec
TMR0IF=0; // zbrišemo zastavico za overflov
cas++; //povečamo vrednost za 1
}
}
} |
To sedaj uporabljam kot subrutino, tako da ko jo rabim jo lepo kličem iz kode. Spremenil bom edino da bo v while zanki cas manjsi od neke druge konstante ki jo bom sprotoma po zelji nastavljal v kodi, tako da bom vedno uporabil isto subrutino, le ta drugo konstanto bom nastavil na željeni čas!
Je že res da se tudi počasi kam pride - oziroma se skapira kaj
EDIT:
Pravkar opažam, da se pri skoku v rutino vrednost spremenljivke ki je bila pred tem že nastavljena pobriše, saj jo je potrebno v rutini deklarirati na novo.
Je to možno kako rešiti da bi ostala vrednost spremenljivke tista iz main programa?
EDIT2 - Nevermind edit, ker sem imel spremenljivki nastavljeni v vsakem podprogramu posebej, zato mi jo je vsakič povozilo, sedaj sem jo nastavil na začetku kot globalno in zadeva špila  |
|
Nazaj na vrh |
|
 |
j0e Član

Pridružen-a: Tor 27 Maj 2008 14:16 Prispevkov: 13 Aktiv.: 0.06 Kraj: Črna na Koroškem
|
Objavljeno: Sre Jun 18, 2008 3:16 pm Naslov sporočila: |
|
|
No tukaj je pa razlog zakaj sem sploh potreboval to  |
|
Nazaj na vrh |
|
 |
Srecko Član


Pridružen-a: Čet 25 Dec 2003 21:29 Prispevkov: 1014 Aktiv.: 4.28 Kraj: Okolica Cerkna
|
Objavljeno: Sre Jun 18, 2008 3:41 pm Naslov sporočila: |
|
|
j0e je napisal/a: |
No tukaj je pa razlog zakaj sem sploh potreboval to  |
Jah jaz na tem linku vidim samo en zelo slab zmazan posnetek.
LP Srečko _________________ Samouk
Tukaj sem doma |
|
Nazaj na vrh |
|
 |
j0e Član

Pridružen-a: Tor 27 Maj 2008 14:16 Prispevkov: 13 Aktiv.: 0.06 Kraj: Črna na Koroškem
|
Objavljeno: Sre Jun 18, 2008 11:06 pm Naslov sporočila: |
|
|
ja, naj bi se videla simulacija semaforiziranega križišča. |
|
Nazaj na vrh |
|
 |
Jernej Š. Član

Pridružen-a: Pon 25 Jun 2007 23:33 Prispevkov: 83 Aktiv.: 0.38 Kraj: Primorska
|
Objavljeno: Pet Jun 20, 2008 12:53 pm Naslov sporočila: |
|
|
Citiram: |
EDIT:
Pravkar opažam, da se pri skoku v rutino vrednost spremenljivke ki je bila pred tem že nastavljena pobriše, saj jo je potrebno v rutini deklarirati na novo.
Je to možno kako rešiti da bi ostala vrednost spremenljivke tista iz main programa?
|
Spremenljivko deklariraj v funkciji z besedico "static" (primer: static int ime_spremenljivke;). Globalnih spremenljivk se je dobro čim bolj izogibati, ker slabšajo preglednost in berljivost programa. |
|
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: 490 dni
Powered by phpBB © 2001, 2005 phpBB Group
|