Ex.: Rotinas de tempo ORG 0000h PADRAO EQU 11111110b PORTA EQU P1 VBASE EQU 0800h mov r0,# PADRAO inicio: mov PORTA,r0 ;***********TEMPO DE 1S ************ mov dptr,#vbase ; Tt= 2T espera1: mov r1,#0f2h ; Tt=2T+1T espera: djnz r1,espera ; Tt=2T+1T+2T*R1 djnz dpl,espera1 ; Tt=2T+(1T+2T*R1+2T)*DPL djnz dph,espera1 ;Tt=2T+((1T+2T*R1+2T)*DPL+2T)*DPH ;***********FIM DE 1S ************ mov a,r0 rl a mov r0,a ljmp inicio end ; Para R1=256 e DPL=256 calcula H para 1s. H=7,58 ; Fazendo H=8 e DPL=256 temos: R1=f2H ; Este tempo é aproximado. 1
1. Temporizadores / Contadores Operação independente dos demais componentes do microcontrolador Funcionamento programável por software Aplicações: Contagem de tempo Medição da largura de pulsos Geração de sinais PWM Geração periódica de interrupções 2
2. Estrutura Básica T/C 3
4
3. Registro de Modo TMOD bit 7 bit 0 GATE1 C/T1 M1.1 M0.1 GATE0 C/T0 M1.0 M0.0 A função Timer/Contador é selecionada pelos bits de controle C/T no TMOD. Os dois Timers tem 4 modos de operação, selecionados pelos bits (M1,M0) em TMOD. Os modos 0, 1 e 2 são iguais para ambos Ts/Cs. No modo 3 existe diferença. 5
3. Registro de Modo TMOD bit 7 bit 0 GATE1 C/T1 M1.1 M0.1 GATE0 C/T0 M1.0 M0.0 GateX Quando em 1 o T/CX é habilitado somente enquanto INTX estiver em alto e TRX setado. Quando em 0 dependerá apenas de TRX. 6
4. Registro de Controle TCON bit 7 bit 0 TF1 TR1 TF0 TR0 TFX - Colocado em 1 pelo T/CX quando de um overflow. É zerado pelo hardware quando o processador vai para ISR ou por software através de instrução. TRX Quando setado ou zerado por software faz o T/CX contar ou parar, respectivamente. 7
4. Modo de Operação dos T/C MODO 0 Modo 0 - Temporizador / Contador de eventos de 8 bits com prescaler de 5 bits: A divisão de freqüência é programada nos 5 bits menos significativos de TL0 ou TL1 (2 a 32). A contagem ocorre nos 8 bits de TH0 ou TH1. Ao ocorrer estouro da capacidade de contagem ocorre o pedido da interrupção correspondente, se habilitada. A recarga do valor inicial é feita por software. 8
4. Modo de Operação dos T/C MODO 0 OSC. 12 C/T0=0 Terminal T0 C/T0=1 Controle TL0 (5 bits) TH0 (8 bits) TF0 Interrupção TR0 & GATE0 1 Terminal INT0\ 9
4. Modo de Operação dos T/C MODO 1 Modo 1 - Temporizador / Contador de eventos de 16 bits: A contagem ocorre nos 16 bits de TH0/TL0 ou TH1/TL1 Ao ocorrer estouro da capacidade de contagem ocorre o pedido da interrupção correspondente, se habilitada A recarga do valor inicial é feita por software 10
4. Modo de Operação dos T/C MODO 0 OSC. 12 C/T0=0 Terminal T0 C/T0=1 Controle TH0 (8 bits) TL0 (8 bits) TF0 Interrupção TR0 & GATE0 1 Terminal INT0\ 11
4. Modo de Operação dos T/C MODO 2 Modo 2 - Temporizador / Contador de eventos de 8 bits com recarga automática: A contagem ocorre nos 8 bits de TL0 ou TL1. O valor de recarga do valor inicial ao ocorrer estouro da capacidade de contagem fica armazenado em TH0 ou TH1. O T/C1 operando no Modo 2 serve para gerar a taxa de transmissão da interface serial. 12
4. Modo de Operação dos T/C MODO 2 OSC. 12 C/T0=0 Terminal T0 C/T0=1 Controle TH0 (8 bits) TF0 Interrupção TR0 & Recarga GATE0 Terminal INT0\ 1 TL0 (8 bits) 13
4. Modo de Operação dos T/C MODO 3 Modo 3 - Duplo Temporizador / Contador de 8 bits (apenas T/C0): Contagens de 8 bits independentes ocorrem em TH0 (controlada pelos bits TR1 e TF1) e TL0 (controlada pelos bits TR0 e TF0). Com o T/C0 operando no Modo 3 é possível ter o T/C1 operando no Modo 2 para a geração da taxa de transmissão da interface serial. 14
4. Modo de Operação dos T/C MODO 3 OSC. 12 TH0 (8 bits) TF1 Interrupção TR1 Controle C/T0=0 Terminal T0 C/T0=1 Controle TL0 (8 bits) TF0 Interrupção TR0 & GATE0 1 Terminal INT0\ 15
5. Temporizadores / Contadores - Exemplos 1. Faça um programa que opere como um gerador de pulsos no pino P1.0, com 400 μs de duração o período, duty cycle igual a 50%. Utilize o T/C 0 no modo 2 (contador de 8 bits com recarga automática). Considere Fclock de 12MHz. Rótulo Instrução/Diretiva Comentário ORG 0000H ; reset Inicio: MOV TMOD,#00000010B ; define modo 2 no T/C 0 MOV TL0,#38H ; valor para gerar 200 contagens (256-56=200) MOV TH0,#38H ; valor de recarga de TL0 SETB TR0 ; dispara contagem Loop: JNB TF0, Loop ; testa overflow da contagem em T/C 0 no bit TF0 CLT TR0 ; para a contagem CPL P1.0 ; complementa bit p1.0 CLR TF0 ; limpa flag de overflow da contagem SETB TR0 ; habilita contagem JMP Loop ; retorna ao loop 16
5. Temporizadores / Contadores - Exemplos 2. Faça um programa que opere como temporizador de 65 ms no T/C 1, com emprego de interrupção. Ao final da temporização, o LED 1 comuta seu estado. 17
5. Temporizadores / Contadores - Exemplos Rótulo Instrução/Diretiva Comentário ORG 0000H ; reset JMP Inicio ; salta para o inicio do programa principal ORG 001BH ; vetor interrupção do timer 1 (001BH) JMP IsrCT1 ; entrada da ISR do C/T 1 Inicio: MOV TMOD,#00010000B ; define o modo 1 para o C/T 1 MOV TH1,#02H ; valor de carga do C/T 1 = 536 (0218H = 536) MOV TL1,#18H ; temporização de 65.536 65000 = 536 (65 ms) MOV IE,#10001000B ; EA=1 (habilita int.), ET1=1 (habilita int. do C/T 1) SETB TR1 ; dispara timer Loop: JMP Loop ; programa em loop infinito, aguarda interrupção IsrCT1: CLR TR1 ; parada do temporizador CPL P1.0 ; comuta estado do pino P1.0 (muda estado do LED 1) MOV TH1,#02H ; recarrega C/T 1 com 536 (= 0218H) MOV TL1,#18H SETB TR1 ; dispara temporizador RETI ; retorna da ISR 18
5. Temporizadores / Contadores - Exemplos 3. Faça um programa que faça dois leds ligados em P1.0 e P1.1 piscarem a cada 1 segundo. 19
Rótulo Instrução Comentário ORG 0000H ; reset JMP Inicio ; salta vetor interrupção do C/T 1 ORG 001BH ; endereço do vetor interrupção do C/T 1 JMP IsrCT1 ; entrada da ISR do C/T 1 Inicio: MOV TMOD,#00010000B ; define o modo 1 para o C/T 1 MOV TH1,#HIGH(15536) ; carrega a parte alta em TH1 para 50.000 MOV TL1,#LOW(15536) ; carrega a parte baixa em TL1 MOV R0,#20 ; contador do número de interrupções SETB P1.0 ; desativa LED0 CLR P1.1 ; ativa LED1 MOV IE,#10001000B ; habilita interrupção do timer 1 SETB TR1 ; dispara timer Loop: JMP Loop ; programa em loop, saída por interrupção ; Rotina de Serviço de Interrupção IsrCT1: CLR TR1 ; parada de C/T 1 DEC R0 ; decrementa contador de interrupções CJNE R0,#0FFH,Segue ; se contador <> ffh, não recarrega MOV R0,#20 ; se sim, recarrega contador CPL P1.0 ; complementa pino P1.0 CPL P1.1 ; idem para P1.1 Segue: MOV TH1,#HIGH(15536) ; recarrega a parte alta em TH1 MOV TL1,#LOW(15536) ; recarrega a parte baixa em TL1 SETB TR1 ; dispara C/T1 RETI ; retorna da interrupção 20
5. Temporizadores / Contadores - Exercícios 4. Considere uma CPU que possui 8 leds ligados a porta P1 do 8051. O programa deve acender seqüencialmente por 1s cada um dos leds. Neste exemplo o tempo deverá ser gerado pelo timer e controlado por status. Considere que o led acende com 0 e a freqüência de 12MHz. 21
5. Temporizadores / Contadores - Exercícios ORG 0000h padrao EQU 11111110B porta EQU P1 inicio: mov r0,#padrao Again: mov porta,r0 call tempo mov a,r0 rla mov r0,a ljmp again ;*************** *******************TEMPO DE 1S Tempo: mov r2,#20 ;20*50ms=1s ;********33**************************programa e faz o timer contar 50ms mais50: mov th0,#high(-50000) ; coloca em th0 parte alta de ffffh-50000 mov tl0,#low(-50000) ; coloca em tl0 parte baixa de ffffh-50000 mov tmod,#00000001b ; timer 0, modo 1, disparo por tr0 setb tr0 ; disparo contagem espera: jnb tf0,espera ; enquanto não tiver overflow espera clr tr0 ; paro o timer clr tf0 ; limpo a indicação de estouro djnz ret end r2,mais50 22
6. Temporizadores / Contadores - Exercícios 5. Considere uma CPU que possui 8 leds ligados a porta P1 do 8051. O programa deve acender seqüencialmente por 1s cada um dos leds. Neste exemplo o tempo deverá ser gerado pelo timer e controlado por interrupção. Considere que o led acende com 0 e a freqüência de 12MHz. 23
PADRAO EQU 11111110b PORTA EQU P1 ORG 0000h ljmp inicio ; desvio endereço do tratamento ORG 000Bh ; endereço para o tratamento da interrupção T0 ljmp isrt0 ; salta para a rotina de trat. da int. do T0 inicio: mov sp,#07 setb et0 ; seto bit do tcon que habilita o timer 0. mov r2,#20 ; num. de vezes que a int. do T0 deve acontecer para 1s. mov r0,#padrao mov porta,r0 mov th0,#high(-50000) ; programo o timer para 50ms mov tl0,#low(-50000) ; programo o timer para 50ms mov tmod,#00000001b ; modo 1, timer0, disparo por tr0 setb tr0 ; disparo o timer setb ea ; hab. global das interr. individualmente habilitadas. aguardo: ljmp aguardo ; µc está livre para executar novas funções ;***********INICIO DA INTERRUPT SERVICE ROUTINE isrt0: djnz r2,nao20 ; se não chegou a 1s vai para nao20 mov r2,#20 ; se chegou reinicializo contador de interrupções mov a,r0 ; recupero padrão rl a ; rotaciono mov r0,a ; mov porta,r0 nao20: mov th0,#high(-50000) ; reinicializo o timer mov tl0,#low(-50000) ; reinicializo o timer reti ;*********** FIM DE isrt0 ************ end 24