Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: Kam umístit smyčku když chci "udělat dvě věci zároveň" ?  (Přečteno 1378 krát)

LuciusMare

  • Závislák
  • ***
  • Příspěvků: 1749
Zdravím, mám smyčku kterou potřebuji neustále provádět, ale "mezitím" potřebuji provádět jiné akce. Vypadá to takhle, mám microcontroller, a čtyři 7-segmentové displeje, a každý signálový kabel vede přes všechny displeje. Takže samostatné displeje přes tranzistor zapínám a vypínám tak rychle aby to oko vidělo jako konstantní svícení (displej 1 zapnut,signál vyslán - nemá kam jinam jít než do displeje 1,displej 1 vypnut,displej 2 zapnut,signál vyslán,signál nemá kam jinam jít než do displeje 2...) Takže potřebuji aby se smyčka neustále prováděla,nejlépe "bez prodlev" ale potřebuji udělat ostatní věci, jako jsou třeba měření. Vůbec nevím jak to udělat, kdybych to udělal takhle:
Kód: [Vybrat]
dokud (1=1) dělej{
    změř(teplotu,proměnnáteplota1);
    zobrazdisplej(proměnnáteplota1);
}

Tak se provede změření teploty,to se zobrazí na displej, ten problikne, zase se čeká na teplotu, pak to problikne znova... (Těch akcí je víc, takže to bude hodně znatelné)
Vím že to možná není nejjednodušší řešení ale potřebuji to takhle vyřešit, nemá někdo nějaký nápad?
Děkuji.
edit: v programování to není z toho důvodu že se programuje microcontroller :)
« Poslední změna: 21 Prosince 2009, 23:24:32 od LuciusMare »
Citace
<Firzen> tak teď budu Číňan
<Firzen> tak uvidíme :D
Jabber: LuciusMare (zkroucenina) jabbim (tecka) cz

jfoot

  • Aktivní člen
  • *
  • Příspěvků: 197
  • ..nemožné ihned, zázraky do tří dnů...
Re: Kam umístit smyčku když chci "udělat dvě věci zároveň" ?
« Odpověď #1 kdy: 22 Prosince 2009, 00:16:14 »
Zdravím Lucia Mare,
edit: v programování to není z toho důvodu že se programuje microcontroller :)

klidně bych tam ten topic přemístil, zaslouží si to už proto, že Slovo, které bylo na Počátku, následoval
vzápětí  mikroprocessor Intel 4004....  :D

Vím že to možná není nejjednodušší řešení ale potřebuji to takhle vyřešit, nemá někdo nějaký nápad?
Děkuji.

Tohle se řeší standardně přes přerušovací systém daného mikroprocesoru. Napište, jaký máte mikroprocesor (či mikrokontrolér) a zdali programujete v assembleru či C. Pokud to bude některý z řady MCS 51, ATMEL AVR, MOTOROLA (HC 08) rád Vám podám detailnější info včetně nějakých prográmků, napište mi prosím zprávu přes fórum, můžeme ale klidně debatovat na toto téma v jeho rámci...
« Poslední změna: 22 Prosince 2009, 00:20:20 od jfoot »
Po šesté atomové válce  povrch planety Rogoz nevypadal pěkně...

Dítě nevinné...Co ty můžeš vědět...o sadomasochistické derivaci oidipovského komplexu...(O.Neff, K. Saudek, Arnal & Dva dračí zuby)

Martin Kiklhorn

  • Člen občanského sdružení Ubuntu ČR a placené komunitní podpory
  • Administrátor fóra
  • Závislák
  • ******
  • Příspěvků: 4807
  • グーグル!ご存知ですか?
    • HEJ
Re: Kam umístit smyčku když chci "udělat dvě věci zároveň" ?
« Odpověď #2 kdy: 22 Prosince 2009, 00:46:21 »
Prima Lucie, už jsi kousek pokročil  ;)
Jak píše jfoot, nastav si nějaké přerušení (třeba generované čítačem) kterého obsluha bude dělat jediné - načte data z nějakého pevného místa z paměti (nazvěme to videoram), hodí je na displej a vrátí se z přerušení.
Pokud bys potřeboval velmi rychlou odezvu pro "ostatní věci" tak při každém přerušení můžeš obsloužit jen jeden segment a pozici si udržovat v nějaké pomocné proměnné.
Pak v "hlavním programu" zapíšeš data do "videoram" a víc se o ně nestaráš. Až přijde přerušení tak si jeho obslužná rutina zobrazí na displej.

//a klidně to do programování přesouvám, na konkrétním procesoru zas tak moc nesejde.
« Poslední změna: 22 Prosince 2009, 00:51:35 od kiklhorn »
Jsou ve vašem dotazu OPRAVDU VŠECHNY vám dostupné informace o problému?
Linux user since 2007-10-11, Registered #456007
Virtual
| Distribuce
~/slozka znamená /home/"vase jmeno"/slozka
6521 69DE 0F34 FCBC FB1D  DE76 360E 52B2 F71A B8E8

LuciusMare

  • Závislák
  • ***
  • Příspěvků: 1749
Re: Kam umístit smyčku když chci "udělat dvě věci zároveň" ?
« Odpověď #3 kdy: 22 Prosince 2009, 10:23:14 »
Ono nakonec nezáleží v jakém jazyku to bude (i když to bude nejpravděpodobněji C) , právě proto jsem to taky napsal v pseudokódu. Nevím jak ten kód má vypadat, proto bych spíš chtěl nějak zhruba jak to bude :)
Citace
<Firzen> tak teď budu Číňan
<Firzen> tak uvidíme :D
Jabber: LuciusMare (zkroucenina) jabbim (tecka) cz

jfoot

  • Aktivní člen
  • *
  • Příspěvků: 197
  • ..nemožné ihned, zázraky do tří dnů...
Re: Kam umístit smyčku když chci "udělat dvě věci zároveň" ?
« Odpověď #4 kdy: 22 Prosince 2009, 12:59:49 »
Zdravím kiklhorn a LuciusMare,

... na konkrétním procesoru zas tak moc nesejde.

Ano, nesejde, pokud program, který reálně řeší problematiku nepotřebuje
žádnou vazbu na použitou platformu anebo okolí. Což v případě Lucia Mare neplatí :
jeho program minimálně musí použít přerušovací systém , což si vyžaduje základní nastudování
architektury přerušení zcela konkrétního mikroprocessoru, dále bude nucen použít minimálně
aspoň jeden timer/counter (další studium konkrétní platformy).

S konkrétním typem mikroprocessoru je i svázán konkrétní typ použitého vyššího programovacího jazyka,
použitého pro vývoj programu (lépe aplikace).
Předpokládám, Lucie Mare, že budete psát aplikaci ve vyšším programovacím jazyce (C, Modula) a nebudete
mít k dispozici profesionální prostředky pro vývoj sw pro mikroprocessory (i když i zde se dají
získat profi tools, zdarma, které mají omezenou funkcionalitu, ale pro Váš účel by bohatě vyhověly...).
Nakrásně můžete napsat aplikaci pro mikroprocessor
třeba v Javě (reálně se používá např. na některých processorech Dallas)
a pak můžete tu aplikaci zrovna poslat do stoupy, protože nebudete mít překladač z Javy do nativního code
použitého mikroprocessoru (leda byste si koupil development tools, které to umožňují, samozřejmě nezanedbatelné ceny..).
Čili opět budete muset znát konkrétní typ processoru a potažmo i typ jazyka použitého pro vývoj sw.

Problematika vývoje sw pro mikroprocessory leží mj. právě v jejich  vazbě na konkrétní prostředí,
tedy processor, na kterém poběží. Na určitém processoru máte určité funkční moduly k dispozici, na jiném ne,
některý processor je lépe připraven na řešení realtime aplikací, jiný ne, ale ten jiný má třeba
implementován prostředky pro komunikaci v ethernetovské síti, některý processor koupíte za pár Kč, na netu
je pro něj sposusta aplikací  v C, pro jiný abyste aplikace hledal mikroskopem, atd..

Dle mých zkušeností vývoj aplikace pro mikroprocessor nezačíná napsáním programu, ale právě výběrem mikprocessoru.

Osobně bych Vám doporučil : podle povahy řešení vybrat mikroprocessor, najít dostupné tools pro vývoj sw
k tomuto processoru,  ověřit dostupnost tools pro ladění programu k vybranému processoru , hlavně debugger a simulátor,
emulátor ve Vašem případě asi ne
a v neposlední řadě mít jistotu, že vyvinutou a odladěnou aplikaci budete také schopen fyzicky
v daném processoru spustit (pochybuju, že budete aplikaci spuštět z externí paměti), tedy že ji budete schopen do toho processoru
v rámci Vašich možností nahrát..

kiklhorn zde podal naprosto pregnantní řešení Vašeho problému. Na Vás je, abyste zvolil
platformu (mikroprocessor) a vývojové sw technologie a jako poslední bod napsal aplikaci,
což pro Vás, myslím, nebude problém.

 Výběr platformy a vývojové technologie je o hodně nezáviděnáhodnější proces než
samotné naprogramování problému, které často bývá oproti těmto rozhodovacím procesům mnohokrát zábavnější...  :D

P.S. Klidně to napište i v ASM daného processoru...
Pokud tedy budete stát o nějaké zkušenosti, rád Vám je předám, pokud budu vědět, včetně nějakých hotových kusů code v C

Edit : pro inspiraci přikládám malou aplikaci, v nekonečné hlavní smyčce se neděje nic, tam si umístěte rutinu
pro měření, v obslužné rutině pro přerušení od timeru 2 se generují pulsy 10 kHz, tam vložte code pro refresh
7 segment displays, změňte konstantu přetečení timeru2 ze 100 mikros  na nějakých cca 20 mS (tuto periodu mám dojem ještě lidské oko nevnímá jako blikání), pro aplikaci použit mikroprocessor : AT89S52, překladač : Keil.

Kód: [Vybrat]
 
 /*
 * file                          : gen10kHz.c51
 * last updated             : 13.08.2005
 *
 */

/***************************************************************************/
/*                                                                         */
/*   GEN10KHZ  : GENERATOR 10 KHZ                          */
/*                                                                         */
/***************************************************************************/


/*
 *
 *  Veskere casove konstanty vypocteny pro Xtal = 12 Mhz
 *  
 */

#pragma ROM (LARGE)                   /* uvolneni 64 kbyte ROM pro program   */

#include <reg52_e.h>                  /* rozsirena definice registru pro 8052*/
#include <absacc.h>                   /* pristup k absolutnim adresam        */
#include <intrins.h>                  /* knihovna pro nop, crol, atp.        */
#include <stdio.h>                    /* stardard i/o definice               */

#define STO_MIKROS      (256-100)     /* konstanta pro zpozd. 100 mikrosekund*/
#define PADESAT_MIKROS  (256- 50)     /* konstanta pro zpozd.  50 mikrosekund*/

#define LO_PERIOD_2     STO_MIKROS
#define HI_PERIOD_2     0
  
#define CONTROL_TIMER_2  TR2          /* pouze jine jmeno pro TR2            */
#define CONTROL_TIMER_0  TR0          /* pouze jine jmeno pro TR0            */

/* SEKCE DEFINICE JMEN PINU                                                  */
/* ------------------------                                                  */
#define DESET_KHZ_OUT       P10       /* kontrolni vystup 10 kHz             */

/* SEKCE DEFINICE PROMENNYCH TYPU 0/1                                        */
/* ----------------------------------                                        */
#define DISAB               0
#define ENAB                1
#define COUNT_DISAB         0
#define COUNT_ENAB          1
#define STOP                0
#define START               1
#define LOG_0               0
#define LOG_1               1
#define VYPNUTO             0
#define ZAPNUTO             1
#define ZHASNUTO            0
#define ROZSVICENO          1
#define NESTISKNUTO         0
#define STISKNUTO           1        
#define NE                  0
#define ANO                 1  
#define NEBLIKAT            0
#define BLIKAT              1
#define NEPROBIHA           0
#define PROBIHA             1
#define INCORRECT           0
#define CORRECT             1

// local functions
void genInit(void);

/*****************************************************************************/
#pragma REGISTERBANK (1)              /* use Register Bank 1 for coding      */
/*****************************************************************************/

/******************************************************************/
/* Timer 0/2 interrupt service function pro sw timery tim1 a tim2 */
/******************************************************************/

                                      /* timer2 : Int Vector at 002BH        */
                                      /* timer0 : Int Vector at 002BH        */
// timer 2 : void genTimer2(void) interrupt 5 using 1
void genTimer0(void) interrupt 1 using 1
{                      
/*
 * Obsluzna rutina preruseni od hw timeru 2 (pro 8052)/0 (pro 8051)
 *
 * Je volana periodicky, perioda preruseni  je dana nastavenim konstant
 * hw timeru 2 TH2 a TL2 procesoru tak, aby  bylo preruseni vyvolano
 * kazdych 100 mikrosekund
 *
 */


  /* musi byt u hw timeru2 vynulovano jinak okamzite po vystupu z prerus.    */
  /* nastava dalsi preruseni                                                 */
  TF2 = 0;  

  DESET_KHZ_OUT = !DESET_KHZ_OUT;     /* generuj level obd. signalu 10 kHz   */
}
// end function genTimer0()


/*****************************************************************************/
#pragma REGISTERBANK (0)              /* use Register Bank 0 for coding      */
/*****************************************************************************/

/*****************************************************************************/
/* Funkce zajistujici init vsech promennych periferii, atp.                  */
/*****************************************************************************/

void genInit (void) {

/*
 * Provede inicializaci vybranych programovych a systemovych promennych
 */

  /* setup hw timeru 2                                                       */
TH2    = HI_PERIOD_2;      
TL2    = LO_PERIOD_2;
RCAP2H = HI_PERIOD_2;
RCAP2L = LO_PERIOD_2;
T2CON  = (T2CON & 0x00);            /* hw timer2, mode : 16 bit,autoreload */
ET2    = ENAB;                      /* enable hw timer2 interrupt          */

 

  DESET_KHZ_OUT = LOG_1;              /* prvni puls obd. signalu s 10 kHz   */
}
// end function genInit()


/****************/
/* main program */
/****************/

void main (void)  {    

  genInit();                          /* init promennych, periferii, atp...  */
  EA   = ENAB;                        /* povoleni prerus-nast. glob priznaku */
  CONTROL_TIMER_2 = START;          
  while(1){};
}
« Poslední změna: 23 Prosince 2009, 09:46:05 od jfoot »
Po šesté atomové válce  povrch planety Rogoz nevypadal pěkně...

Dítě nevinné...Co ty můžeš vědět...o sadomasochistické derivaci oidipovského komplexu...(O.Neff, K. Saudek, Arnal & Dva dračí zuby)

 

Provoz zaštiťuje spolek OpenAlt.