ESCOLA NAVAL DEPARTAMENTO DE ENGENHEIROS NAVAIS RAMO DE ARMAS E ELECTRÓNICA
PIC16F628A Exemplo de implementação “Controlo de Acessos” Nuno Pessanha Santos
[email protected] [email protected]
Janeiro de 2013
ÍNDICE
1. Âmbito do Projecto ..................................................................................................................................................... 3 2. Descrição geral do funcionamento ............................................................................................................................ 3 3. Pinout utilizado ........................................................................................................................................................... 4 4. Recursos do Microcontrolador PIC16F628A utilizados ............................................................................................. 4 4.1. Frequência Interna utilizada .................................................................................................................................... 4 4.2. PWM ........................................................................................................................................................................ 5 4.2.1.
Fundamento Teórico .......................................................................................................................................... 5
4.2.2.
PWM vs Microcontrolador PIC16F628A ............................................................................................................ 5
4.2.3.
PWM Rápido & Lento ......................................................................................................................................... 6
4.2.3.1. PWM Rápido ...................................................................................................................................................... 6 4.2.3.2. PWM Lento ......................................................................................................................................................... 6 4.2.3.3. Descrição geral da rotina em Assembly criada – PWM ..................................................................................... 7 4.3. TMR1 ....................................................................................................................................................................... 7 4.3.1.
Descrição geral .................................................................................................................................................. 7
4.3.2.
TMR1 vs Delay ................................................................................................................................................... 7
4.3.2.1. Delay de 0,5 segundos ....................................................................................................................................... 8 4.3.2.2. Descrição geral da rotina em Assembly criada – Delay .................................................................................... 8 4.3.2.3. Efetuar os delays de 15, 30 e 90 segundos pretendidos ................................................................................... 8 4.4. Display BCD/7 Segmentos ...................................................................................................................................... 9 4.4.1.
Descrição geral .................................................................................................................................................. 9
4.4.2.
Descrição geral da rotina em Assembly criada - Display................................................................................... 9
5. Conclusões ................................................................................................................................................................ 9 6. Bibliografia ............................................................................................................................................................... 10 7. Anexos ..................................................................................................................................................................... 11 7.1. Fluxograma Geral - Inicialização + Situação de Espera + BP Pressionado ......................................................... 11
2
1. ÂMBITO DO PROJECTO Neste projeto pretende-se utilizar os conceitos adquiridos na área dos sistemas digitais e sistemas eletrónicos embebidos, e utilizando o Microcontrolador PIC16F628A, desenvolver um projeto prático para possibilitar o desenvolvimento dos conhecimentos adquiridos. O projeto que se desenvolveu permite realizar o comando de dois semáforos luminosos (um para a saída de carros de uma garagem e outro para possibilitar controlar o avanço de peões numa passadeira) e de uma cancela (através de PWM – Pulse Width Modulation). As indicações luminosas para carros e peões possuem 2 leds cada um (um vermelho e outro verde), possibilitando assim a paragem (vermelho) ou o avanço (verde) respetivamente, quer se trate de um carro ou de um peão. Associado ao sistema está também um display BCD/7Segmentos que mostra o número de vezes que o peão carregou no botão de pressão – BP - existente (display reiniciado com o valor zero ao passar o valor decimal 9). A implementação foi realizada utilizando o Software MPLAB® IDE v8.88 da Microchip© e os esquemas apresentados foram elaborados utilizando o ISIS Profissional da Labcenter© Electronics v. 7.7 SP2 (Build 9089). 2. DESCRIÇÃO GERAL DO FUNCIONAMENTO O problema proposto assenta essencialmente num estado de espera do sistema, e numa rotina que se repete ciclicamente sempre que o peão carrega no botão de pressão (BP). O sistema permanece em espera até o botão BP ser pressionado, após esta ação o led para os carros fica vermelho após 30 segundos de espera e a cancela fecha passados mais 15 segundos (PWM). Após ocorrer o fecho da cancela (detetado pelo sensor de fim de curso – FC) o led para os peões fica verde. Esta situação mantém-se durante 90 segundos, após a qual o led dos peões fica vermelho, passados 15 segundos a cancela abre (PWM) e mais 15 segundos o led para os carros passa a verde. A cancela é acionada por um motor que necessita de ter duas velocidades distintas, uma para o fecho e outra para a abertura (PWM mais rápido para a abertura da cancela). Os sinais PWM utilizados, com frequência, largura de ciclo e valor médio diferentes, têm origem no pino CCP1 do PIC16F628A. Para possibilitar uma abertura mais rápida, e imaginando que o motor utilizado é p.ex. um servomotor, procurou-se não só fazer variar a frequência e largura de ciclo como é pedido no enunciado do projeto, mas também garantir que o valor médio apresentado (maior duty cycle) no caso da abertura seria maior. Para possibilitar o controlo do sistema, é também pedido a utilização de um display BCD/7 Segmentos, devendo apresentar o número de acionamentos de BP até um valor máximo de 9 decimal. Após este valor ser alcançado o contador é reinicializado novamente com o valor 0 decimal.
VIA
TU
RA
O
PEÃ
Figura 1 – Representação geral do problema proposto
3
3. PINOUT UTILIZADO
ENTRADAS
SAÍDAS
BP
RB0
BCD / 7 SEGMENTOS
RA0
MOTOR DA CANCELA
RB3
FC
RB1
BCD / 7 SEGMENTOS
RA1
LED PEÃO VERDE
RB4
BCD / 7 SEGMENTOS
RA2
LED PEÃO VERMELHO
RB5
BCD / 7 SEGMENTOS
RA3
LED CARRO VERDE
RB6
LED CARRO VERMELHO
RB7
Tabela 1 – Tabela de I/O
Display
Figura 2 – Esquema geral do sistema implementado
4. RECURSOS DO MICROCONTROLADOR PIC16F628A UTILIZADOS 4.1. Frequência Interna utilizada A frequência interna é um fator muito importante neste projeto, pois este baseia-se em rotinas de delay e em geração de sinais PWM. Para tal decidiu-se utilizar o clock interno existente no próprio microcontrolador de 4 MHz , possibilitando assim cumprir os objetivos propostos sem ter de recorrer a p.ex. um cristal externo. O relógio interno
% à temperatura ambiente (varia com a temperatura e a tensão baseia-se numa malha RC com uma precisão de ± 1 de alimentação do microcontrolador), não sendo esta variação relevante para a aplicação desenvolvida. Esta informação disponível no datasheet do fabricante em formato gráfico da (Microchip, 2007, p. 153:157).
ficando = Fosc 4 MHz = → Fint
T= int
4 (MHz ) = 1 MHz 4 (Q1,Q 2,Q3,Q 4)
1 1 6 = = 10 −= s 1 µs Fint 1× 106
4
4.2. PWM 4.2.1.Fundamento Teórico
Figura 3 – Exemplo de um sinal PWM ao longo do tempo
O conceito de PWM assenta no princípio de conseguir obter um valor de tensão analógico, através de um sinal que apenas permite apenas assumir o valor lógico 0 (0 V) ou 1 (5 V). Isto é possível ao fazer variar o valor médio obtido, se mantivermos o TPWM constante e existir a variação de Ton (Variando o Duty Cycle) podemos fazer com que o sinal de saída tenha um valor médio entre 0 e 5 V (. Vimpulso = 5 V ). A teoria por detrás deste “fenómeno” é facilmente compreendida da seguinte forma:
Vdc =
1 T
TPWM
∫ V ( t ) dt 0
Nota: Na equação anterior V ( t ) representa a tensão em função do tempo, TPWM o período e Vdc o valor médio obtido. Aplicando o conceito de PWM (Figura 3) à equação anterior, obtemos o seguinte:
⇒0≤ t ≤Ton ficando V 1 pois →= V= Vdc ( t ) impulso TPWM 0 ⇒ Ton < t ≤ TPWM
TPWM Ton originando Ton = × Vimpulso Vdc ∫ Vimpulso dt + ∫ 0 dt → 0 TPWM Ton
𝑉𝑉𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖 0 𝑉𝑉
𝑇𝑇𝑜𝑜𝑜𝑜
𝑇𝑇𝑃𝑃𝑃𝑃𝑃𝑃
Figura 4 – Representação de um impulso PWM
Podemos concluir que a tensão média obtida ( Vdc ) é diretamente proporcional Duty Cycle do sinal PWM.
Ton Duty 100 Cycle = × TPWM
[% ]
4.2.2.PWM vs Microcontrolador PIC16F628A O microcontrolador utilizado possui um pino que possibilita o uso de PWM, o pino RB3/CCP1 (pino 9 do microcontrolador), tendo uma resolução máxima de 10 bits. Ou seja, no caso de termos uma resolução disponível de 10 bits vamos ter uma regulação do duty cycle de 0 a 100% utilizando 1024 pontos de resolução. O período do PWM é controlado pelo TMR2, através do registo PR2, sendo este valor que vai definir o TPWM . Quando o TMR2 iguala o valor de PR2, um novo ciclo PWM é gerado. O período do PWM é definido pela seguinte fórmula (Microchip, 2007, p. 58): ( PR 2 ) + 1 × 4 × Tosc × TMR 2Prescaler T= PWM
5
Quando o TMR2 iguala o valor do registo PR2, ocorrem três eventos (Microchip, 2007, p. 58): •
TMR2 é limpo;
•
O pino CCP1 é colocado a um (exceto com duty cycle de 0%);
•
O duty cycle é copiado de CCPR1L para CCPR1H.
No microcontrolador não definimos o duty cycle diretamente, mas sim indiretamente, indicando qual o período em que o impulso se mantém no nível alto. Esse valor pode ser calculado da seguinte forma (Microchip, 2007, p. 59):
= Ton
[CCPRxL : CCPxCON < CCPxX : CCPxY >]Tosc × TMR 2Prescaler
A resolução máxima que obtemos, ou seja, o número de níveis com que vamos conseguir fazer variar o nosso duty cycle é dado por (Microchip, 2007, p. 59):
= Ton (CCPR1L : CCP1CON < 5 : 4 >) × Tosc × TMR 2Prescaler ⇔ (CCPR1L : CCP1CON = < 5 : 4 >)
= ⇔ 2n
Tosc
Ton Fosc log log 2Prescaler Ton Tosc * TMR= Fon * TMR 2Prescaler = ⇔n ⇔n * TMR 2Prescaler log2 log2
Tosc
Ton ⇔ × TMR 2Prescaler
[bits ]
4.2.3.PWM Rápido & Lento Através da aplicação direta das fórmulas matemáticas descritas acima obtém-se: 4.2.3.1. 1 2
PWM Rápido
TMR 2Prescaler = 4 1 1 FPWM = 1602 6,24 Hz → TPWM = = ≅ × 10 −4 segundos FPWM 1602
3
= TPWM
( PR 2 + 1) × TMR 2Prescaler × 4 × Tosc
⇔ PR = 2
TPWM 6,24 × 10 −4 = −1 = − 1 155 TMR 2Prescaler × 4 × Tosc 4 × 4 × 2,5 × 10 −7
4
PWMDuty cycle = 0.75 × 100 = 75%
5
Ton = PWMDuty cycle × TPWM = 0,75 × 6,24 × 10 −4 = 4,68 × 10 −4 s
6 = Ton
[CCPR1L : CCP1CON < 5 : 4 >] × TMR 2Prescaler × Tosc
⇔ (CCPR1L : CCP1CON = < 5 : 4 >) 7
= Resolução
REGISTO PR2
Ton TMR 2Prescaler
DECIMAL 155
⇔
Ton 4,68 × 10 −4 = = 468 TMR 2Prescaler × Tosc 4 × 2,5 × 10 −7
4,68 × 10 −4 log 4 × 2,5 × 10 −7 4,68 × 10 −4 n = ⇔2 = ⇔n ≅ 9,28 bits × Tosc log ( 2 ) 4 × 2,5 × 10 −7
BINÁRIO 10011011
REGISTO CCPR1L
DECIMAL 117
BINÁRIO 01110101
REGISTO CCP1CON<5:4>
DECIMAL 0
BINÁRIO 00
Tabela 1 – Configuração utilizada PWM Rápido
4.2.3.2. 1
PWM Lento
TMR 2Prescaler = 4
2
1 1 FPWM =992 1,0080645 Hz → TPWM = = ≅ × 10 −3 segundos FPWM 992
3
TPWM =
( PR 2 + 1) × TMR 2Prescaler × 4 × Tosc
2 ⇔ PR =
TPWM TMR 2Prescaler × 4 × Tosc
= −1
1,0080645 × 10 −3 = − 1 251 4 × 4 × 2,5 × 10 −7
6
4
PWMDuty cycle = 0.50 × 100 = 50%
−3 −4 5 Ton = PWMDuty cycle × TPWM = 0,50 × 1,0080645 × 10 = 5,04 × 10 s = 6 Ton [CCPR1L : CCP1CON < 5 : 4 > ] × TMR 2Prescaler × Tosc ⇔
= < 5 : 4 >) ⇔ (CCPR1L : CCP1CON 7
= Resolução REGISTO PR2
Ton TMR 2Prescaler
DECIMAL 251
Ton 5,04 × 10 −4 = = 504 TMR 2Prescaler × Tosc 4 × 2,5 × 10 −7
5,04 × 10 −4 log −7 5,04 × 10 −4 4 × 2,5 × 10 ≅ = ⇔ 2n = ⇔ 9.97 n bits × Tosc log ( 2 ) 4 × 2,5 × 10 −7
BINÁRIO 11111011
REGISTO CCPR1L
DECIMAL 176
BINÁRIO 01111110
REGISTO CCP1CON<5:4>
DECIMAL 0
BINÁRIO 00
Tabela 2 – Configuração utilizada PWM Lento
4.2.3.3. (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19)
Descrição geral da rotina em Assembly criada – PWM
LABEL ROTINA BANK1 MOVLW VALOR //VALOR CONFORME 𝑇𝑇𝑃𝑃𝑃𝑃𝑃𝑃 PRETENDIDO MOVWF PR2 BANK0 BCF CCP1CON,CCP1X //COLOCAR A ZERO OU UM CONFORME 𝑇𝑇𝑜𝑜𝑜𝑜 PRETENDIDO (BIT MENOS SIGNIFICATIVO DA RESOLUÇÃO) BSF CCP1CON,CCP1Y //COLOCAR A ZERO OU UM CONFORME 𝑇𝑇𝑜𝑜𝑜𝑜 PRETENDIDO MOVLW VALOR_2 //VALOR COLOCADO CONFORME 𝑇𝑇𝑜𝑜𝑜𝑜 PRETENDIDO (8 BITS MAIS SIGNIFICATIVOS) MOVWF CCPR1L MOVLW . VALOR_2 //MOVER O VALOR_2 PARA O REGISTO W MOVWF TMR2 //MOVER O VALOR_2 PARA O REGISTO TMR2, PARA QUANDO COLOCAR O TMR2ON O CICLO DO SINAL PWM INICIAR LOGO DE SEGUIDA BSF T2CON,TMR2ON //LIGAR O TMR2 ABRIR BTFSC PORTB,RB1 //TESTE AO SENSOR DE FIM DE CURSO - FC GOTO ABRIR MOVLW VALOR_2-1 (DECIMAL) //COLOCO O TMR2 NUMA ZONA EM QUE O NÍVEL DO SINAL PWM É BAIXO (0 V) POSSIBILITANDO ASSIM QUE QUANDO Sair DA ROTINA O PINO CCP1 ESTÁ A 0V MOVWF TMR2 BCF T2CON,TMR2ON //DESLIGAR O TMR2 RETURN
4.3. TMR1 4.3.1.Descrição geral O TMR1 é um temporizador/contador de 16 bits ( 216 = 65 536 decimal), divididos em dois registos de 8 bits – TMR1H e TMR1L. Este temporizador possui um registo de configuração T1CON, que permite configurar algumas opções nomeadamente o fator de prescaler a utilizar e possibilita ligar/desligar o temporizador (Microchip, 2007, p. 48). Estando todos os registos associados a este periférico, descritos na página 51 do datasheet do microcontrolador. 4.3.2.TMR1 vs Delay O delay criado utilizando o TMR1 é facilmente compreendido se dividirmos a análise em três partes: 1. O tempo necessário para incrementar o temporizador: Este tempo depende do Tint e do TMR1Prescaler escolhido, derivando na seguinte fórmula:
TMR1Incremento = Tint × TMR1Prescaler (segundos ) 2. O tempo necessário até ocorrer a sua flag, ou seja, qual o tempo máximo que o temporizador
vai conseguir “contar”: Este tempo depende do valor máximo do temporizador, que neste caso é 216 , derivando na seguinte fórmula:
7
TMR = 1Delay máximo TMR1Incremento × 216 (segundos ) 3. O valor que deve ser colocado nos registos TMR1H e TMR1L, para contar o tempo pretendido (efetuar a inicialização do temporizador): Se pretender p.ex. um delay de delay pretendido segundos (este valor tem de ser sempre inferior ao obtido em
TMR1Delay máximo ), deriva na seguinte relação:
= 216 − Valorinicialização 4.3.2.1. 1 2
delay pretendido × 216 (valor em decimal ) TMR1Delay máximo
Delay de 0,5 segundos TMR1Prescaler = 8 16 NPosições = 2 TTotal →TMR1 =TMR1Prescaler × NPosições × Tint =8 × 216 × 10 −6 ≅ 0,524288 Segundos
3
0,5 × NPosições 0,5 × 216 ValorTMR1→= 62500 = = 0.5 segundos TTotal →TMR1 0,524288
4
Valorincializacao = 216 − ValorTMR1→0.5 segundos = 65536 − 62500 = 3036 REGISTO TMR1H
DECIMAL 11
BINÁRIO 00001011
REGISTO TMR1L
DECIMAL 220
BINÁRIO 11011100
Tabela 3 – Valores de inicialização dos registos do TMR1
4.3.2.2. (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12)
Descrição geral da rotina em Assembly criada – Delay
ROTINA_DELAY MOVLW B’11011100’ //VALOR CONFORME TABELA 3 MOVWF TMR1L MOVLW B’00001011’ //VALOR CONFORME TABELA 3 MOVWF TMR1H BSF T1CON,TMR1ON //APÓS INICIALIZAÇÃO O TEMPORIZADOR É LIGADO DELAY_INT BTFSS PIR1,TMR1IF //VERIFICAÇÃO SE O TMR1IF ORIGINOU A SUA FLAG, SE O TMR1ATINGIU O SEU LIMITE (FLAG) A INSTRUÇÃO SEGUINTE NÃO É EXECUTADA GOTO DELAY_INT //SE NÃO ORIGINOU FLAG, VAI PARA A LABEL “DELAY_INT” BCF PIR1,TMR1IF //A FLAG É LIMPA BCF T1CON,TMR1ON //DESLIGA O TMR1 RETURN
4.3.2.3. (1) (2) (3) (4) (5)
Efetuar os delays de 15, 30 e 90 segundos pretendidos
DELAY CALL ROTINA_DELAY DECFSZ TEMPO,1 GOTO DELAY RETURN
Ao definir a variável “TEMPO” com o valor que pretendo repetir a rotina “ROTINA_DELAY” – 0,5 segundos – consigo efetuar os delays pretendidos da seguinte forma:
15 30 90 Delay= = 30 Delay= = 60 Delay= = 180 15 30 90 s decimal s decimal s decimal 0,5 0,5 0,5 Repetindo a rotina “ROTINA_DELAY” 30 vezes para um delay de 15 segundos, 60 vezes para um delay de 30 segundos e 180 vezes para um delay de 90 segundos.
8
Utilizando a ferramenta StopWatch, disponível no MPLAB® verificou-se que a rotina de verificação “DELAY”, juntamente com as últimas instruções da rotina “ROTINA_DELAY” levava cerca de 18 ciclos máquina a mais. Na situação mais desfavorável, repetição de 180 vezes iriamos ter:
Textra =18 × 180 × Tint =18 × 180 × 1× 10 −6 =0,00324 segundos O que numa rotina de 90 segundos, e tendo em conta a aplicação a que se destina, esta diferença não é relevante. 4.4. Display BCD/7 Segmentos 4.4.1.Descrição geral A indicação do número de vezes que o peão carregou em BP, deve ser feita num display BCD/7segmentos, ou seja, utilizando um descodificador antes do display. A utilização de um descodificador facilita muito a implementação pretendida, pois apenas é necessário que seja fornecido o valor em binário (4 saídas do PIC16F628A) ao descodificador.
Entrada do Descodificador (0 em BCD)
0 0 0 0
Descodificador BCD/7Segmentos
0 1 1 1 1 1 1
Saída do descodificador para o Display (dígito 0) 4 Entradas
Figura 5 – Representação do esquema do display utilizado – BCD/7Segmentos
(4 LSB – PORTA)
4.4.2.Descrição geral da rotina em Assembly criada - Display (1) (2) (3) (4) (5) (6) (7) (8) (9)
(1) (2) (3) (4)
ROTINA_DISPLAY INCF DISPLAY,1 //INCREMENTA O VALOR DA VARIÁVEL AUXILIAR “DISPLAY”, PORQUE O PEÃO CARREGOU EM - BP MOVLW .10 //MOVE PARA O REGISTO W O VALOR DECIMAL 10 SUBWF DISPLAY,0 //SUBTRAI O VALOR DECIMAL 10 AO VALOR DA VARIÁVEL AUXILIAR “DISPLAY” E GUARDA O RESULTADO EM W. BTFSC STATUS,Z //VERIFICA SE EXISTIU “FLAG ZERO” CALL REINICIAR_DISPLAY //SE EXISTIU FLAG, A ROTINIA DE REINICIALIZAÇÃO É CHAMADA MOVF DISPLAY,0 //MOVE O VALOR DA VARIÁVEL AUXILIAR PARA O REGISTO W MOVLW PORTA //ENVIA O VALOR PARA A PORTA, SENDO MOSTRADO NO DISPLAY (4 BITS MENOS SIGNIFICATIVOS) RETURN REINICAR_DISPLAY MOVLW .0 //COLOCA O VALOR ZERO EM DECIMAL NO REGISTO W MOVWF DISPLAY //MOVE ESSE VALOR PARA A VARIÁVEL AUXILIAR “DISPLAY” RETURN
A rotina “REINICIAR_DISPLAY” é também executada na inicialização do sistema, garantindo assim que o estado inicial do sistema é com a variável auxiliar “DISPLAY” a 0 (decimal). 5. CONCLUSÕES Ao ser dado um caso real de implementação, ou seja, um problema com implementação real leva a que exista a necessidade de aprofundar os conhecimentos sobre as matérias envolvidas. Este trabalho reveste-se de grande importância, pois permite “ver a mexer”, ficando a faltar a programação de um PIC16F628A passando para outro “patamar” que não só a simulação. Este relatório centrou-se nas rotinas mais importantes do programa “.asm” criado, procurando explicar da melhor forma possível (tendo em conta a limitação de 10 páginas imposta no enunciado) o programa elaborado. Este trabalho revelou ser de uma extrema importância para o desenvolvimento dos conhecimentos na área dos microcontroladores, e que seja mais um de muitos outros pois……
9
“O Saber não ocupa espaço de Memória”
6. BIBLIOGRAFIA Microchip (2007). PIC16F627A/628A/648A Data Sheet. Flash-Based, 8-Bit CMOS Microcontrollers with nanoWatt Technology. U.S.A., Microchip Technology.
10
7. ANEXOS 7.1. Fluxograma Geral - Inicialização + Situação de Espera + BP Pressionado INICIO
LED PEÕES VERMELHO LED CARROS VERMELHO LIMPAR VARIÁVEL “DISPLAY” LIMPAR PORTA - DISPLAY
INICIALIZAÇÃO
V
ABRIR CANCELA PWM “RÁPIDO”
CANCELA FECHADA?
F
LED PEÕES VERMELHO LED CARROS VERDE
SITUAÇÃO
SITUAÇÃO DE ESPERA F
DE ESPERA
BP PRESSIONADO?
V
ESPERA 30s LED CARROS VERMELHO ESPERA 15s FECHAR CANCELA PWM “LENTO” F FC PRESSIONADO?
V
BP PRESSIONADO
LED PEÕES VERDE ESPERA 90s LED PEÕES VERMELHO ESPERA 15s ABRIR CANCELA PWM “RÁPIDO” V FC PRESSIONADO?
F ESPERA 15s LED CARROS VERDE ROTINA “ROTINA_DISPLAY”
11