PIC 16f84A časovač

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.

                            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

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.

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.

Ok děkuji za rady.