PIC16F876A nejde __delay_ms(500);

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
Jeejda_teda_puvodne
Příspěvky: 142
Registrován: 08 dub 2012, 02:00

#16 Příspěvek od Jeejda_teda_puvodne »

Naposledy upravil(a) Jeejda_teda_puvodne dne 25 říj 2016, 19:57, celkem upraveno 1 x.

Uživatelský avatar
MiloPS3
Příspěvky: 259
Registrován: 07 srp 2010, 02:00

#17 Příspěvek od MiloPS3 »

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

Uživatelský avatar
mtajovsky
Příspěvky: 3694
Registrován: 19 zář 2007, 02:00
Bydliště: Praha

#18 Příspěvek od mtajovsky »

petrfilipi píše:... Ř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é?

petrfilipi
Příspěvky: 2551
Registrován: 13 zář 2005, 02:00

#19 Příspěvek od petrfilipi »

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

Uživatelský avatar
Jeejda_teda_puvodne
Příspěvky: 142
Registrován: 08 dub 2012, 02:00

#20 Příspěvek od Jeejda_teda_puvodne »

Naposledy upravil(a) Jeejda_teda_puvodne dne 25 říj 2016, 19:58, celkem upraveno 1 x.

petrfilipi
Příspěvky: 2551
Registrován: 13 zář 2005, 02:00

#21 Příspěvek od petrfilipi »

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

Uživatelský avatar
Jeejda_teda_puvodne
Příspěvky: 142
Registrován: 08 dub 2012, 02:00

#22 Příspěvek od Jeejda_teda_puvodne »

Naposledy upravil(a) Jeejda_teda_puvodne dne 25 říj 2016, 19:58, celkem upraveno 1 x.

Uživatelský avatar
Pawalo
Příspěvky: 87
Registrován: 06 říj 2005, 02:00
Bydliště: Tábor
Kontaktovat uživatele:

#23 Příspěvek od Pawalo »

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é...

Uživatelský avatar
Jeejda_teda_puvodne
Příspěvky: 142
Registrován: 08 dub 2012, 02:00

#24 Příspěvek od Jeejda_teda_puvodne »

Naposledy upravil(a) Jeejda_teda_puvodne dne 25 říj 2016, 19:59, celkem upraveno 1 x.

Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 01:00

#25 Příspěvek od AB1 »

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á.

petrfilipi
Příspěvky: 2551
Registrován: 13 zář 2005, 02:00

#26 Příspěvek od petrfilipi »

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

Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 01:00
Bydliště: Praha

#27 Příspěvek od FHonza »

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.

Uživatelský avatar
mtajovsky
Příspěvky: 3694
Registrován: 19 zář 2007, 02:00
Bydliště: Praha

#28 Příspěvek od mtajovsky »

petrfilipi píše:...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.

Uživatelský avatar
Jeejda_teda_puvodne
Příspěvky: 142
Registrován: 08 dub 2012, 02:00

#29 Příspěvek od Jeejda_teda_puvodne »

Naposledy upravil(a) Jeejda_teda_puvodne dne 25 říj 2016, 20:00, celkem upraveno 1 x.

petrfilipi
Příspěvky: 2551
Registrován: 13 zář 2005, 02:00

#30 Příspěvek od petrfilipi »

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

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“