Ing. Josef Grosman TECHNICKÁ UNIVERZITA V LIBERCI Fakulta mechatroniky, informatiky a mezioborových studií Tento materiál vznikl v rámci projektu ESF CZ.1.07/2.2.00/07.0247, který je spolufinancován Evropským sociálním fondem a státním rozpočtem ČR
TH0 16 TL0 8 CT0 8 f osc /12 = f CT TH1 16 TL1 8 CT1 8 TF1
TH0 16 TL0 8 CT0 8 f osc /12 = f CT FFFF 0000 TH1 16 TL1 8 CT1 8 TF1
TH0 16 TL0 8 CT0 8 1 if(){ =0;. f osc /12 = f CT FFFF 0000 TH1 16 TL1 8 CT1 8 TF1
TH0 16 TL0 8 CT0 8 0 if(){ =0;. f osc /12 = f CT FFFF 0000 TH1 16 TL1 8 CT1 8 TF1
TH0 16 TL0 8 CT0 8 if(){ =0;. f osc /12 = f CT FFFF 0000 TH1 16 TL1 8 CT1 8 TF1 1
TH0 16 TL0 8 CT0 8 if(){ =0;. f osc /12 = f CT FFFF 0000 TH1 16 TL1 8 CT1 8 TF1 0 if(tf1){ TF1=0;.
Obsah časovače je periodicky zvyšován (inkrementován) s periodou T CT = 1/f CT = 12/f osc = MC TH0 16 TL0 8 CT0 8 f osc /12 = f CT FFFF 0000 TH1 16 TL1 8 CT1 8 TF1
Obsah časovače je periodicky zvyšován (inkrementován) s periodou T CT = 1/f CT = 12/f osc = MC Příznak je periodicky nastavován do 1 s periodou T per TH0 16 TL0 8 CT0 8 f osc /12 = f CT FFFF 0000 TH1 16 TL1 8 CT1 8 TF1
Obsah časovače je periodicky zvyšován (inkrementován) s periodou T CT = 1/f CT = 12/f osc = MC Příznak je periodicky nastavován do 1 s periodou T per TH0 16 TL0 8 CT0 8 f osc /12 = f CT FFFF 0000 TH1 16 TL1 8 CT1 8 TF1 T per t T per = K T CT = K 12/f osc
Obsah časovače je periodicky zvyšován (inkrementován) s periodou T CT = 1/f CT = 12/f osc = MC Příznak je periodicky nastavován do 1 s periodou T per TH0 16 TL0 8 CT0 8 f osc /12 = f CT FFFF 0000 TH1 16 TL1 8 CT1 8 TF1 T per t T per = K T CT = K 12/f osc T max = 65536 T CT = 786432/f osc
Obsah časovače je periodicky zvyšován (inkrementován) s periodou T CT = 1/f CT = 12/f osc = MC Příznak je periodicky nastavován do 1 s periodou T per TH0 16 TL0 8 CT0 8 f osc /12 = f CT FFFF 0000 TH1 16 TL1 8 CT1 8 TF1 T per T per = K T CT = K 12/f osc T max = 65536 T CT = 786432/f osc t f osc = 20,00 MHz T CT = 0,6 μs T max = 39,3216 ms
Obsah časovače je periodicky zvyšován (inkrementován) s periodou T CT = 1/f CT = 12/f osc = MC Příznak je periodicky nastavován do 1 s periodou T per TH0 16 TL0 8 CT0 8 f osc /12 = f CT FFFF 0000 TH1 16 TL1 8 CT1 8 TF1 T per T per = K T CT = K 12/f osc T max = 65536 T CT = 786432/f osc t f osc = 20,00 MHz T CT = 0,6 μs T max = 39,3216 ms K = T per f osc /12
Obsah časovače je periodicky zvyšován (inkrementován) s periodou T CT = 1/f CT = 12/f osc = MC Příznak je periodicky nastavován do 1 s periodou T per TH0 16 TL0 8 CT0 8 f osc /12 = f CT FFFF 0000 TH1 16 TL1 8 CT1 8 TF1 T per T per = K T CT = K 12/f osc T max = 65536 T CT = 786432/f osc t f osc = 20,00 MHz T CT = 0,6 μs T max = 39,3216 ms K = T per f osc /12 Tper [ms] 6 12 18 24 30 36 K (20,00MHz) 10000 20000 30000 40000 50000 60000
Obsah časovače je periodicky zvyšován (inkrementován) s periodou T CT = 1/f CT = 12/f osc = MC Příznak je periodicky nastavován do 1 s periodou T per TH0 16 TL0 8 CT0 8 f osc /12 = f CT FFFF 0000 TH1 16 TL1 8 CT1 8 TF1 T per T per = K T CT = K 12/f osc T max = 65536 T CT = 786432/f osc t f osc = 20,00 MHz T CT = 0,6 μs T max = 39,3216 ms K = T per f osc /12 Tper [ms] 6 12 18 24 30 36 K (20,00MHz) 10000 20000 30000 40000 50000 60000 T I > T max : T I = N T per (1s 167 6 ms )
Použití časovačů 1. Režim časovače (režim mód 1) registr TMOD
Použití časovačů 1. Režim časovače (režim mód 1) registr TMOD Časovač CT0 xxxx0001 TMOD = 0b00000001;
Použití časovačů 1. Režim časovače (režim mód 1) registr TMOD Časovač CT0 xxxx0001 TMOD = 0b00000001; Časovač CT1 0001xxxx TMOD = 0b00010000;
Použití časovačů 1. Režim časovače (režim mód 1) registr TMOD Časovač CT0 xxxx0001 TMOD = 0b00000001; TMOD &= 0b11110000; TMOD = 0b00000001; Časovač CT1 0001xxxx TMOD = 0b00010000; TMOD &= 0b00001111; TMOD = 0b00010000;
Použití časovačů 1. Režim časovače (režim mód 1) registr TMOD Časovač CT0 xxxx0001 TMOD = 0b00000001; TMOD &= 0b11110000; TMOD = 0b00000001; Časovač CT1 0001xxxx TMOD = 0b00010000; TMOD &= 0b00001111; TMOD = 0b00010000; 2. Nastavení hodnoty -N:
Použití časovačů 1. Režim časovače (režim mód 1) registr TMOD Časovač CT0 xxxx0001 TMOD = 0b00000001; TMOD &= 0b11110000; TMOD = 0b00000001; Časovač CT1 0001xxxx TMOD = 0b00010000; TMOD &= 0b00001111; TMOD = 0b00010000; 2. Nastavení hodnoty -N: MSB do TH0, LSB do TL0 resp. TH1,TL1 a spuštění časovače #define TPER (-10000) /* perioda 6 ms */ #define T1s 167 /* 167 6 ms 1 s */ byte cnt_ticks; TL0 = (byte) TPER; TH0 = (word)tper>>8; TR0 = 1; /* start časovače */ cnt_ticks = T1s; /* na 1 vterinu */
3. Reload časovače FFFF 0000 =0 časovač běží od 0
3. Reload časovače if() { = 0; TL0 = (byte)tper; TH0 = (word)tper >> 8; if(++cnt_ticks==t1s) { cnt_ticks = 0; if() { =0; Opětné nastavení časovače /* akce... */ časovač běží od 0
3. Reload časovače - nepřesnosti if() { = 0; TL0 = (byte)tper; TH0 = (word)tper >> 8; if(++cnt_ticks==t1s) { cnt_ticks = 0; if() { =0; TPER T per if() { =0; t TPER /* akce... */ časovač běží od 0 nemusí být konstantní
3. Reload časovače - nepřesnosti Opětné nastavení časovače if() { TL0 = (byte)tper; TH0 = (word)tper >> 8; = 0; if(++cnt_ticks==t1s) { cnt_ticks = 0; if() { =0; TPER T per if() { =0; t TPER /* akce... */ časovač běží od 0 nemusí být konstantní Omezení nepřesnosti : nejdříve nastavit časovač a pak nulovat užití přerušení přesné nastavení (v asembleru)
Příkládek blikání sloupcových diod resp. samostatné LED (červené)
Příkládek blikání sloupcových diod resp. samostatné LED (červené) Stisknutí tlačítka 1 - diody blikají s intervalem 1 s (1 s svítí, 1 s nesvítí), Stisknutí tlačítka 2 - zastaví blikání Na LCD se zobrazí buď Blikani LED Start: TL1 nebo Blikani LED Stop: TL2 varianty 1. červená LED 2. jedna dioda LED Baru (horní na nulté pozici) 3. všechny diody LED Baru 4. střídavě liché a sudé diody LED Baru
#include <stdio.h> #include <at89c51cc03.h> #include typy.h #define Tlac1 #define Tlac2 #define LED_R #define LED_Y #define LED_G #define REPRO P3_2 P3_3 P4_2 P4_3 P4_4 P3_6 #define TPER (-10000) #define N_TICKS 167 void LBarInit(void); void LedBar(word); void LcdInit(void); byte cnt_ticks=0; word diody;
void main(void) { TMOD =0b00000001; LBarInit(); LcdInit(); printf( Blikani LED\nStart: TL1 );
void main(void) { TMOD =0b00000001; LBarInit(); LcdInit(); printf( Blikani LED\nStart: TL1 ); while(1) { if(!tlac2 && TR0) { TR0 = 0; printf( \nblikani LED\nStart: TL1 );
void main(void) { TMOD =0b00000001; LBarInit(); LcdInit(); printf( Blikani LED\nStart: TL1 ); while(1) { if(!tlac2 && TR0) { TR0 = 0; printf( \nblikani LED\nStart: TL1 ); if(!tlac1 &&!TR0) { TL0 = (byte)tper; TH0 = (word)tper >> 8; TR0 = 1; = 0; printf( \nblikani LED\nStop: TL2 );
void main(void) { TMOD =0b00000001; LBarInit(); LcdInit(); printf( Blikani LED\nStart: TL1 ); while(1) { if(!tlac2 && TR0) { TR0 = 0; printf( \nblikani LED\nStart: TL1 ); if(!tlac1 &&!TR0) { TL0 = (byte)tper; TH0 = (word)tper >> 8; TR0 = 1; = 0; printf( \nblikani LED\nStop: TL2 ); if() { TL0 = (byte)tper; TH0 = (word)tper >> 8; = 0; if(++cnt_ticks==n_ticks) { cnt_ticks=0; LED_R =!LED_R;
void main(void) { TMOD =0b00000001; LBarInit(); LcdInit(); printf( Blikani LED\nStart: TL1 ); blikání sloupcové diody diody=0; while(1) { if(!tlac2 && TR0) { TR0 = 0; printf( \nblikani LED\nStart: TL1 ); if(!tlac1 &&!TR0) { TL0 = (byte)tper; TH0 = (word)tper >> 8; TR0 = 1; = 0; printf( \nblikani LED\nStop: TL2 ); if() { TL0 = (byte)tper; TH0 = (word)tper >> 8; = 0; if(++cnt_ticks==n_ticks) { cnt_ticks=0; LedBar(diody^=1);
void main(void) { TMOD =0b00000001; LBarInit(); LcdInit(); printf( Blikani LED\nStart: TL1 ); blikání celého LED Baru diody=0; while(1) { if(!tlac2 && TR0) { TR0 = 0; printf( \nblikani LED\nStart: TL1 ); if(!tlac1 &&!TR0) { TL0 = (byte)tper; TH0 = (word)tper >> 8; TR0 = 1; = 0; printf( \nblikani LED\nStop: TL2 ); if() { TL0 = (byte)tper; TH0 = (word)tper >> 8; = 0; if(++cnt_ticks==n_ticks) { cnt_ticks=0; LedBar(diody^=0x3FF);
void main(void) { TMOD =0b00000001; LBarInit(); LcdInit(); printf( Blikani LED\nStart: TL1 ); střídavé blikání LED Baru LedBar(diody=0x155); while(1) { if(!tlac2 && TR0) { TR0 = 0; printf( \nblikani LED\nStart: TL1 ); if(!tlac1 &&!TR0) { TL0 = (byte)tper; TH0 = (word)tper >> 8; TR0 = 1; = 0; printf( \nblikani LED\nStop: TL2 ); if() { TL0 = (byte)tper; TH0 = (word)tper >> 8; = 0; if(++cnt_ticks==n_ticks) { cnt_ticks=0; LedBar(diody^=0x3FF);
Příkládek blikání diod, modifikace s pípnutím Stisknutí tlačítka 1 - diody blikají s intervalem 1 s (1 s svítí, 1 s nesvítí), Stisknutí tlačítka 2 - zastaví blikání Na LCD se zobrazí buď Blikani LED Start: TL1 nebo Blikani LED Stop: TL2 Po dobu stisknutí tlačítek bude piezoreproduktorek generovat tón varianty 1. červená LED 2. jedna dioda LED Baru (horní na nulté pozici) 3. všechny diody LED Baru 4. střídavě liché a sudé diody LED Baru
Příkládek blikání diod, modifikace s pípnutím Generování tónu můžeme zajistit druhým časovačem (CT1) V režimu 2 (autorelaod) jako 8 bitový časovač T 1max = 256 T CT = 256 0,6 μs = 153,6 μs perioda tónu T rep = 2 T 1max = 307,3 μs frekvence tónu f = 1/T rep = 3255 Hz TMOD =0b00100001; // TMOD = 0x21; TR1 =!Tlac1 &&!Tlac2; if(tf1) { TF1 = 0; REPRO =!REPRO;
Příkládek blikání diod, modifikace s pípnutím Pro jinou frekvenci tónu hodnota předvolby K = 833333/f 1. f>3255 Hz (tj. K < 256), časovač v režimu 2 (autoreload) pouze při inicializaci: TH1 = (byte)(-k); TMOD =0b00100001; // TMOD = 0x21; TH1 = (byte)(-k); if(tf1) { TF1 = 0; REPRO =!REPRO; 2. f<3255 Hz, (tj. K > 256) časovač v režimu 1 (SW reload) vždy při přetečení (1 TF1) TL1 = (byte)(-k); TH1 = (word)(-k)>>8; TMOD =0b00010001; // TMOD = 0x11; if(tf1) { TL1 = (byte)(-k); TH1 = (word)(-k) >> 8; TF1 = 0; REPRO =!REPRO;