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 

Časovna zanka v C

 
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
j0e
Član
Član



Pridružen-a: Tor 27 Maj 2008 14:16
Prispevkov: 13
Aktiv.: 0.06
Kraj: Črna na Koroškem

PrispevekObjavljeno: Čet Maj 29, 2008 6:31 pm    Naslov sporočila:  Časovna zanka v C Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
gumby
Član
Član



Pridružen-a: Sob 28 Apr 2007 12:32
Prispevkov: 4066
Aktiv.: 18.42

PrispevekObjavljeno: Čet Maj 29, 2008 6:51 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Glitch
Član
Član



Pridružen-a: Pet 07 Apr 2006 11:40
Prispevkov: 1477
Aktiv.: 6.32

PrispevekObjavljeno: Čet Maj 29, 2008 7:52 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
trully1
Član
Član



Pridružen-a: Pet 14 Nov 2003 20:20
Prispevkov: 216
Aktiv.: 0.91
Kraj: Železniki

PrispevekObjavljeno: Čet Maj 29, 2008 8:05 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
gumby
Član
Član



Pridružen-a: Sob 28 Apr 2007 12:32
Prispevkov: 4066
Aktiv.: 18.42

PrispevekObjavljeno: Čet Maj 29, 2008 8:06 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
gumby
Član
Član



Pridružen-a: Sob 28 Apr 2007 12:32
Prispevkov: 4066
Aktiv.: 18.42

PrispevekObjavljeno: Čet Maj 29, 2008 8:38 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Glitch
Član
Član



Pridružen-a: Pet 07 Apr 2006 11:40
Prispevkov: 1477
Aktiv.: 6.32

PrispevekObjavljeno: Čet Maj 29, 2008 8:44 pm    Naslov sporočila:   Odgovori s citatom

gumby je napisal/a:

Ja, v knjiznici so...


OK
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
j0e
Član
Član



Pridružen-a: Tor 27 Maj 2008 14:16
Prispevkov: 13
Aktiv.: 0.06
Kraj: Črna na Koroškem

PrispevekObjavljeno: Tor Jun 03, 2008 2:05 pm    Naslov sporočila:   Odgovori s citatom

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 Very Happy

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 Very Happy
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
j0e
Član
Član



Pridružen-a: Tor 27 Maj 2008 14:16
Prispevkov: 13
Aktiv.: 0.06
Kraj: Črna na Koroškem

PrispevekObjavljeno: Sre Jun 18, 2008 3:16 pm    Naslov sporočila:   Odgovori s citatom

No tukaj je pa razlog zakaj sem sploh potreboval to Smile
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Srecko
Član
Član



Pridružen-a: Čet 25 Dec 2003 21:29
Prispevkov: 1014
Aktiv.: 4.28
Kraj: Okolica Cerkna

PrispevekObjavljeno: Sre Jun 18, 2008 3:41 pm    Naslov sporočila:   Odgovori s citatom

j0e je napisal/a:
No tukaj je pa razlog zakaj sem sploh potreboval to Smile

Jah jaz na tem linku vidim samo en zelo slab zmazan posnetek.

LP Srečko

_________________
Samouk
Tukaj sem doma
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
j0e
Član
Član



Pridružen-a: Tor 27 Maj 2008 14:16
Prispevkov: 13
Aktiv.: 0.06
Kraj: Črna na Koroškem

PrispevekObjavljeno: Sre Jun 18, 2008 11:06 pm    Naslov sporočila:   Odgovori s citatom

ja, naj bi se videla simulacija semaforiziranega križišča.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Jernej Š.
Član
Član



Pridružen-a: Pon 25 Jun 2007 23:33
Prispevkov: 83
Aktiv.: 0.38
Kraj: Primorska

PrispevekObjavljeno: Pet Jun 20, 2008 12:53 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
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: 490 dni


Powered by phpBB © 2001, 2005 phpBB Group