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í 

PIC16F876A nejde __delay_ms(500);
Jdi na stránku Předchozí  1, 2
 
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
MiloPS3



Založen: Aug 07, 2010
Příspěvky: 262

PříspěvekZaslal: pá květen 15 2015, 16:57    Předmět: Citovat

ne,mel sam zjistit proc to nefunguje ,a kdyby to skusil mozna pride na to ze to neni nic slozityho zapnout hlavu nez zalozit novy topik

citace:
Když ono je založit novej topic na fóru snažší než používat google, datasheet, microchipí stránky s examplama a appnotama nebo nedejbože mozek
tohle je samozrejme pravda
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
mtajovsky



Založen: Sep 19, 2007
Příspěvky: 3697
Bydliště: Praha

PříspěvekZaslal: pá květen 15 2015, 22:17    Předmět: Citovat

petrfilipi napsal(a):
... Řekl bych, že stejně můžeš odskočit jen do přerušení, a do toho odskočíš jak z čekání 10ms, tak 1s.
Věc je v tom, že byste tam žádné čekání mít neměl, určitě ne v řádu 10 ms, natož 1 s. Co když v aplikaci chcete bliknout 1 s ledkou, ale v tu dobu obsluha stiskne nějaké ovládací tlačítko. To bude čekat celou 1 s na reakci a po tu dobu držet tlačítko stisknuté?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
petrfilipi



Založen: Sep 13, 2005
Příspěvky: 2656

PříspěvekZaslal: so květen 16 2015, 7:01    Předmět: Citovat

Když chci bliknout ledkou při čekání 1s, tak klidně bliknu. Např. v MikroPascalu existuje sice příkaz delay_ms(1000), ale ten se samozřejmě takto do PICu nenahraje. PIC nezná nic takového jako delay. Ale uvedený příkaz se přeloží jako (PIC 16F12F675, 4MHz):
;MyProject.mpas,7 :: delay_ms(1000);
MOVLW 6
MOVWF R11+0
MOVLW 19
MOVWF R12+0
MOVLW 173
MOVWF R13+0
L__main1:
DECFSZ R13+0, 1
GOTO L__main1
DECFSZ R12+0, 1
GOTO L__main1
DECFSZ R11+0, 1
GOTO L__main1
NOP
NOP

A pokud vstup od tlačírka nadefinuji jako vstup, který bude inicializovat přerušení, tak po dokončení jakékoli z výše uvedených instrukci program odskočí do přerušení. A tam bude napsáno "invertuj výstup pro LED". Celý příkaz delay_ms(1000) se přeloží do 14 instrukcí a do přerušení se skáče po dokončení právě probíhající instrukce (většina instrukcí trvá 4 takty hodin, jen GOTO může trvat až 8 taktů).

Takže v čekací smyčce bliknu tolikrát, kolikrát stihnu fyzicky zmáčknout tlačítko.

Právě pro tyto účely je v procesorech přerušení.

Jinými slovy - vývojové prostředí pro přeložení čekacích smyček musí znát frekvenci hodin pro PICa, pak vypočte dobu 1 instrukce a za sebe dá tolik skokových instrukcí, aby jejich provádění trvalo právě 1s. A ještě to "doladí" dvěmi NOP instrukcemi na konci.

Petr Filipi
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Jeejda_teda_puvodne



Založen: Apr 08, 2012
Příspěvky: 142

PříspěvekZaslal: so květen 16 2015, 7:23    Předmět: Citovat



Naposledy upravil Jeejda_teda_puvodne dne út říjen 25 2016, 18:58, celkově upraveno 1 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
petrfilipi



Založen: Sep 13, 2005
Příspěvky: 2656

PříspěvekZaslal: so květen 16 2015, 9:05    Předmět: Citovat

A vidíš, já tu prasárnu dělám a prostě žiju s vědomím, že některé události nezpracovává hlavní program, ale jsou řízeny přes přerušení. Podle mě je pak program přehlednější a přerušovací vstupy jsou vyhodnoceny "v reálném čase".
Ale jinak chápu, že každý programátor napíše program se stejným zadáním trochu jinak.
Nedávno jsem řešil ochranu motoru kuželové štípačky při zastavení motoru silným špalkem. Vstup od indukčního čidla na vrtuli motoru byl připojen na přerušovací vstup a šlape to jak hodinky (švýcarské). Řešil jsem to tak, že v hlavním programu jsem nahodil příznak pro vypnutí a počkal 30ms. Když se motor otáčel, tak spolehlivě do 30ms vynuloval příznak přerušení. Po 30ms jsem tedy měl buďto příznak vynulovaný, protože se motor točí, nebo ne a vypnul jsem ho. A celkově to bylo napsané na pár řádcích.
Já prostě jdu cestou přehledného kódu, protože i když si samozřejmě píšu k programu komentáře, tak po čase stejně nevím, co jsem psal.

Petr Filipi
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Jeejda_teda_puvodne



Založen: Apr 08, 2012
Příspěvky: 142

PříspěvekZaslal: so květen 16 2015, 9:16    Předmět: Citovat



Naposledy upravil Jeejda_teda_puvodne dne út říjen 25 2016, 18:58, celkově upraveno 1 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Pawalo



Založen: Oct 06, 2005
Příspěvky: 87
Bydliště: Tábor

PříspěvekZaslal: so květen 16 2015, 11:45    Předmět: Citovat

toto by mě velice zajímalo. proč nemůže být tlačítko na přerušovacim vstupu? nikdy sem nikde nenarazil na článek kde by to bylo vysvětlené...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Jeejda_teda_puvodne



Založen: Apr 08, 2012
Příspěvky: 142

PříspěvekZaslal: so květen 16 2015, 14:00    Předmět: Citovat



Naposledy upravil Jeejda_teda_puvodne dne út říjen 25 2016, 18:59, celkově upraveno 1 krát.
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 květen 18 2015, 15:53    Předmět: Citovat

citace:
toto by mě velice zajímalo. proč nemůže být tlačítko na přerušovacim vstupu?

Stručně řečeno, problém je v tom, že tlačítko (nebo jiný mechanický kontakt) zakmitává.
To způsobí. že jeden stisk vyvolá několik přerušení za sebou.

Řešení je dát časové prodlevy do přerušení (to ale prodlouží obsluhu přerušení),
nebo k tlačítku dát nějaký obvod pro vyfiltrování zákmitů (to zase vyžaduje další součástky).

Proto se tlačítko s přerušením moc nepoužívá.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
petrfilipi



Založen: Sep 13, 2005
Příspěvky: 2656

PříspěvekZaslal: po květen 18 2015, 21:08    Předmět: Citovat

OK, a je to. Stačilo napsat, že tlačítko zakmitává a že při jeho stisku může dojít k vyvolání několika přerušení.
Ono jde i o to, jak tlačítko používám. Třeba mi stačí náběžná hrana a pak je mi jedno, zdali tlačítko zakmitává, protože znovu přerušení třeba už nepovolím.
Prostě si myslím, že zakmitávání tlačítek je jejich vlatnost a kdo chce tlačítko použít pro přerušení, musí se s touto vlatností poprat. A když to nejde, tak to vyřešit nějak jinak (hardwearově, čekací smyčkou po stisku, ...).
Ale napsat že použití tlačítka na přerušení je jako fáze na Z/Ž vodiči, to mi nepřipadá stejné. Ale je to jen můj názor.

Petr Filipi
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
FHonza



Založen: Nov 20, 2012
Příspěvky: 1453
Bydliště: Praha

PříspěvekZaslal: po květen 18 2015, 21:57    Předmět: Citovat

Naopak, u jednoduchých projektů s 3-4 tlačítky, kdy je k dispozici procesor s přerušením po změně hodnoty na každém pinu, je to jednodušší než třeba maticová klávesnice.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
mtajovsky



Založen: Sep 19, 2007
Příspěvky: 3697
Bydliště: Praha

PříspěvekZaslal: po květen 18 2015, 22:28    Předmět: Citovat

petrfilipi napsal(a):
...Právě pro tyto účely je v procesorech přerušení. ...
Je a není. Pokud by na to tlačítko byl navázán nějaký náročný výpočet nebo nedej bože jiné bliknutí jinou LED, tak zůstaneme dlouho v přerušovací rutině a to původní bliknutí se ekvivalentně prodlouží. A to nechceme. A to nemluvím už o tom, že bychom chtěli blikat N ledkami nezávisle na sobě v různých intervalech, k tomu zpracovávat sériový kanál a tak dále. Zkrátka, čekací smyčky se hodí jen pro jednoduché aplikace, nebo velmi krátká čekání v řádu µs, jinak je to plýtvání výkonem procesoru a cesta do pekel.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Jeejda_teda_puvodne



Založen: Apr 08, 2012
Příspěvky: 142

PříspěvekZaslal: út květen 19 2015, 7:38    Předmět: Citovat



Naposledy upravil Jeejda_teda_puvodne dne út říjen 25 2016, 19:00, celkově upraveno 1 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
petrfilipi



Založen: Sep 13, 2005
Příspěvky: 2656

PříspěvekZaslal: út květen 19 2015, 9:31    Předmět: Citovat

Pánové, nenechte prchlivost cloumat Vašimi majestáty.
Vždyť pouze diskutujeme, a to (naštěstí) v pohodě, bez osobních útoků a invektiv.

On každý, kdo použije tlačítko na přerušovacím vstupu se dřív nebo později seznámí s jeho "špatnými" vlastnostmi. A jak jsem psal, musí se s nimi nějak poprat. A možná ho nakonec z toho přerušení vyhodí.
Existuje přece ale celá nepřeberná řada projektů od jednoducých až po extrémně složité a můj názor je ten, že někde to jde, jinde ne, záleží na konkrétní aplikaci.
Podle mě je dostačující rada ta, že pokud někdo použije tlačítko na vstupu vyvolávajícím přerušení tak že musí počítat s odskoky, protože obecně je přerušení mnohem kratší než doba odskoků tlačítka a může tedy dojít k několikanásobnému vyhodnocení a spuštění přerušení.
Ono i při psaní klasického programu mimo přerušení je potřeba mít na paměti, že odskoky jsou. A zase jenom u některých projektů. Když něco spustím náběžnou hranou od tlačítka a mám za tím dvě instrukce a pak se vrátím na detekci tlačítka, tak mi to taky asi nebude fungovat. Ale když budu mít za tlačítkem hromadu instrukcí jejichž zpracování trvá 0,1s, tak se odskoků asi mát nemusím, i když třeba podle tohoto dokumentu http://www.eng.utah.edu/~cs5780/debouncing.pdf mohou být odskoky ještě delší.

PF
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
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
Jdi na stránku Předchozí  1, 2
Strana 2 z 2

 
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.17 sekund