forum.mcontrollers.com - hlavní stránka forum.mcontrollers.com - fórum

 

.: fórum - hlavní stránka :.
Technology Stronghold by Rudolf Vesely
How to build Microsoft System Center hosted cloud series
FAQFAQ HledatHledat Seznam uživatelůSeznam uživatelů Uživatelské skupinyUživatelské skupiny RegistraceRegistrace
ProfilProfil StatistikaStatistika Soukromé zprávySoukromé zprávy PřihlášeníPřihlášení

 
PIC 16f84A časovač

 
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> Microchip
 
micha408
Nováček
Nováček


Založen: 18.8.2016
Příspěvky: 2

PříspěvekZaslal: 18 srpen 2016, 19:21    Předmět: PIC 16f84A časovač Citovat

Ahoj pokouším se v assembleru naprogramovat časovač. Bohužel se mi nedaří. Mám 4 displeje na prvních dvou chci minuty a na druhém chci vteřiny, tlačítka zatím neřeším časovat začne odpočítávat od 0 do 59 minut a 59 sekund pak se resetuji. Používám multiplexní režim a BCD dekoder.
Toto se mi podařilo naprogramovat jen kdyby měly displeje vlastní paměť na poslední hodnotu kterou dostaly, to ale nemají, takže potřebuji poradit. Vůbec mě nejde dohromady cyklus pro zpoždění a zároveň vysílat data na display ( když probíhá zpožďovací cyklus tak se na displeji nic nezobrazuje- takže většinu času).
Nějaká nastavení PIC na výstupy, WDT atd. tu řešit nechci. Chci řešit jen program.
Dávám sem zkrácenou ukázku
Vysvětlivky:
zobrazX= vyšle číslo x do BCD překladače který je před displejem.
cekej1= časová smyčka 1 sekunda
PORTA,0 až 3= výstup na tranzistor který aktivuje požadovaný displej.

kód:

                            CALL      zobraz0      
      BSF      PORTA,0      
      CALL      zobraz0
      BSF      PORTA,1
                            CALL      zobraz0      
      BSF      PORTA,2      
      CALL      zobraz0
      BSF      PORTA,3
                            cekej1

                            CALL      zobraz1      
      BSF      PORTA,0      
      CALL      zobraz0
      BSF      PORTA,1
                            CALL      zobraz0      
      BSF      PORTA,2      
      CALL      zobraz0
      BSF      PORTA,3
                            cekej1

                            CALL      zobraz2      
      BSF      PORTA,0      
      CALL      zobraz0
      BSF      PORTA,1
                            CALL      zobraz0      
      BSF      PORTA,2      
      CALL      zobraz0
      BSF      PORTA,3
                            cekej1

zobraz0              MOVLW      b'00000000'
      MOVWF      PORTB
      RETURN

zobraz1              MOVLW      b'00000001'
      MOVWF      PORTB
      RETURN

zobraz2              MOVLW      b'00000010'
      MOVWF      PORTB
      RETURN





atd..

Předem děkuji za vaše rady
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Balů
Profesionál
Profesionál


Založen: 29.10.2012
Příspěvky: 713

PříspěvekZaslal: 18 srpen 2016, 22:11    Předmět: Re: PIC 16f84A časovač Citovat

micha408 napsal:
... Nějaká nastavení PIC na výstupy, WDT atd. tu řešit nechci. Chci řešit jen program. ...


Pokud chceš řešit program, musíš řešit výše uvedené. Pokud to řešit nechceš, nemůžeš programovat. Jak chceš zrealizovat refresh 4-místného displeje, když nebudeš řešit časovač, přerušení a výstupy procesoru? Navíc mu dáš na práci čekat 1 vteřinu. Jak jsem tu už mockrát zmiňoval - čekací smyčky v testovací verzi budiž, ale v ostrém programu maximálně v délce jednotek ms. Při 4-místném displeji musíš jednotlivé číslice přepínat cca 400x za vteřinu. Tím dostaneš refresh celého displeje 100Hz (to aby to viditelně neblikalo). Postup je takový, že deaktivuješ všechny (nebo aspoň poslední aktivní) číslice, pošleš data pro 1. číslici a aktivuješ jí. Po vypršení času deaktivuješ displeje, pošleš data pro 2. číslici a aktivuješ jí. Takhle střídáš všechny číslice cca každých 2,5ms (= 400Hz). Každá číslice tedy blikne 100x za vteřinu (na 2,5ms svítí, 3x2,5ms = 7,5ms je zhasnutá) a displej pak vypadá, že svítí celý. Můžeš samozřejmě použít i vyšší obnovovací frekvenci. Refresh displeje se v drtivé většině řeší v přerušení časovače.

Druhou možností je pak použít statické řízení displeje. Tedy, že každá číslice má své vlastní datové piny buď přímo na procesoru nebo je můžeš "posadit" například na posuvné registry (74595 nebo 74594) a data pro jednotlivé číslice posílat po SPI. Pak můžeš na 3 piny procesoru připojit libovolné množství číslic. Jejich počet je pak jenom záležitostí počtu odeslaných dat na SPI port.

Další věcí je časování sekund. Když víš, že celý displej obnovíš 100x za sekundu, pak v přerušení počítáš od 100 do 0 (pro procesor je to vhodnější, než počítat od 0 do 100 a kontrolovat hodnotu na 100) a při dosažení 0 přičteš vteřinu a nastavíš počítadlo zpět na 100. Rozhodně nemůžeš používat vteřinovou čekací smyčku. Mimochodem, pro měření času je lepší použít jako zdroj kmitočtu pro procesor krystal. Jednak kvůli stabilitě kmitočtu a jednak kvůli jeho přesnosti. Pokud čítáš třeba jenom hodinu (například u kuchyňský minutky), tak tam se dá použít i interní RC oscilátor. Je třeba ale počítat i s několikavteřinovou odchylkou.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Mahoney
Profesionál
Profesionál


Založen: 26.12.2013
Příspěvky: 104

PříspěvekZaslal: 20 srpen 2016, 10:05    Předmět: Citovat

Myslím, že navíc myslel "časovač" softwarově ... ale Balů má pravdu, všechen ten HW je v MCU (tom PICu) proto, aby nám usnadňoval práci, byla by chyba ho nevyužívat a komplikovat si to nějak softwarově. Spoustu věcí bys tak navíc ani nedokázal udělat (a nebo o hodně složitěji) než když si nastavíš příslušný hw. Lépe vybavené PICy mají např. 5 časovačů, dvě sériovky, dva SPI moduly, tři PWM, dvě úrovně přerušení... a spoustu dalšího. CELÁ práce s jakýmkoliv mikrokontrolérem (nejenom s PICy) je o tom tento HW umět správně nastavit a používat. Softwarově se dneska emulují periférie jen velmi zřídka - není to zkrátka potřeba se s tím takto drbat, portfolium různě vybavených brouků je velmi široké, brouci jsou levní, a vždy se tedy dá vybrat přesně to, co člověk potřebuje.

S tím taky souvisí typická chyba začátečníků (i já jsem ji dlouho dělal): Nesnaž se o minimalismus a vybírej si na hraní, učení - a hlavně ladění - spíš lépe vybavené a o něco větší brouky. Není chyba zvolit PIC např. s 28 vývody (což je rozumné minimum) a využít jen tři - ono je to pořád o dost lepší, než když bys nějaký další vývod (nebo jinou periférii, nebo třeba paměť) ještě potřeboval, ale už prostě nemáš kam. Po odladění programu pak můžeš (ale nemusíš) vybrat brouka dané aplikaci přesně na míru.

Zde je v přiloženém ASM souboru kód, podle kterého se dá pochopit, jak je to s HW časovačem a s přerušením (že je to pro jiný typ PICu neřeš, jsou si všechny podobné, práce s nimi je vesměs stejná). Jinak samozřejmě si - a to uděláš vždy a jako první - stáhneš datasheet k PICu, se kterým pracuješ. V datasheetu vždy najdeš úplně vše, co budeš k práci potřebovat.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
micha408
Nováček
Nováček


Založen: 18.8.2016
Příspěvky: 2

PříspěvekZaslal: 23 srpen 2016, 15:33    Předmět: Citovat

Ok děkuji za rady.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

Zobrazit příspěvky z předchozích:   
Zobrazit předchozí téma :: Zobrazit následující téma  
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> Microchip Časy uváděny v GMT + 2 hodiny
 
Strana 1 z 1
Přejdi na:  
Můžete přidat nové téma do tohoto fóra.
Můž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.
Můžete k příspěvkům připojovat soubory
Můžete stahovat a prohlížet přiložené soubory
 



Num Lock Holder - app to hold Numlock
Copyright © 2017 Rudolf Veselý, mcontrollers.com.
Je zakázáno používat části tohoto webu bez souhlasu autora. || Powered by phpBB © 2001, 2002 phpBB Group - with RedSquare DoubleJ(Jan Jaap)