Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

současný běh dvou funkcí

 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
pirat077



Založen: May 02, 2014
Příspěvky: 324

PříspěvekZaslal: ne listopad 09 2014, 22:21    Předmět: současný běh dvou funkcí Citovat

Ahoj,
jsem začátečník,
chtěl bych udělat počítadlo pulzů (vstup + sedmisegmentovka)

Jen mi není jasný, jak se dělá to, že běží jedna fce + druhá k tomu
(Ideálně pořád svítí LEDka=zapnuto, počítají se pulzy, zobrazuje se číslo)

Pro zjednodušení program:
Jedna ledka pořád svítí + druhý dvě na jiným portu bliknou:

tohle logicky nemůže fungovat:

int main (void){
DDRB=0xff;
DDRC=0xff;
while(1)
{
PORTC=0b11111111;
}

for(char n=0;n<2;n++)
{
PORTB=0b00010000;
_delay_ms(400);
PORTB=0b00000000;
_delay_ms(400);
}}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
mikollar



Založen: Dec 26, 2004
Příspěvky: 1426
Bydliště: Košice - okolie

PříspěvekZaslal: po listopad 10 2014, 6:38    Předmět: Citovat

Vacsinou sa to riesi prerusenim, zapnes prerusenie pre vstup na ktorom chces pocitat impulzy.

Dalsie prerusenie bude dajme to mu od casovaca cca 25Hz(resp viac ak mas viac segmentov), v tomto preruseni budes multiplexovat displej. A ostatne mozes hodit do hlavnej slucky, alebo do dalsieho prerusenia a zbytok casu moze procesor byt v sleep
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
AB1



Založen: Nov 23, 2009
Příspěvky: 312

PříspěvekZaslal: po listopad 10 2014, 10:39    Předmět: Citovat

kód:
int main (void){
   DDRB=0xff;
   DDRC=0xff;
   PORTC
   while(1)
   {
      PORTC=0b11111111;
   }

   for(char n=0;n<2;n++)
   {
      PORTB=0b00010000;
      _delay_ms(400);
      PORTB=0b00000000;
      _delay_ms(400);
}}

Toto jistě fungovat nebude, protože program bude běžet v nekonečné smyčce while(1) a dál se nikdy nedostane.
(Pozn.: Pokud má ledka na PORTC stále svítit, tak stačí nastavit PORTC jednou, před vstupem do hlavní smyčky while(1). )

Trochu obměním kód.
kód:
   while(1)
   {
      PORTC = ~PORTC; // invertuj všechny bity portu C.

      for(char n=0;n<2;n++)
      {
         PORTB = 0b00010000;
         _delay_ms(400);
         PORTB = 0b00000000;
         _delay_ms(400);
      }
   }
Teď to funguje, program bliká současně na obou portech s různou frekvencí.

Ale přitom nedělá "dvě funkce současně".
Napřed invertuje portC.
Pak dvakrát blikne ledkou na PORTB.4.
Pak opět invertuje portC.
Atd.

citace:
Jen mi není jasný, jak se dělá to, že běží jedna fce + druhá k tomu
(Ideálně pořád svítí LEDka=zapnuto, počítají se pulzy, zobrazuje se číslo)

Např. jednoduše takto:
Využiješ toho, že timery se dají přepnout do módu čítání impulsů.
V tomto módu timer počítá impulsy nezávisle na hlavním programu.

kód:
// atmega8
//-------------------------------------
int main(void)
{
uint16_t pocet_pulsu;

   // nastav timer1 do režimu čítání impulsů na pinu T1
   TCCR1B = 0b111;
   // vynuluj timer1
   TCNT1 = 0;
   DDRC = 0xff;
   PORTC = 0xff; // ledka na portC svítí
   
   while(1)
   {
      pocet_pulsu = TCNT1;   
      zobraz hodnotu pocet_pulsu;
      _delay_ms(200);
   }
}


Pokud použiješ sedmisegmentovky, tak ovšem musíš přidat přerušení pro multiplex, jak píše mikollar.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frpr666



Založen: Dec 28, 2009
Příspěvky: 1051

PříspěvekZaslal: po listopad 10 2014, 21:52    Předmět: Citovat

Podívej se na Application note na atmel.com. Tam je vzorový projekt na svítilnu s ledkou. Svícení, blikání, čtení tlačítka, pwm výstup.
Pro začátek doporučuji Arduino. Very Happy
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Celeron



Založen: Apr 02, 2011
Příspěvky: 17858
Bydliště: Nový Bydžov

PříspěvekZaslal: po listopad 10 2014, 22:04    Předmět: Citovat

Copak jedno přerušení. Smile To když začneš používat všech 8 přerušení, co mikroprocesor má a priority přerušení nejdou optimálně nastavit a navíc když už nestačej banky alternativních registrů, to je teprv vzrůšo napsat program, kterej by správně makal za všech okolností Wink
Jirka
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
WLAB



Založen: Sep 13, 2005
Příspěvky: 867
Bydliště: Praha

PříspěvekZaslal: po listopad 10 2014, 22:37    Předmět: Citovat

Predevsim, dve "funkce" nepobezi nikdy soucasne - pokud se tedy bavime o jednojadrovem MCU. Jejich beh se musi nejak "prepinat" a bezi pak zdanlive soucasne. K tomu muze slouzit preruseni (vhodne jen pro "paralelizaci" vysokoprioritnich funkci), nebo kooperativni multitasking realizovany treba uvnitr while(1) smycky, nebo preemptivni multitasking realizovany treba nejakym RTOSem.
_________________
de omnibus dubitandum est
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pirat077



Založen: May 02, 2014
Příspěvky: 324

PříspěvekZaslal: po listopad 17 2014, 0:47    Předmět: Citovat

Díky za odpovědi,
už se mi povedlo udělat program téměř podle mých představ Wink

Když jsem řešil to přerušení, napadla mě takové (typicky české) řešení...potřeboval bych daleko větší čas přerušení (třeba 100ms), což s 4MHz krystalem neudělám...

...tak jsem zkoušel, co to udělá, když se do programu deklaruje 8MHz a krystal bude pořád stejnej...

Zvláštní je, že to funguje u fce _delay_ms(), ale u přerušení to zřejmě nefunguje

...tak jsem to přestal řešit a pustil se do PWM Very Happy
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pirat077



Založen: May 02, 2014
Příspěvky: 324

PříspěvekZaslal: po listopad 17 2014, 20:07    Předmět: Citovat

A teď jsem zjistil, že řeším naprostou ptákovinu...

Pro další nováčky: (počítání přetečení T1)

ISR (TIMER0_OVF_vect){
TCNT0 = 0; // nastavení počáteční hodnoty počítadla

if (T1==30) // kolikrat pretekl TIMER1
{
if (cislice==10) //pokud je cislo vetsi jak 9
{
cislice=0;
ukazC (cislice);
cislice++;
}
else
{
ukazC (cislice);
cislice++;
}
T1=0;
}
T1++;
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
WLAB



Založen: Sep 13, 2005
Příspěvky: 867
Bydliště: Praha

PříspěvekZaslal: po listopad 17 2014, 21:25    Předmět: Citovat

proc je tam TCNT0=0;? Rekl bych, ze to tam akorat zanasi systematickou odchylku. TCNT bude 0 hned pri preteceni a pokud ISR nastane z nejakeho duvodu pozdeji, TCNT uz muze byt jinde, ale nastavi se zpet na 0...

A

kód:

ukazC (cislice);
cislice++;


by mohlo byt mimo ten if, ne?

_________________
de omnibus dubitandum est
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Celeron



Založen: Apr 02, 2011
Příspěvky: 17858
Bydliště: Nový Bydžov

PříspěvekZaslal: po listopad 17 2014, 23:47    Předmět: Citovat

to pirat: Teď jsem si vzpoměl, že na tohle už léta dělá Intersil švába. ICL7216 to asi není, kdybych hledal, nekde ho mám. Umí počítadlo 0-999 na 3 multiplexní segnentovky. Možná i na 4, už si to nepamatuju. Vstupy jsou ošetřený proti zákmitům, umí nahoru, dolů, reset a set. Set se nastavuje třeba z BCD palcovýho přepínače. Myslím, že to hlásí přetečení na další brouka a vynulování. Kdysi se to dávalo s generátorem 1s jako časovač do pece na vytvrzování skel do brejlí. Ale v tý době ještě oční optika byli optici a ne prodavači.
Jirka
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rnbw



Založen: Mar 21, 2006
Příspěvky: 33989
Bydliště: Bratislava

PříspěvekZaslal: út listopad 18 2014, 0:00    Předmět: Citovat

Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pirat077



Založen: May 02, 2014
Příspěvky: 324

PříspěvekZaslal: út listopad 18 2014, 1:21    Předmět: Citovat

Moje programování zdaleka nekončí touto funkcí Wink

Už dlouho jsem se tomuto tématu věnoval, ale pořád jsem se nějak nemohl pustit do pořádnýho programování

Teď mám zdravotní volno a pustil jsem se do toho ve velkým!
Už mám naprogramovanou čtyřcifernou sedmisegmentovku, čítač (a odečítač Very Happy ) pulzů ze dvou 555 (s proměnnou dobou 1 a 0) Wink

Teď bych ještě rád přepojil sedmisegmentovku na posuvnej registr a nastudoval PWM a nějaký typy úspornejch režimů včetně nějakýho podtaktování na snížení spotřeby. Potom jdu na LCD Wink

Je až neuvěřitelný, jak rychle se na to všechno dá přijít když se do toho člověk fakt vrhne Wink
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Karel4



Založen: Apr 27, 2014
Příspěvky: 11

PříspěvekZaslal: ne listopad 30 2014, 14:09    Předmět: Citovat

Jenom bych nabídnul jinou funkci k invertování bitu na portu
kód:

... místo ...

PORTB=0b00010000;
_delay_ms(400);
PORTB=0b00000000;

... můžeš napsat  ...

PORTB ^=0b00010000;
_delay_ms(400);


... a bude to mít stejný efekt :-)
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Rako



Založen: Mar 29, 2014
Příspěvky: 40

PříspěvekZaslal: pá leden 30 2015, 11:39    Předmět: Citovat

pirat077 napsal(a):
Díky za odpovědi,
Když jsem řešil to přerušení, napadla mě takové (typicky české) řešení...potřeboval bych daleko větší čas přerušení (třeba 100ms), což s 4MHz krystalem neudělám...


Toto je trik ktorým oblbneš simulátor ale nie mikrokontrolér, ten bude mať
takt podľa pripojeného kryštálu.Nechápem ako súvisí frekvencia kryštálu
s prerušením.Pokiaľ chceš vytvoriť časovú základňu pomocou časovača pre dlhšie časy,stačí v prerušení od pretečenia časovača dekrementovať ďalšie počítadlo.Keď bude počítadlo na nule, čas vypršal.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra.
Nemůžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Nemůžete připojovat soubory k příspěvkům
Můžete stahovat a prohlížet přiložené soubory

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.22 sekund