Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

problem u turbo c-u

[es] :: C/C++ programiranje :: problem u turbo c-u

[ Pregleda: 3812 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

apsolvent1

Član broj: 19443
Poruke: 1
*.rcub.bg.ac.yu



Profil

icon problem u turbo c-u21.01.2004. u 09:41 - pre 246 meseci
Kako se postize periodicno izvrsavanje operacija nakon isteka odredjenog vremena
(npr svakih 110ms) - analogija sa timer kontrolom u visual studiju?

Potrebno mi je naizmenicno ocitavanje sa AD/DA konvertora na svakih 110ms.
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.et.tudelft.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: problem u turbo c-u21.01.2004. u 10:29 - pre 246 meseci
Citat:
Kako se postize periodicno izvrsavanje operacija nakon isteka
odredjenog vremena


U Turbo C-u je jedini izlaz da se zakačiš za tajmerski prekid. Pogledaj
funkcije setintvec i getintvec (valjda se tako zovu). Kako je rezolucija
tajmera poznata, moći ćeš da periodično očitavaš konvertor. Međutim, ako
želiš precizan tajmer nema druge nego da ga napraviš sam pošto PIT nije
dostupan programeru.

(Da ne bude zabune, Turbo C je DOS program koji se koristio početkom
devedesetih godina prošlog veka. Poslednja verzija bila je 2.0 posle
čega je ime promenjeno u Borland C/C++)

f

 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.racasse.se

Sajt: dejan.lekic.org


+2 Profil

icon Re: problem u turbo c-u21.01.2004. u 10:33 - pre 246 meseci
Filipe, nisam ovo probao, ali valja probati...
http://moss.csc.ncsu.edu/~mueller/pthreads/ :)
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.et.tudelft.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: problem u turbo c-u21.01.2004. u 11:05 - pre 246 meseci
Zaboravih da kažem da za digitalnu obradu signala apsolutno mora
da se koristi odabiranje sa stabilnom periodom, tako da su razne
tajmerske kontrole sasvim nepodesne: one garantuju samo da razmak između
dva „okidanja“ neće biti manji od unesene vrednosti, a koliki će razmak
stvarno biti, i kada, to se može utvrditi samo eksperimentom. Ali ako je
džiter (varijacija) preveliki, onda se obesmišljava sva obrada posle
konverzije.

S druge strane ako možeš da tolerišeš džiter tajmerske kontrole iz
Njindonjsa, onda tvoj proces uopšte nije toliko brz da bi mu bilo
neophodno semplovanje od 10Hz - primer je merenje temperature u nekom
industrijskom procesu.

f
 
Odgovor na temu

yooyo

Član broj: 4891
Poruke: 1101
62.108.111.*



Profil

icon Re: problem u turbo c-u21.01.2004. u 13:27 - pre 246 meseci
Citat:
apsolvent1:
Kako se postize periodicno izvrsavanje operacija nakon isteka odredjenog vremena
(npr svakih 110ms) - analogija sa timer kontrolom u visual studiju?

Potrebno mi je naizmenicno ocitavanje sa AD/DA konvertora na svakih 110ms.


Ako to radis pod DOS-om, moraces da se okacis na timer interrupt i da napises svoj
interrupt handler. Ja sam se svojevremeno zezao sa ovim i mogu se napraviti jako precizni tajmeri (ja sam cak terao i do 10KHz). Naravno... veca frekvencija znaci da
se IRQ rutina mora izvrsiti brzo.

Standardno, timer IRQ pod DOS-om okida 18.2 puta u sekundi. Evo malog primera. Code sam pisao za Watcom compiler i nadam se da ce raditi u Turbo C-u.

Code:

#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <stdlib.h>
#include <time.h>

#define INTR 0X08    /* The clock tick interrupt */
void interrupt ( *old8)(void);  /*pointer na stari interapt*/

int count=0;

void interrupt new8(void) /*novi interapt.Procesor zove tu f-ju kad okine*/
                          /*PI kolo.*/
{
   // Tvoja interrupt rutina   
   // ugradi mehanizam koji ce pozivati staru interrupt rutinu
   // u pravilnim vremenskim razmacima (18.2 puta u sec) 
   // tako da se realtime casovnik
   // ne poremeti
   // poziv stare interrupt rutine
   old8();
}

void setRate(unsigned short rate)  /*f-ja za povecanje broja prekida/sec*/
{
   asm { cli
         mov al, 0x36
         out 0x43, al
         mov cx, rate
         mov al, cl
         out 0x40, al
         mov al, ch
         out 0x40, al
         sti
       }
}

void main(void)
{
   unsigned long i;

   printf("\nPritisni neki taster za pocetak testiranja");
   getch();
   old8 = getvect(INTR);/*procitamo pocetnu adresu trenutnog interapta.*/
   setvect(INTR, new8);/*stavljam moj interapt*/
   setRate(0x800);/*postavlja broj okidanja u sec*/
/*vodi racuna o realtime casovniku. Zbog 0x800 (2048) casovnik*/
/*ce "poludeti" i desice se da ce vreme ici "ubrzano"*/
   i=0;
   while (!ESC()) DoSomeJob(); 

   setvect(INTR, old8);
   setRate(0);
}
/* ESC prekid programa */


yooyo
 
Odgovor na temu

[es] :: C/C++ programiranje :: problem u turbo c-u

[ Pregleda: 3812 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.