Správa dynamickej indikácie na pic assembleri mikrokontroléra. Sedemsegmentový indikátor. Spôsoby implementácie softvéru

V pokračovaní lekcie zvážime dynamickú indikáciu. Ak ste si pozorne preštudovali statickú indikáciu, potom viete, že segmentový indikátor je sada LED. Na pripojenie indikátora potrebujete 7 pinov mikrokontroléra. Zrazu sme však potrebovali použiť niekoľko ukazovateľov, napríklad 2, 3, 4…

Potom už budeme potrebovať 14, 21, 28 nôh a je ich tak málo... Tu nám prichádza na pomoc dynamická indikácia. Hlavnou úlohou dynamickej indikácie je znížiť počet použitých pinov mikrokontroléra. Venujte pozornosť schéme zapojenej 9, nie 14 nôh. Všetky ovládacie nohy sú zapojené paralelne.

Vo všeobecnom zmysle tento dizajn funguje nasledovne: po prvé, konfigurácia prvého čísla je vyvedená na spoločnú zbernicu a zapnite PB1. Rozsvieti sa prvý indikátor s požadovaným číslom. Potom zhasneme, vydáme konfiguráciu druhého čísla na dátovú zbernicu, rozsvietime druhý indikátor, vypneme ho.

Podrobnejšie. V prvom momente je všetko vypnuté PORTB=0x00; PORTD=0xFF; keďže obvod so spoločným „+“, anódou. Ďalej sa do PORTD odošle konfigurácia prvého čísla, napríklad „0“. Zo statickej indikácie si pamätáme:

case 0 : ( PORTD= 0xC0 ; break ; )

prípad 0: ( PORTD=0xC0; prestávka; )

Ale všimnite si, "+" je pripojené k PORTB.1, t.j. na osvetlenie segmentu je potrebné zapnúť nohu PORTB.1=1;

V druhom okamihu všetko opäť vypneme, odošleme konfiguráciu druhého čísla a zapneme, tentoraz, druhý indikátor. Potom opakujeme.

O vysoké frekvencie, ľudské oko tieto spínače nevidí a zdá sa, že indikátor je neustále zapnutý. Odporúča sa nepoužívať frekvencie, ktoré sú násobkami 50 Hz. V mojom testovacom projekte som použil 120 Hz. Časovač je nastavený na 1 MHz. Kód sa spracuje v prerušení Timer1. Prerušenie sa volá 240-krát za sekundu, pretože existujú dva indikátory, takže do porovnávacieho registra vložíme 1000 000/240=4166 alebo 0x1046. Proteus sa nedokázal spriateliť s dynamickým indikátorom, no na hardvéri fungoval okamžite.

Poznámka!!! Pri pripájaní indikátora sa odporúča zavesiť odpor obmedzujúci prúd na každý segment, a nie jeden spoločný. Tiež odporúčam zapnúť spoločný vodič indikátora cez tranzistor, inak si môžete spáliť nohu.

Pre obvod so spoločnou anódou

Pre obvod so spoločnou katódou

Ako testovací firmvér som použil časovač z predchádzajúceho projektu.

Video z firmvéru

Jedným z najbežnejších spôsobov zobrazenia informácií je 7-segmentový indikátor. Ľahko umožňuje zobrazovať digitálne a pseudotextové informácie (existuje aj špeciálny textový viacsegmentový indikátor), vyžaduje však veľké množstvo voľných výstupov z ovládača. Existujú dva spôsoby, ako znížiť počet použitých pinov: použiť špeciálny ovládač (alebo prvok vyrovnávacej pamäte) alebo použiť dynamickú indikáciu. Kde na displej pôjde 7 pinov pre každý zo segmentov a jeden pre každý znak a znaky budú postupne svietiť takou rýchlosťou, že to človek nerozlišuje a bude sa mu zdať, že indikátor je rovnomerný. pálenie.

OPTION=0b00000000; // Nastavenie TMR0 INTCON=0b10100000; // Prerušenia sú povolené a iba od TMR0

Ak chcete pracovať, potrebujete nasledujúce globálne premenné:

Unsigned char v1,v2,v3, vn;

Prvé tri sú zodpovedné za hodnoty zodpovedajúcich segmentov a posledné je aktuálne číslo horiaceho segmentu (dynamická indikácia).

Obsluha prerušení je zaneprázdnená spracovaním časovača, ktorý neustále mení segmenty.

Void prerušenie isr(void) ( if(T0IF) // keď pretečie TMR0 ( vn++; // switch segment switch(vn) // select segment ( case 1:seg7(v1,1);break; case 2:seg7(v2) ,2);prestávka; prípad 3:(seg7(v3,3);vn=0;)prestávka; ) TMR0=100; // nastavenie časovača na niečo iné ako začiatok T0IF=0; // resetovanie príznaku ) )

Nasledujúca funkcia sa používa na zobrazenie hodnoty symbolu sedemsegmentového displeja so spoločnou anódou:

Void seg7(unsigned char c, unsigned char s) ( unsigned char t=0; // g segment PORTA=0b00000000; // resetovanie prepínačov portu A // výber anódy ( case 1:(t=1;)break ; case 2:(t=2;)break; case 3:(t=32;)break; ) switch(c%10) // vyber segmenty (katody) ( // 00bfaed g case 0: (PORTC=0b00000000; PORTA=t+4;)prestávka;prípad 1: (PORTC=0b00011110;PORTA=t+4;)prestávka;prípad 2: (PORTC=0b00010001;PORTA=t;)prestávka;prípad 3: (PORTC=0b00010100;PORTA =t;)prestávka;prípad 4: (PORTC=0b00001110;PORTA=t;)prestávka;prípad 5: (PORTC=0b00100100;PORTA=t;)prestávka;prípad 6: (PORTC=0b00100000;PORTA=t;)prestávka ;prípad 7: (PORTC=0b00010110;PORTA=t+4;)prestávka;prípad 8: (PORTC=0b00000000;PORTA=t;)prestávka;prípad 9: (PORTC=0b00000100;PORTA=t;)prestávka; ) )

PIC16F676 má neúplné výstupné porty, takže všetky segmenty sa nezmestili na port C, segment g musel byť umiestnený na port A a bod musel byť schematicky pripojený k jednej zo spoločných anód cez invertor. Schéma takéhoto spojenia je nasledovná:

Ak používate iný mikrokontrolér, ktorý má aspoň jeden plný port, napríklad PIC16F628A

funkcia bude mať nasledujúci tvar:

Void seg7(unsigned char c, unsigned char s) ( unsigned char t=0; switch(c%10) // výber segmentov (katódy) ( // gcPdeafb case 0: (t=0b10100000;)break; case 1: ( t=0b10111110;)prestávka; prípad 2: (t=0b01100010;)prestávka; prípad 3: (t=0b00101010;)prestávka; prípad 4: (t=0b00111100;)prestávka; prípad 5: (t=0b00101001); ;prípad 6: (t=0b00100001;)prestávka;prípad 7: (t=0b10111010;)prestávka;prípad 8: (t=0b00100000;)prestávka;prípad 9: (t=0b00101000;)prestávka; ) PORTA=0000; // resetovanie prepínačov portu A // výber anódy ( prípad 1:( PORTA =4;)prerušenie; prípad 2:( PORTA =8;)prerušenie; prípad 3:( PORTA =64;)prerušenie; ) PORTB= t; if(c>9) ( PORTB=t) )

Bodka vedľa symbolu sa rozsvieti, ak s väčšia ako 9, na indikátore sa bude stále zobrazovať hodnota, t.j. vypíše sa len najmenej významná číslica, všetko ostatné sa zahodí (napríklad: 1 9 , 39 = 9. ).

V hlavnej funkcii (hlavnej) MK ticho robí svoju prácu, pre výstup nové informácie na displeji mu stačí zmeniť hodnoty premenných v1,v2,v3, ale mali by sa zmeniť súčasne, aby nedošlo k zámene na indikátore.

Dynamická indikácia je široko používaná na zobrazovanie rôznych informácií, ako je teplota, napätie, čas alebo jednoducho počet spúšťačov akýchkoľvek zariadení alebo senzorov. Dynamická indikácia na základni je dokonale zladená v spolupráci s mikrokontrolérmi. Avšak v programovacej literatúre mikrokontroléry AVR táto problematika je posudzovaná veľmi povrchne a nie v každej knihe na príslušnú tému. Preto podrobnejšie zvážime, ako pripojiť sedemsegmentový indikátor s dynamickou indikáciou k mikrokontroléru, v tomto prípade k ATmega8, ale analógia je zachovaná pre AVR MK akejkoľvek série.

Podľa počtu číslic (číslic) sú dynamické sedemsegmentové ukazovatele jednociferné, dvojciferné, trojmiestne, štvormiestne a veľmi zriedka šesťmiestne. Zameriame sa na štvormiestne sedemsegmentové ukazovatele, ako najpoužívanejší typ dynamickej indikácie. Vyrábajú sa so spoločnou anódou a spoločnou katódou. Schémy zapojenia LED jednotlivých segmentov sú znázornené na obrázkoch.

Ako je zrejmé z obrázkov, každá číslica, nazývaná číslica, má svoj vlastný samostatný výstup spoločný v rámci číslice. Keďže sa uvažuje o 4-miestnej dynamickej indikácii, existujú štyri takéto výstupy - digit1, digit2, digit3, digit4.

Pinout výstupov 4-miestneho sedemsegmentového indikátora je znázornený na obrázku nižšie. V tomto prípade je zobrazený pohľad zhora, t.j. indikátor nie je potrebné otáčať hore nohami.

Ako funguje dynamická indikácia

Teraz sa pozrime, ako funguje dynamická indikácia so spoločnou katódou. Napríklad potrebujeme zobraziť číslo 1987. Aby sme to dosiahli, v prvom okamihu by sa mal na anódy segmentov, ktoré tvoria jednotku - b a c, aplikovať vysoký potenciál a mal by sa použiť nízky potenciál na spoločnú katódu prvej kategórie. Spoločné katódy zvyšných troch číslic - číslica2, číslica3 a číslica4 zostávajú nezapojené.

V druhom časovom okamihu segmenty tvoriace číslo 9 prijímajú energiu, spoločná katóda druhej číslice je pripojená k mínusu a číslica 1 stráca energiu; digit2, digit3, ako predtým, zostanú nepripojené.

V treťom okamihu sa na treťom indikátore rozsvieti číslo 8 a ostatné indikátory zhasnú.

Vo štvrtom okamihu sa napája posledný indikátor a zobrazí sa číslo 7.

Potom sa všetko znova opakuje. Pri spínacej frekvencii od vybitia k vybitiu vyššej ako 25 Hz naše oči v dôsledku svetelnej zotrvačnosti LED nestihnú postrehnúť, ako k prepínaniu dochádza, takže vizuálne vnímame integrálnu žiaru všetkých výbojov súčasne .

Schéma pripojenia dynamickej indikácie k mikrokontroléru ATmega 8

Na piny portu D mikrokontroléra ATmega8 pripojíme dynamické indikačné segmenty cez prúdovo obmedzujúce s nominálnou hodnotou 330 Ohmov. Závery zodpovedajúce digit1, digit2, digit3, digit4 sú spojené cez tranzistory typu n-p-n, ako napríklad BC547 alebo 2n2222 na kolíky portu B.

Algoritmus na písanie kódu na pripojenie dynamickej indikácie

Na konkrétnejšie úkony použijeme 4-miestny sedemsegmentový indikátor so spoločnou katódou. Prvým krokom je vytvorenie poľa čísel od 0 do 9. Už sme sa to naučili skôr, . Ďalej musíte rozdeliť 4-miestne číslo na štyri samostatné číslice. Napríklad číslo 1987 musí byť rozdelené na 1, 9, 8 a 7. Potom musí byť jednotka zobrazená v prvej číslici ukazovateľa, deväť v druhej, osem v tretej a sedem vo štvrtej.

Spomedzi mnohých algoritmov na rozdelenie viacciferného čísla na samostatné čísla použijeme operácie delenia a zvyšok delenia. Zvážte príklad:

1987/1000 → 1

1987%1000/100 → 9

1987%100/10 → 8

1987%10 → 7

V C, pri použití typu údajov celé číslo int pri vykonávaní delenia sa vyhadzujú všetky desatiny, stotiny atď., teda všetky čísla menšie ako jedna. Zostávajú len celé čísla. Matematické zaokrúhľovanie tu nefunguje, takže 1,9 by v tomto prípade bolo 1, nie 2.

Príkaz „zvyšok delenia“ je označený znakom percenta „ % ". Tento príkaz zahodí všetky celé čísla a ponechá zvyšok čísla. Napríklad 1987%1000 → 987; 1987%100 → 87; 1987%10 → 7.

Ďalej by ste mali napísať príkaz, ktorý najprv zobrazí prvú číslicu a jej zodpovedajúce číslo, potom po určitom čase druhú číslicu a jej zodpovedajúce číslo; a tak ďalej. Nižšie je uvedený kód s komentármi.

KÓD

#definovať F_CPU 1 000 000 l

#include

#include

#define CHISLO PORTD

#define RAZRIAD PORTB

unsigned int razr1 = 0, razr2 = 0, razr3 = 0, razr4 = 0;

int číslo bez znamienka = (

// čísla od 0 do 10

0x3f, 0x6, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x7, 0x7f, 0x6f

};

void vse_chislo (nepodpísané int rabivka_chisla)

{

razr1 = rabivka_chisla/1000; // tisíce

razr2 = rabivka_chisla%1000/100; // stovky

razr3 = rabivka_chisla%100/10; // desiatky

razr4 = rabivka_chisla%10; // Jednotky

}

int main (void)

{

DDRB = 0b00001111;

DDRD = 0b11111111;

RAZRIAD = 0b00000001; // na začiatku 1. číslica

CHISLO=0x3f; // číslo 0

zatiaľ čo (1)

{

vse_chislo (1987); // zobrazenie čísla

RAZRIAD = 0b00000001; // zapni 1. bit, vypni zvyšok

CHISLO=chisla ; // zobrazenie 1. číslice

_delay_ms(3);

RAZRIAD = 0b00000010; // zapni 2. bit, vypni zvyšok

CHISLO=chisla ; // zobrazenie 2. číslice

_delay_ms(3);

RAZRIAD = 0b00000100; // zapni 3. bit, vypni zvyšok

CHISLO=chisla ; // zobrazenie 3. číslice

_delay_ms(3);

RAZRIAD = 0b00001000; // zapni 4. bit, vypni zvyšok

CHISLO=chisla ; // zobrazenie 4. číslice

_delay_ms(3);

}

}

Vylepšenie programu pre dynamickú indikáciu

Vyššie uvedený algoritmus je skôr učiaci sa algoritmus, takže je trochu zjednodušený, ale má svoje miesto aj v programoch, ktoré nerobia žiadne rýchle výpočty v reálnom čase. Jediná nevýhoda tento algoritmus je využívanie meškania, o negatívnom vplyve ktorého sa hovorilo už skôr. Aby ste sa zbavili používania oneskorení, môžete použiť prerušenia z počítadiel časovačov. V nižšie uvedenom kóde sú oneskorenia vytvorené pomocou nulového časovača-počítadla a volaním prerušenia pri pretečení tohto počítadla.

Aby sa čísla zobrazovali postupne v každej číslici indikátora pri každom prerušení, pribudla premenná bc547, ktorá sa pri nasledujúcom volaní prerušenia ISR (TIMER0_OVF_vect) zvýši o jednotku. Potom sa skontroluje hodnota premennej bc547 a príslušný bit sa napája. Keď sa bc547 stane väčším ako štyri, resetuje sa na jednotku.

DAby sa na indikátore zobrazilo viacmiestne číslo, musíte s ním najskôr vykonať zložitú manipuláciu, ktorá spočíva v rozdelení čísla na jeho zložky. Ako príklad uvediem zobrazenie čísla 1234 na štvorsegmentovom sedemsegmentovom ukazovateli so spoločnou anódou.


Ak chcete zobraziť štvormiestne číslo, musíte vytvoriť jednu spoločnú premennú, ktorá bude obsahovať číslo, ktoré chcete zobraziť (premenná W), štyri premenné, ktoré budú ukladať údaje pre každé znamenie (N) a ďalšie štyri premenné pre prechodné transformácie (M), aby ste sa nedotkli hlavnej premennej. Premenná musí zodpovedať hodnote, ktorá v nej bude uložená.ja Takže pre premennúWpostačí typcelé číslo , keďže premenná tohto typu je schopná xpAnimovať hodnoty od -32768 do +32767 (aleboslovo pokiaľ neplánujete použiť záporné čísla). V premennýchNbudú ležať čísla od 0 do 9, takže bude stačiť použiť premennú typubyte
. A v premennýchM buderovnaké hodnoty ako v premennejW, tak nastavíme typ celé číslo .

Dim W ako celé číslo
Dim N1 As Byte
Dim N2 As Byte
Dim N3 ako bajt
Dim N4 ako Byte
Dim M1 ako celé číslo
Dim M2 ako celé číslo
Dim M3 ako celé číslo
Dim M4 ako Integer


Po deklarovaní premenných nastavíme porty pre výstupktorý sa použije na pripojenie indikátora:

DDRC = &B11111111
DDRD = &B11111111


DDRC=&B 00001111 a DDRD=&B 01111111 (štyri prvé úseky prístavu Cpre anódy a šesť prvých portov D čiastkové segmenty).

Potom priraďte k premennej W hodnotu, ktorú zobrazíme na indikátore:

W=1234

"Arial","sans serif""> V hlavnej slučke programu priradíme premenným M hodnotu premennejW, robím toto:

M1=W
M2 = M1
M3 = M1
M4 = M1


"Arial","sans serif""> Toto nie je paranoja)), robí sa to s cieľom, aby vo všetkých premenných M bol rovnaký počet, pretože počas operácie priraďovania môže ľahko vniknúť prerušenie (ak nejaké existuje a nie je zakázané), v handleri ktorého premennáW môže zmeniť. A ak by zadanie vyzeralo takto: М1= W, M2= W, M3= W, M4= W v premenných M bude ležať rôzne významyčo povedie k neporiadku v čítaní.

Po priradení hodnôt premenným začneme pracovať s
každý z nich sa prevedie takým spôsobom, že na premennú N dostal hodnotu, ktorá bude
zobrazené na indikátore: v premennej
N 1 by mala byť "1", in N2 - "2", v N3 - "3" a v N4 - "4".

M1=M1/1000" M1=1234/1000=1,234
N1=Abs(ml)" N1=Abs(1,234)=1

abs – funkcia, ktorá vracia celé číslo premennej.Do premennej N 1 zasiahol jednotku, čo bolo skutočne potrebné.

Na priradenie dvojky k premennej N 2 operácia bude trochu komplikovanejšia:

M2= M2 Mod 1000 " M2 =1234 Mod 1000 = 234
M2=M2/100" M2=234/100=2,34
N2 = Abs (m2) " N2 = Abs (2,34) = 2

"Arial","sans serif""> Ak chcete začať s funkciouMod vraciame prvé tri
číslice čísla (zvyšok delenia 1000) a potom je všetko ako v prvom prípade.

S poslednými dvoma číslicami takmer to isté:

M3 = M3 Mod100
M3 = M3/10
N3 = Abs (m3)

M4 = M4 Mod 10
N4= Abs (m4)


Teraz naše premenné obsahujú hodnoty, ktoré chceme zobraziť, je čas, aby mikrokontrolér vykopol nohy a zobrazil tieto hodnoty na indikátore, preto nazývame podprogram spracovania zobrazenia:

"Arial","sans serif"">

Gosub Led

"Arial","sans serif""> Procesor preskočí na podprogram označenýLed:

LED:

Portc = &B00001000

"Arial","sans serif""> Tu slúžime na vysokej úrovniPORTC .3 sme na túto nohu pripojili anódu prvej kategórie. Potom zvolíme, ktoré segmenty rozsvietime, aby sa zobrazila hodnota prvej premennej. Je jednou z nás, takže nula bude na jej nohách Portd .1 a Portd .2, čo zodpovedá segmentom Indikátor B a C.

Vyberte prípad N1









Koniec Vyberte
Čaká 5

"Arial","sans serif""> Po rozsvietení potrebných segmentov počkáme 5 ms a pristúpime k zobrazeniu nasledujúcich čísel:

Portc = &B00000100
Vyberte prípad N2
Prípad 0 : Portd = &B11000000
Prípad 1: Portd = &B11111001
Prípad 2: Portd = &B10100100
Prípad 3: Portd = &B10110000
Prípad 4: Portd = &B10011001
Prípad 5: Portd = &B10010010
Prípad 6: Portd = &B10000010
Prípad 7: Portd = &B11111000
Prípad 8: Portd = &B10000000
Prípad 9: Portd = &B10010000
Koniec Vyberte

Čaká 5

Portc = &B00000010

Vyberte prípad N3
Prípad 0 : Portd = &B11000000
Prípad 1: Portd = &B11111001
Prípad 2: Portd = &B10100100
Prípad 3: Portd = &B10110000
Prípad 4: Portd = &B10011001
Prípad 5: Portd = &B10010010
Prípad 6: Portd = &B10000010
Prípad 7: Portd = &B11111000
Prípad 8: Portd = &B10000000
Prípad 9: Portd = &B10010000
Koniec Vyberte

Čaká 5

Portc = &B00000001

Vyberte prípad N4
Prípad 0 : Portd = &B11000000
Prípad 1: Portd = &B11111001
Prípad 2: Portd = &B10100100
Prípad 3: Portd = &B10110000
Prípad 4: Portd = &B10011001
Prípad 5: Portd = &B10010010
Prípad 6: Portd = &B10000010
Prípad 7: Portd = &B11111000
Prípad 8: Portd = &B10000000
Prípad 9: Portd = &B10010000
Koniec Vyberte

Čaká 5

"Arial","sans serif""> Po zobrazení informácií na indikátore sa musíte vrátiť do hlavnej programovej slučky, kde je potrebné slučku dokončiť a označiť koniec programu.

"Arial","sans serif""> Tu je to, čo dostaneme na konci:

"Arial","sans serif"">

"Arial","sans serif""> Kvôli malému oneskoreniu nebude prepínanie viditeľné pre ľudské oko a uvidíme celé číslo 1234.

Nižšie si môžete stiahnuť zdrojový kód a projekt v Proteus:"Arial","sans serif"">

Niekedy je potrebné k mikrokontroléru pripojiť niekoľko sedemsegmentových indikátorov alebo LED maticu, pričom na zobrazenie informácií slúži dynamická indikácia. Podstatou dynamickej indikácie je postupné zobrazovanie informácií na indikátoroch. Nižšie uvedený diagram ukazuje príklad pripojenia niekoľkých sedemsegmentových indikátorov (napríklad so spoločnou katódou) na implementáciu dynamickej indikácie, vo všeobecnosti sa s prihliadnutím na bod získa 8 segmentov, ale staromódnym spôsobom sú nazval sa tak. Všetky závery (anódy) segmentov rovnakého mena sú spojené dohromady, celkovo 8 vedení, ktoré sú pripojené k mikrokontroléru cez odpory. Spoločná katóda každého indikátora je pripojená k mikrokontroléru cez tranzistor.


Algoritmus indikácie je nasledujúci: najprv nastavíme požadované logické úrovne na linkách v závislosti od toho, ktoré segmenty je potrebné zapnúť na prvom indikátore (indikácia zľava doprava), s vysokou logickou úrovňou na zapnutie, nízka na vypnutie segmentu. Ďalej aplikujeme vysokú logickú úroveň na základňu tranzistora VT1, čím je spoločná katóda prvého indikátora pripojená k spoločnému vodiču, v tomto okamihu sa rozsvietia tie segmenty, na ktorých anódach je logická jednotka. Cez určitý čas(pauza) vypnite indikátor privedením nízkej logickej úrovne na bázu tranzistora, potom znova zmeňte logické úrovne na linkách v súlade s výstupnými informáciami určenými pre druhý indikátor a aplikujte zapínací signál na tranzistor VT2. Teda v poradí v kruhovom cykle prepíname všetky ukazovatele, to je celá dynamická indikácia.

Pre solídny obraz bez blikania treba prepínanie robiť vysokou rýchlosťou, aby sa eliminovalo blikanie LED diód, obnovovacia frekvencia musí byť nastavená od 70 Hz a viac, ja ju bežne nastavujem na 100 Hz. Pre vyššie uvedenú konštrukciu je pauza vypočítaná nasledovne: pre frekvenciu 100 Hz je perióda 10 ms, sú len 4 indikátory, respektíve doba žiaru každého indikátora je nastavená na 10/4 = 2,5 ms. V jednom kryte sú viacmiestne sedemsegmentové indikátory, v ktorých sú rovnomenné segmenty spojené vo vnútri samotného krytu, samozrejme na ich použitie je potrebné použiť dynamickú indikáciu.

Pre implementáciu dynamickej indikácie je potrebné použiť prerušenia pri pretečení jedného z časovačov. Nižšie je uvedený kód pomocou časovača TMR0:

;Implementácia dynamickej indikácie pre 4 sedemsegmentové indikátory;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; swapf STATUS,W ; clrf STATUS; movwf STATUS_TEMP ; ; bcf ind1 ;vypnúť 1. indikátor bcf ind2 ;vypnúť 2. indikátor bcf ind3 ;vypnúť 3. indikátor bcf ind4 ;vypnúť 4. indikátor; incf list,F ;prírastok registra list movlw .5 ;skontroluj obsah registra list xorwf list,W ;skontroluj, či sa rovná 5 btfss STATUS,Z ; goto met1 ;číslo v registri listov sa nerovná 5 movlw .1 ;číslo v registri listov je 5: zapíš číslo 1 movwf list ;do registra listov ; met1 movlw .1 ;skontroluj obsah registra list xorwf list,W , rovná sa číslu 1 btfss STATUS,Z ; goto met2 ;číslo v registri listov sa nerovná 1: skok na met2 movf datind1,W ;číslo v registri listov sa rovná 1: skopíruj movwf PORTB ;obsah registra datind1 do registra PORTB bsf ind1 ;zapni 1. indikátor met2 movlw .2 ;skontrolujte obsah registračného listu xorwf list,W , rovná sa 2 btfss STATUS,Z ; goto met3 ;číslo v registri listu sa nerovná 2: skok na met3 movf datind2,W ;číslo v registri listu je 2: skopíruj movwf PORTB ;obsah registra datind2 do registra PORTB bsf ind2 ;zapni 2. indikátor goto exxit ;skoč na štítok exxit met3 movlw .3 ;skontroluj obsah registra list xorwf list,W , rovná sa 3 btfss STATUS,Z ; goto met4 ;číslo v registri listu sa nerovná 3: skok na met4 movf datind3,W ;číslo v registri listu je 3: skopíruj movwf PORTB ;obsah registra datind3 do registra PORTB bsf ind3 ;zapni 3. indikátor goto exxit ;skoč na štítok exxit met4 movf datind4,W ;kopírovať obsah registra datind3 movwf PORTB ;do registra PORTB bsf ind4 ;zapnúť 4. indikátor; movlw .100 ;zapis 156 do casoveho registra TMR0 movwf TMR0 ; ; movwf STAV ; swapf W_TEMP,F ; swapf W_TEMP,W ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Hlavný program ................. movlw b"11010011" ; OPTION_REG, čím sa nastaví interný ; nastavenie pomeru preddeličky 1:16 ; clrf list ;vynulovanie listu registra pred spustením; prerušenia pri pretečení TMR0, vykonané; clrf datind1 ;vymazanie registrov pre výstup informácií na clrf datind2 ;indikátory, je to ekvivalentné vypnutiu clrf datind3 ;indikátory, ako indikátory so spoločnou clrf datind4 ;katódou; bcf INTCON,T0IF ;vymazať príznak prerušenia pri pretečení TMR0 bsf INTCON,T0IE ;povoliť prerušenia pri pretečení TMR0 bsf INTCON,GIE ;povoliť globálne prerušenia; movlw b"00000110" ; 13.52 príklad výstupu movwf datind1 ; movlw b"11001111" ; movwf zo dňa2 ; movlw b"01101101" ; movwf zo dňa3 ; movlwb"01011011" ; movwf zo dňa4 ; ; . ................; .................; .................; ; koniec, koniec celého programu;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Implementácia dynamickej indikácie pre 4 sedemsegmentové indikátory

;Príklad hodinovej frekvencie 4 MHz, strojový cyklus 1 µs

org 0000h ;spustenie vykonávania programu na adrese 0000h

goto Start ;prejdite na označenie Štart

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Prerušte rutinu

org 0004h ;spustenie vykonávania podprogramu na adrese 0004h

movwf W_TEMP ;uložiť hodnoty registra kľúčov

swapf STATUS,W ;

movwf STATUS_TEMP ;

bcf ind1 ;vypnite 1. indikátor

bcf ind2 ;vypnite 2. indikátor

bcf ind3 ;vypnite 3. indikátor

bcf ind4 ;vypnite 4. indikátor

incf list,F ;prírastkový list registra

movlw .5 , skontrolujte obsah registračného listu

xorwf list,W ; rovné 5

btfss STATUS,Z ;

goto met1 ;číslo v registrovom liste sa nerovná 5

movlw .1 ;číslo v registri listov je 5: napíšte číslo 1

movwf list ;zaregistrovať list

met1 movlw .1 , skontrolujte obsah registra listov

xorwf list,W ; rovná sa číslu 1

btfss STATUS,Z ;

goto met2 ;číslo v registri listov sa nerovná 1: skok na met2

movf datind1,W ;číslo v registri listov je 1: kópia

movwf PORTB ; obsah registra datind1 do registra PORTB

bsf ind1 ;zapnite 1. indikátor

goto exit ;prejdi na označenie exit

met2 movlw .2 , skontrolujte obsah registra listov

xorwf list,W ; rovná sa číslu 2

btfss STATUS,Z ;

goto met3 ;číslo v registri listov sa nerovná 2: skok na met3

movf datind2,W ;číslo v registri listov je 2: kópia

movwf PORTB ; obsah registra datind2 do registra PORTB

bsf ind2 ;zapnite 2. indikátor

goto exit ;prejdi na označenie exit

met3 movlw .3 , skontrolujte obsah registra listov

xorwf list,W ; rovná sa číslu 3

btfss STATUS,Z ;

goto met4 ;číslo v registri listov sa nerovná 3: skok na met4

movf datind3,W ;číslo v registri listov je 3: kópia

movwf PORTB ; obsah registra datind3 do registra PORTB

bsf ind3 ;zapnite 3. indikátor

goto exit ;prejdi na označenie exit

met4 movf datind4,W ; skopírujte obsah registra datind3

movwf PORTB ;do registra PORTB

bsf ind4 ;zapnite 4. indikátor

exit bcf INTCON,T0IF ;resetovať príznak prerušenia pretečenia TMR0

movlw .100 ;zapíšte číslo 156 do registra časovača TMR0

swapf STATUS_TEMP,W ; obnovenie obsahu kľúčových registrov

swapf W_TEMP,F ;

swapf W_TEMP,W ;

retfie ;ukončiť rutinu prerušenia

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Hlavný program

Štart ................. ;úvodné nastavenie registrov

................. ;špeciálny účel

.................

bsf STATUS,RP0 ;zapis binárne číslo 11010011 zaregistrovať

movlw b"11010011" ;OPTION_REG, čím sa nastaví interný

movwf OPTION_REG ; zdroj hodín pre TMR0

bcf STATUS,RP0 ;povoliť preddeličku pred TMR0

;Nastavte pomer preddeličky na 1:16

clrf Shet ; pred spustením resetujte register listov

;pretečenie prerušenia TMR0, vykonané

;raz po zapnutí

clrf datind1 ; vymazať registre pre výstup informácií

clrf datind2 ;indikátory, ekvivalentné vypnutiu

clrf datind3 ;ukazovatele, keďže ukazovatele so spoločným

clrf datind4 ;katóda

bcf INTCON,T0IF ;resetovať príznak prerušenia pretečenia TMR0

bsf INTCON,T0IE ;povoliť prerušenia pretečenia TMR0

bsf INTCON,GIE; povoliť globálne prerušenia

movlw b"00000110" ; Príklad výstupu 13.52

movlw b"11001111" ;

movlw b"01101101" ;

movlwb"01011011" ;

................. ;

................. ;

................. ;

koniec ; koniec celého programu

V hlavnom programe sme najskôr nastavili časovač pomocou registra OPTION_REG, predtým som hovoril o používaní časovačov pre . Ďalej vymažeme register listov určený na zadávanie počtu od 1 do 4 pre každý ukazovateľ. Tento register sa inkrementuje v rutine služby prerušenia a tam sa upraví (bude počítať od 1 do 4), takže toto vymazanie sa vykoná raz po zapnutí. Na základe tohto registra určíme, ktorý ukazovateľ zaradiť a vydáme mu zodpovedajúce údaje. Ďalším krokom je vymazanie registrov ukladania informácií, pričom štyri registre dataind1,2,3,4 zodpovedajú štyrom indikátorom. Vymazanie je ekvivalentné vypnutiu indikátorov, keďže pri obsluhe prerušenia sa obsah týchto registrov prenesie do registra PORTB, ku ktorému sú pripojené anódy indikátora. Je to potrebné, aby sa po povolení prerušení na indikátoroch nezobrazovali žiadne odpadky, v zásade to nie je možné, ak sa na výstup okamžite zapíšu správne informácie. Ďalej resetujte príznak prerušenia pretečenia časovača, povoľte prerušenia pretečenia TMR0 a nakoniec povoľte globálne prerušenia.

V rutine prerušenia najskôr vypneme všetky indikátory (aplikovaním nízkych logických úrovní na bázy tranzistorov), pretože nie je známe, ktorý z nich je zapnutý. Zväčšíme hárkový register, kontrolujeme zhodnosť s číslom 5, ak je taká zhoda, zapíšeme do registra číslo 1, keďže je potrebné dodržať počet od 1 do 4. Ďalej skontrolujeme, ktoré číslo je v listový register, ktorým načítame dáta z PORTB do PORTB informačných registrov (dataind) pre príslušný indikátor a zapneme ho. Potom resetujeme príznak prerušenia pretečenia TMR0, zapíšeme číslo 100 do časovača (výpočet tejto hodnoty je uvedený nižšie) na časové oneskorenie a ukončíme obsluhu prerušenia. Pri prvom prerušení sa rozsvieti prvý indikátor, pri druhom prerušení druhý atď. v kruhovom cykle. V hlavnom programe zostáva len načítať údaje do registrov na ukladanie informácií pre každý indikátor. V podprograme prerušenia nezabudnite uložiť a obnoviť hodnoty kľúčových registrov, o tom som písal v článku o.

Na výstup čísel je lepšie použiť generátor znakov vo forme dátovej tabuľky. Napríklad, aby sa na indikátoroch zobrazilo číslo 3456, musí byť rozdelené na číslice, zatiaľ čo na uloženie čísel číslic je lepšie použiť samostatné registre (od 0 do 9), potom tieto registre spustiť cez generátor znakov, čím získanie správnych bajtov (načítaných do dataind registrov) na zapálenie príslušných segmentov.

Frekvenciu generátora hodín budeme brať ako 4 MHz, cyklus stroja je 1 μs. Nech je obnovovacia frekvencia každého indikátora 100 Hz (perióda T = 10 ms), požadované časové oneskorenie je 10/4 = 2,5 ms. Faktor preddeličky pre TMR0 je nastavený na 1:16, pričom maximálne možné oneskorenie je 256x16 = 4096 µs a potrebujeme pauzu 2,5 ms. Vypočítajme číslo na zápis do TMR0: 256-((256x2,5)/4,096) = 256-156,25 = 99,75. Po zaokrúhlení dostaneme číslo 100.

Nižšie si môžete stiahnuť model programu Proteus, firmware a zdrojový kód s implementáciou dynamickej indikácie na 4-miestnom indikátore so spoločnou katódou pomocou mikrokontroléra PIC16F628A. Napríklad čísla 0000 sú zobrazené na indikátore; 0001; 0002; 13,52; 9764.

Teraz zvážte pripojenie matice s rozlíšením 8x8 pixelov (LED). Štruktúra matice sa zvyčajne uvažuje z hľadiska riadkov a stĺpcov. Na obrázku nižšie sú v každom stĺpci pripojené katódy všetkých LED a v každom rade anódy. Reťazce (8 riadkov, LED anódy) sú pripojené cez odpory k mikrokontroléru. Každý stĺpec (LED katódy) je pripojený k mikrokontroléru cez 8 tranzistorov. Algoritmus indikácie je rovnaký, najskôr nastavíme potrebné logické úrovne na riadkoch, podľa ktorých majú svietiť LED v stĺpci, potom pripojíme prvý stĺpec (indikácia zľava doprava). Po určitej pauze stĺpec vypneme a zmeníme logické úrovne na riadkoch, aby sa zobrazil druhý stĺpec, potom pripojíme druhý stĺpec. A tak striedavo pendlovať všetky kolóny. Nižšie je schéma pripojenia matice k mikrokontroléru.


Celkovo je na pripojenie takejto matice potrebných 16 kolíkov mikrokontroléra, čo je dosť veľa, preto je na zníženie riadiacich vedení lepšie použiť sériové posuvné registre.

Najbežnejším sériovým registrom je mikroobvod 74HC595, ktorý obsahuje posuvný register na načítanie dát a prídržný register, cez ktorý sa dáta prenášajú na výstupné linky. Načítanie dát do neho je jednoduché, na hodinovom vstupe SH_CP nastavíme logickú 0, na dátovom vstupe DS potom nastavíme požadovanú logickú úroveň, po ktorej prepneme hodinový vstup na 1, pričom hodnota úrovne (na vstupe DS) je uložené vo vnútri posuvného registra. Zároveň sú dáta posunuté o jeden bit. Výstup SH_CP opäť prestavíme na 0, nastavíme požadovanú úroveň na vstupe DS a zvýšime SH_CP na 1. Po úplnom načítaní posuvného registra (8 bitov) nastavíme výstup ST_CP na 1, v tomto momente sa dáta prenesú do úložného registra a privádzané do výstupných vedení Q0 ... Q7, po ktorých resetujeme výstup ST_CP. Počas sekvenčného načítavania sa údaje posúvajú z Q0 na Q7. Pin Q7' je pripojený k poslednému bitu posuvného registra, tento pin je možné pripojiť na vstup druhého mikroobvodu, takže môžete načítať dáta do dvoch alebo viacerých mikroobvodov naraz. Pin OE prepne výstupné vedenia do tretieho (vysokoodporového) stavu, keď je naň privedená logická 1. Pin MR je určený na resetovanie posuvného registra, teda nastavenie nízkych logických úrovní na výstupoch spúšťačov registra. , čo je ekvivalentné načítaniu ôsmich núl. Nižšie je uvedený diagram načítania údajov do čipu 74NS595 s nastavením hodnoty 11010001 na výstupných riadkoch Q0 ... Q7 za predpokladu, že na začiatku boli nuly:


Zvážte pripojenie matice 8×8 k mikrokontroléru PIC16F628A pomocou dvoch posuvných registrov 74HC595, schéma je znázornená nižšie:


Dáta sa načítajú do čipu DD2 (regulácia logickej úrovne na riadkoch, LED anódy), potom sa prenesú cez pin Q7 na DD3 (riadenie stĺpcov), najskôr načítame bajt, aby sme povolili stĺpec, potom bajt s logickými úrovňami v riadkoch. Stĺpce spínacej matice tranzistorov (LED katódy) sú pripojené k výstupným vedeniam DD3. Nižšie je uvedený programový kód na zobrazenie obrázka na matici:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Implementácia dynamickej indikácie pre maticu s rozlíšením 8x8 ;Frekvencia generátora hodín pre príklad je 4 MHz, cyklus stroja je 1 μs org 0000h ;spustenie vykonávania programu z adresy 0000h goto Start ;skok na štítok Štart ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Prerušenie rutiny org 0004h ;spustenie vykonávania podprogramu od adresy 0004h movwf W_TEMP ;uloženie hodnôt kľúčového registra ​​swapf STATUS,W ; clrf STATUS ; movwf STATUS_TEMP ; ; movwf FSR_osn ;do registra FSR_osn movf FSR_prer,W ;obnovenie predtým uloženej hodnoty movwf FSR ;registra FSR z registra FSR_prer ;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;načítať obsah registra stolb do čipu movf stolb,W ;skopírovať obsah registra stolb movwf var ;do registra var met2 btfsc var,0 ;nastaviť výstup ds v súlade s btfss var,0 ; bcf ds; bcf sh_cp ; rrf var,F ;Posuvný register var právo pripraviť;ďalší bit goto met2 ;scetbit sa nerovná nule: skok na označenie met2 ;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;nahrať obsah registra INDF do čipu;74HC595 (sériový posuvný register) movf INDF,W ;kopírovať obsah registra INDF movwf var ;do registra var movlw .8 ;zapísať číslo 8 do registra scetbit, pre počítanie movwf scetbit ;prenesené bity met1 btfsc var ,7 ;nastav výstup ds podľa bsf ds ;hodnota 7. bitu registra var btfss var,7 ; bcf ds; bsf sh_cp ;hodinový výstup sh_cp na zachytenie údajov bcf sh_cp ; rlf var,F ;Posuňte register var doľava na prípravu;ďalší bit decfsz scetbit,F ;Zníženie s podmienkou registra scetbit goto met1 ;scetbit sa nerovná nule: skok na označenie met1 ; bsf st_cp, hodiny výstupu st_cp na prenos načítaného bcf st_cp, bajtov na výstupné riadky čipov 74HC595; bcf STATUS,C ;vynulovanie bitu C stavu registra pred posunom rrf stolb,F ;ľavý posuvný register stolb ; incf FSR,F ;Zvýšte register FSR, pripravte ďalej ;Zaregistrujte sa na odoslanie údajov na 74HC595 decfsz list,F ;Znížte s podmienkou registra shet goto exxit ;Registr listu sa nerovná 0: Skok na ukončenie movlw data1 ;Registr listu sa rovná 0: Najprv zapíšte adresu movwf FSR ;Registrácia na ukladanie informácií do registra FSR movlw .8 ;Zápis čísla 8 do registra listov, na udržiavanie listu movwf ;Počítanie stĺpcov ; exit bcf INTCON,T0IF ;reset príznak prerušenia pretečenia TMR0 movlw . 124 ;zapis cislo 124 do casoveho registra TMR0 movwf TMR0 ; ; movf FSR,W ;Uložiť aktuálnu hodnotu FSR movwf FSR_prer ;Do FSR_prer movf FSR_osn ,W ;Obnoviť predtým uloženú hodnotu movwf FSR ;FSR z FSR_osn ; swapf STATUS_TEMP,W ;obnovenie obsahu kľúčových registrov movwf STATUS ; swapf W_TEMP,F ; swapf W_TEMP,W ; ; retfie ;opustenie podprogramu prerušenia;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Spustenie hlavného programu ................ ;Počiatočné nastavenie registrov ................. ;Špeciálny účel..... ............ bsf STATUS,RP0 ;zapíšte binárne číslo 11010011 do registra movlw b"11010010" ;OPTION_REG, čím sa nastaví interný movwf OPTION_REG ;zdroj hodín pre TMR0 bcf STATUS,RP0 ;predvoľba preddeličky TMR0, nastavte pomer preddeličky 1:8; movlw .8 ;zapis 8 do registra listu, pred spustením movwf shet ;pretečenie TMR0 preruší, vykoná sa;raz, po zapnutí movlw b"10000000" ;zapíš binárne číslo 10000000 do movwf stolb ;register stolb, vykoná sa 1. stĺpec; raz, po zapnutí napájania; movlw data1 ;Zapíšte adresu prvého registra (úložné registre movwf FSR_prer ;informácie) do registra FSR_prer, vykoná sa;jedenkrát po zapnutí; movlw .8 ;vymazanie 8 registrov výstupu informácií do movwf tmp ;matica, ekvivalentná vypnutiu movlw data1 ;matica movwf FSR ; met3 clrf INDF ; incf FSR,F ; decfsz tmp,F ; goto met3 ; ; bcf INTCON,T0IF ;vymazať príznak prerušenia pri pretečení TMR0 bsf INTCON,T0IE ;povoliť prerušenia pri pretečení TMR0 bsf INTCON,GIE ;povoliť globálne prerušenia; m1 movlw data1 ; Príklad výstupu R movwf FSR ; movlw b"00000000" ; movwf INDF ; incf FSR,F ; movlw b"01111111" ; movwf INDF ; incf FSR,F ; movlwb"00001001" ; movwf INDF ; incf FSR,F ; movlwb"00011001" ; movwf INDF ; incf FSR,F ; movlwb"00101001" ; movwf INDF ; incf FSR,F ; movlw b"01000110" ; movwf INDF ; incf FSR,F ; movlw b"00000000" ; movwf INDF ; incf FSR,F ; movlw b"00000000" ; movwf INDF ; ; .................; .................; .................; ; koniec, koniec celého programu;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Implementácia dynamickej indikácie pre maticu s rozlíšením 8x8

;Príklad hodinovej frekvencie 4 MHz, strojový cyklus 1 µs

org 0000h ;spustenie vykonávania programu na adrese 0000h

goto Start ;prejdite na označenie Štart

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Prerušte rutinu

org 0004h ;spustenie vykonávania podprogramu na adrese 0004h

movwf W_TEMP ;uložiť hodnoty registra kľúčov

swapf STATUS,W ;

movwf STATUS_TEMP ;

movf FSR,W ;uložiť aktuálnu hodnotu registra FSR

movwf FSR_osn ;do registra FSR_osn

movf FSR_prer,W ; obnoví predtým uloženú hodnotu

movwf FSR ;FSR z FSR_prer

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;74HC595 (sériový posuvný register)

movf stolb,W ; skopírujte obsah registra stolb

movwf var ;zaregistrovať var

movlw .8 ;zapíšte číslo 8 do registra scetbit, pre počítanie

movwf scetbit ;prenesené bity

met2 btfsc var,0 ;nastav ds vystup podla

bsf ds ; 7. bitová hodnota registra var

bsf sh_cp; výstup hodín sh_cp na zachytenie údajov

rrf var,F ; posun registra var právo pripraviť

; ďalší kúsok

decfsz scetbit,F ;zníženie s podmienkou registra scetbit

goto met2 ;scetbit sa nerovná nule: skok na označenie met2

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;74HC595 (sériový posuvný register)

movf INDF,W ; skopírujte obsah registra INDF

movwf var ;zaregistrovať var

movlw .8 ;zapíšte číslo 8 do registra scetbit, pre počítanie

movwf scetbit ;prenesené bity

met1 btfsc var,7 ;nastav ds vystup podla

bsf ds ; 7. bitová hodnota registra var

bsf sh_cp; výstup hodín sh_cp na zachytenie údajov

rlf var,F ;posun doľava var na prípravu

; ďalší kúsok

decfsz scetbit,F ;zníženie s podmienkou registra scetbit

goto met1 ;scetbit sa nerovná nule: skok na označenie met1

bsf st_cp ;hodiny výstupu st_cp na prenos načítané

bcf st_cp ;bajtov na 74HC595 výstupných riadkov

bcf STATUS,C ; pred posunom vymažte bit C stavového registra

rrf stolb,F ;ľavý posuvný register stolb

incf FSR,F ;prírastok registra FSR, pripraviť ďalšie

Zaregistrujte sa na odosielanie údajov na 74HC595

decfsz list,F ;zmenšenie pomocou listu stavu registra

goto exit ;listový register sa nerovná 0: skok na výstup

movlw data1 ;listový register je 0: napíšte adresu prvého

movwf FSR ;Zaregistrujte sa na ukladanie informácií do FSR

movlw .8 ;zapíšte číslo 8 do registra listov, pre referenciu

movwf list ;stĺpec počíta

movlw b"10000000" ;zapíšte binárne číslo 10000000 do

movwf stolb ;registrujte stolb, aby ste zahrnuli 1. stĺpec

exit bcf INTCON,T0IF ;resetovať príznak prerušenia pretečenia TMR0

movlw .124 ;zapíšte číslo 124 do registra časovača TMR0

movf FSR,W ;uložiť aktuálnu hodnotu registra FSR

movwf FSR_prer ;do registra FSR_prer

movf FSR_osn ,W ; obnoví predtým uloženú hodnotu

movwf FSR ;FSR od FSR_osn

swapf STATUS_TEMP,W ; obnovenie obsahu kľúčových registrov

swapf W_TEMP,F ;

swapf W_TEMP,W ;

retfie ;ukončiť rutinu prerušenia

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Hlavný program

Štart ................. ;úvodné nastavenie registrov

................. ;špeciálny účel

.................

bsf STATUS,RP0 ;na registráciu napíšte binárne číslo 11010011

movlw b"11010010" ;OPTION_REG, čím sa nastaví interný

movwf OPTION_REG ; zdroj hodín pre TMR0

bcf STATUS,RP0 ;povoliť preddeličku pred TMR0

;Nastavte pomer preddeličky na 1:8

movlw .8 ;pred spustením zapíšte číslo 8 do registra listov

movwf Shet ; Pretečenie TMR0 prerušuje, beží

;raz po zapnutí

movlw b"10000000" ;zapíšte binárne číslo 10000000 do

movwf stolb ;registrujte stolb, aby ste zahrnuli 1. stĺpec

Informácie s logickými úrovňami pre riadky každého stĺpca sú uložené v 8 registroch na ukladanie informácií, ku ktorým sa pristupuje. Adresa prvého registra sa nazýva data1. Okrem prvotného zápisu registrov shet a stolb je potrebné do registra FSR_prer zapísať adresu prvého registra ukladania informácií (register je data1, zápis do FSR_prer sa vykoná raz, potom sa opraví v handleri) , až potom povoľte prerušenia pretečenia TMR0.

Pred povolením prerušení je žiaduce vyčistiť registre ukladania informácií, táto operácia sa vykonáva pomocou dodatočného registra tmp (ako počítadla) a nepriameho adresovania, vymazanie je ekvivalentné vypnutiu matice.

V rutine obsluhy prerušení načítame obsah registra stolb do čipu DD2 (pri prvom vstupe do handlera po povolení prerušení register obsahuje číslo 10000000, ako je uvedené vyššie). Načítanie začína od nízkeho bitu registra stolb, ktorý sa pri načítavaní posúva v smere z Q0 na Q7 (vo vnútri čipu DD2), algoritmus načítania bol diskutovaný vyššie, takže si myslím, že nebude ťažké pochopiť kód . Ďalej načítame obsah registra INDF do DD2, ide o jeden z registrov na ukladanie informácií, ktorého adresa je v FSR (pri prvom vstupe do handlera po povolení prerušení FSR obsahuje adresu prvého register ukladania informácií nazývaný dáta1). Načítanie začína od najvyššieho bitu registra INDF. Po načítaní uvažovaných 2 bajtov nataktujeme výstup st_cp, čím sa stiahnuté dáta prenesú na výstupné linky mikroobvodov DD2, DD3. Pri prvom vstupe do handlera sa teda prepne prvý stĺpec matice, v ktorom sa rozsvietia LED diódy, na anódach ktorých je vysoká logická úroveň, v súlade s obsahom registra data1 ( prvý register uchovávania informácií).

Ďalej posunieme register stolb o jeden bit doprava, aby sme pripravili druhý stĺpec matice na prepnutie pri ďalšom vstupe do obsluhy prerušení. Príznak C registra STATUS musí byť pred posunom vymazaný, pretože k posunu dochádza cez tento príznak a jeho stav nie je v čase posunu známy. Po posune inkrementujeme register FSR a pripravíme ďalší úložný register (po registri data1) s úrovňami logických riadkov pre druhý stĺpec. Ďalej dekrementujeme listový register s podmienkou a ak sa nerovná nule, resetujeme príznak prerušenia pretečenia TMR0, zapíšeme číslo do časovača a ukončíme obsluhu prerušenia.

Keď nabudúce zadáte obslužný program, aktivuje sa druhý stĺpec matice atď. Pri vynulovaní listového registra (po prepnutí 8. stĺpca) sa do neho zapíše číslo 8 pre ďalší cyklus prepínania stĺpcov, navyše sa opraví hodnota registra stolb, adresa prvého registra ukladania informácií ( údaje1) sa zapisujú do registra FSR.

Vypočítajme časové oneskorenie pre časovač TMR0, hodinová frekvencia je 4 MHz, cyklus stroja je 1 µs. Aby sme sa vyhli blikaniu LED, vezmime obnovovaciu frekvenciu každého stĺpca ako 100 Hz (perióda T = 10 ms), časové oneskorenie je 10/8 = 1,25 ms. Pomer preddeličky TMR0 sme nastavili na 1:8, pričom maximálne možné oneskorenie je 256x8 = 2048 µs. Pre pauzu 1,25 ms by mal časovač počítať (256x1,25) / 2,048 = 156,25-krát, zaokrúhlením nahor dostaneme 156 impulzov. V súlade s tým je potrebné do časovača zapísať číslo 256-156 = 100. Nie je to však celkom správna hodnota, pretože vykonanie rutiny prerušenia trvá určitý čas, v tomto prípade to trvá asi 190 µs, prepočítané so zohľadnením započítaním koeficientu preddeličky dostaneme 190/8 = 23,75 alebo 24 počtov. Správna hodnota na zápis do TMR0 je: 100+24=124.

V hlavnom programe napíšeme 8 registrov na ukladanie informácií v súlade s tým, čo chceme zobraziť na matici. Nižšie je uvedený diagram vysvetľujúci výstup informácií do matice pre vyššie uvedený kód.


Okrem posuvných registrov existujú špecializované ovládače na zobrazovanie informácií na sedemsegmentových indikátoroch a LED matice, v tomto prípade samotný ovládač implementuje dynamickú indikáciu, zostáva doňho posielať údaje na zobrazenie. Skontroloval som jeden z týchto populárnych ovládačov v článku o.

Pod odkazom si môžete stiahnuť firmvér a zdrojový kód pre mikrokontrolér PIC16F628A s implementáciou dynamickej indikácie na matici 8x8 pomocou dvoch posuvných registrov 74HC595, schéma zapojenia bola diskutovaná vyššie. Na matrici sa striedavo zobrazujú písmená R, L, číslo 46, smajlík a len vzor v podobe kríža, táto animácia je znázornená na videu nižšie.

so značkami, . Čítať .