Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
com
DETUA
Departamento de Electrnica e Telecomunicaes
Universidade de Aveiro
Microcontroladores PIC
Resumo
iii
www.mecatronicadegaragem.blogspot.com
Agradecimentos
O nosso agradecimento vai para todos aqueles que connosco colaboraram para que este guia fosse
uma realidade. Em especial aos colegas da sala 317 que em muito contriburam durante todo o semi-
nrio.
www.mecatronicadegaragem.blogspot.com
Contedo
Resumo iii
Contedo ix
Introduo 1
1 Enquadramento geral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2 Objectivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3 Descrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
4 Trabalho a Realizar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
v
www.mecatronicadegaragem.blogspot.com
TP1 - Entrada/Sada 15
1 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2 Objectivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3 Descrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4 Trabalho a realizar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
5.1 Ponto 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
5.2 Ponto 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
5.3 Ponto 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
1 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2 Objectivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3 Descrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4 Trabalho a realizar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
5.1 Ponto 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
5.2 Ponto 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
1 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
2 Objectivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3 Descrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4 Trabalho a realizar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
vi
www.mecatronicadegaragem.blogspot.com
ndice de Contedos
1 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
2 Objectivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3 Descrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4 Trabalho a realizar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
5.1 Ponto 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
5.2 Ponto 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
5.3 Ponto 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
1 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
2 Objectivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
3 Descrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
3.1 Timer 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
4 Trabalho a realizar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
1 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
2 Objectivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
3 Descrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
4 Trabalho a realizar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
vii
www.mecatronicadegaragem.blogspot.com
1 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
2 Objectivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
3 Descrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
1 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
2 Objectivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
3 Descrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
viii
www.mecatronicadegaragem.blogspot.com
ndice de Contedos
1 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
2 Objectivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
3 Descrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
Apendix A 177
Apendix B 179
ix
www.mecatronicadegaragem.blogspot.com
x
www.mecatronicadegaragem.blogspot.com
Lista de Figuras
10 WinPIC Loader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
15 Acesso memria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
xi
www.mecatronicadegaragem.blogspot.com
xii
www.mecatronicadegaragem.blogspot.com
Lista de Tabelas
2 HEX 7 segmentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
xiii
www.mecatronicadegaragem.blogspot.com
www.mecatronicadegaragem.blogspot.com
Introduo
1 Enquadramento geral
Os trabalhos prticos apresentados neste guia foram organizados de modo a que o aluno adquira, numa
perspectiva evolutiva, conceitos fundamentais associados programao de microcontroladores.
Cada um dos trabalhos d nfase ao desenvolvimento de uma temtica especfica, podendo cada
um deles ser realizado independentemente um dos outros. Contudo, para um aluno sem experin-
cia prvia que utilize a programao de microcontroladores aconselhvel que os trabalhos sejam
realizados pela ordem em que so apresentados, resultando esta recomendao em dois aspectos fun-
damentais: a) os trabalhos esto organizados com um grau de dificuldade crescente, sendo importante
que os conceitos a abordados, sejam compreendidos, antes de se passar aos seguintes; b) o cdigo
realizado num dado trabalho possa ser reaproveitado em trabalhos posteriores.
A tabela 1 fornece uma curta descrio dos temas a abordar em cada trabalho prtico. O primeiro
trabalho prtico TP0 tem como principal objectivo a familiarizao com a linguagem assembly e o
ambiente de desenvolvimento MPLAB IDE. Com este trabalho pretende-se que o aluno tome conheci-
mento das potencialidades que ambiente de desenvolvimento disponibiliza na realizao dos trabalhos
1
www.mecatronicadegaragem.blogspot.com
futuros; o trabalho seguinte TP1, continua com a familiarizao do aluno com novos conceitos, desta
vez a familiarizao do aluno com a linguagem assembly do PIC para programao dos portos de
entrada e sada na leitura e escrita de dados.
No trabalho prtico 2, TP2, pretende-se que o aluno adquira os conhecimentos necessrios de
modo a compreender o acesso a variveis na memria RAM por endereamento indirecto. Para tal,
pretende-se implementar um descodificador hexadecimal / 7 segmentos atravs de um nico display.
No seguimento deste trabalho, surge o trabalho 3 (TP3), em que se pretende uma ampliao do
trabalho anterior a 3 displays de 7 segmentos, com o objectivo de construir um programa que permita a
visualizao de dados nos displays, recorrendo ao refrescamento destes por multiplexagem no tempo.
No trabalho prtico seguinte (TP4), recorre-se a contagem de tempo por contagem de instrues,
usando para tal uma rotina de contagem de tempo por contagem de instrues (rotina Delay).
O trabalho prtico 5 (TP5), tem como um objectivo principal a introduo programao do timer
0 do PIC. Com este, vai-se poder alargar a gama de contagem de tempo, algo que com a utilizao da
rotina Delay no possvel.
Com o trabalho 6 (TP6), pretende-se construir uma mquina de estados que implementa um se-
mforo rodovirio para pees e automveis, com o objectivo de aprofundar os conhecimentos acerca
do timer 0.
Nos trabalhos prticos 4 e 5 implementou-se um relgio de 60seg recorrendo rotina Delay e
timer 0, respectivamente. Ambos implementados recorrendo transferncia de informao por pol-
ling. Durante o trabalho 7 (TP7) pretende-se implementar novamente um relgio, recorrendo agora
transferncia de informao por interrupo. Para isso necessria a compreenso do conceito de
interrupo de um programa.
Com o grau de dificuldade a crescer, os dois ltimos trabalhos reflectem essa complexidade nos
conceitos a adquirir. Assim, o trabalho 8 (TP8) tem como objectivo, a comunicao srie entre um
computador (anfitrio) e o PIC, elaborando para tal um programa que implemente um terminal srie,
recorrendo a rotinas para envio e recepo de caracter ou caracteres.
Por fim, o trabalho 9 (TP9) tem como objectivo principal a introduo converso A/D, im-
plementando para esse fim 2 trabalhos: um voltmetro digital bsico, e um sistema de medio de
distncias recorrendo a um sensor infravermelhos.
2
www.mecatronicadegaragem.blogspot.com
Introduo
35 instrues de 14 bits;
Frequncia mxima de funcionamento - 20Mhz (frequncia do cristal);
Cada ciclo de relgio corresponde frequncia do cristal / 4 = 5Mhz, efectuando a cada
segundo 5 MIPS (milhes de instrues por segundo);
Tempo de execuo das instrues normais: 1 ciclo de relgio;
Tempo de execuo das instrues de salto condicional (decfsz, incfsz, btfss, btfsc), quando
a executada a instruo de salto: 2 ciclos de relgio;
Tempo de execuo de instrues de salto incondicional (goto): 2 ciclos de relgio.
No propsito do guio descrever o funcionamento da placa PIC, este feito no site da disciplina.
Neste pode-se encontrar todas as informaes relevantes sobre o layout e funcionamento da placa.
Contudo para que o aluno/professor se se enquadrem com o hardware apresenta-se nas pginas se-
guintes o esquema elctrico do circuito bem como a disposio dos componentes na placa de circuito
impresso.
3
www.mecatronicadegaragem.blogspot.com
4
www.mecatronicadegaragem.blogspot.com
1 Resumo
Pretende-se mostrar com este trabalho os passos necessrios criao de um projecto no ambiente de
desenvolvimento MPLAB IDE (programa de software destinado a desenvolver aplicaes para micro-
controladores da Microchip) e traduo para cdigo mquina do cdigo fonte associado, recorrendo
a um pequeno exemplo em linguagem Assembly. Mostra-se ainda, o processo de programao do
PIC16F876 atravs da linha srie.
2 Objectivos
3 Descrio
Editor com reconhecimento das instrues do PIC e directivas do Assembler em syntax high-
light.
Visualizao dos registos (memria RAM), da memria de programa e da EEPROM .
MPLAB SIM, simulador de eventos, com as seguintes caractersticas:
Possibilidade de alterao do cdigo fonte do programa, permitindo a sua re-execuo
imediata;
5
www.mecatronicadegaragem.blogspot.com
No desenvolvimento inicial de um programa, muito provvel que este contenha erros de con-
cepo que o impedem de realizar correctamente as tarefas para o qual foi projectado. Se porventura
isso acontecer, necessrio voltar a analisar o cdigo, de modo a encontrar a origem dos problemas.
Em programas com alguma complexidade este processo lento, e muitas vezes ineficiente, dado que
necessrio carregar vrias vezes o programa no PIC, de modo a testar o seu funcionamento. Este
um dos casos em que o simulador de software MPLAB SIM til uma vez que permite simular
o programa no PC, como se este estivesse a ser executado no PIC. Outra das vantagens da utilizao
do simulador a possibilidade da criao a priori de cenrios de teste que servem de entrada para o
simulador. A figura 3 mostra a janela associada ao processo de simulao do programa exemplo.
O ambiente de edio do projecto do programa exemplo mostrado na figura 4. A janela lo-
calizada no canto superior esquerdo representa o Project Manager, que contm as referncias aos
ficheiros que compem o projecto; logo abaixo desta, temos o Memory Usage Gauge, que mostra a
informao da quantidade de memria do programa e dados usada; no lado direito temos o editor;
finalmente abaixo encontra-se a janela de output (sada), que fornece informaes sobre o estado do
programa aquando da traduo de cdigo Assembly para cdigo mquina.
No MPLAB IDE, a visualizao da memria (ver figura 5) feita atravs das seguintes janelas:
6
www.mecatronicadegaragem.blogspot.com
7
www.mecatronicadegaragem.blogspot.com
4 Trabalho a Realizar
1. Uma vez aberto o programa MPLAB IDE, na rea de trabalho, selecciona-se no menu principal
Project New.
2. Quando a dialog box New Project surgir introduz-se no campo Project Name exemplo, e
no campo Project Directory c:\aulas\exemplo (ver figura 6).
8
www.mecatronicadegaragem.blogspot.com
4. Ao projecto que acabou de se criar, associa-se agora o ficheiro com o cdigo fonte do programa;
se este no existir cria-se um novo (para criar um novo clicar em File New). Antes de iniciar
o processo de edio, deve-se guardar o ficheiro com a extenso ".asm", de modo a activar
a funcionalidade syntax highlight (menu File Save As... guardando o ficheiro no directrio
c:\aulas\exemplo criado anteriormente). Neste exemplo o cdigo fonte j se encontra
num ficheiro no directrio do projecto. Este ficheiro pode ser adicionado ao projecto clicando
com o boto direito do rato em cima de Source Files Add Files... (ver figura 8(b)).
9
www.mecatronicadegaragem.blogspot.com
5. Dado que o projecto usa oMPlink, necessrio associar-se um linker script; este ficheiro define
os comandos do linker para cada PIC, especificando o seguinte:
Esto disponveis ficheiros originais de script para todos os PIC, localizados por defeito no
seguinte directrio: c:\Program Files\Microchip\MPASM Suite\LKR. Para adi-
cionar o ficheiro pretendido, clicar com o boto direito do rato em cima de Script Files Add
Files....
1. Aps a edio do cdigo fonte em Assembly do programa passa-se fase de traduo do cdigo
fonte em cdigo mquina. Para isso clica-se no cone Build All disponvel na toolbar do
ambiente de desenvolvimento. No caso de o programa no apresentar erros de syntax, o grfico
de sada que mostra a evoluo da compilao ficar completo a 100% e de cor verde; caso
contrrio ficar vermelho, o que indica a existncia de um ou mais erros.
Na ausncia de erros de syntax, criado o ficheiro de sada que tem como nome principal o
nome do projecto com extenso ".hex".
10
www.mecatronicadegaragem.blogspot.com
Aps a traduo bem sucedida do cdigo fonte em cdigo mquina, passa-se fase de programao
do PIC. Para tal, necessrio que, previamente, tenha sido instalado no PIC um pequeno programa
(o boot-loader) que gere a comunicao com o computador de desenvolvimento e que escreve o
programa na memria Flash.
O que o boot-loader?
O boot-loader um programa que permite re-programar o PIC sem ter de o retirar do circuito onde
est montado e sem ter que recorrer a um programador ( i.e., a um aparelho para programar os PICs ).
Como funciona?
O boot-loader funciona em conjunto com um programa que corre no PC, designado por WinPIC
Loader ( disponvel para DOS / Windows / Linux ) que controla o envio de um ficheiro em formato
Intel Hex para o PIC.
Sempre que o PIC ligado, inicia-se a execuo do boot-loader. Este comea por inquirir o PC
sobre o que fazer. Se no obtm resposta dentro de um tempo limite e se existir um programa vlido
na memria do PIC, ento o boot-loader inicia a execuo desse programa. No caso em que obtm
uma resposta vlida, inicia o processo de transferncia e armazenamento de um novo programa.
Como re-programar?
1. Compilar o programa que se pretende transferir para o PIC usando o MPLAB. O compilador
produz um ficheiro em formato Intel Hex ( extenso ".hex").
2. Executar o programa WinPIC Loader, clicar em File Open seleccionar o ficheiro ".hex"
respectivo, clicar OK.
3. Premir o boto de reset da placa PIC. A transferncia e programao iniciam-se de imediato. A
progresso assinalada na janela WinPIC Loader no campo, Progress:.
4. Finalmente, para executar o programa, premir novamente o boto de reset da placa PIC.
11
www.mecatronicadegaragem.blogspot.com
;====================================================================
;
ORG 0x0000 ; - directiva "ORG" origem do
; programa "ORG 0x0000" vector
; de reset
clrf PCLATH ; - instruo "clrf PCLATH" apaga
; todos os bits do registo garante
; que a memria do programa
; iniciada na pgina 0
goto main ; - instruo "goto main" salta para
; o endereo de memria do programa
; principal
;
;------------ Rotina Main -------------------------------------------
;
ORG 0x0005 ; - "0x0005" 1 endereo livre da
; memria de programa
;
main ; - label programa principal
;
goto main ; Cdigo assembly do
; programa principal
;
;************ ROTINAS ***********************************************
;
;
;
;
;********************************************************************
END ; - directiva "END" fim do programa
12
www.mecatronicadegaragem.blogspot.com
O objectivo do programa manter o led (ligado ao bit 0 do PORTB, RB0), acesso durante um tempo
t1 e apagado durante um tempo t2.
Para efectuar a contagem de tempo utiliza-se a rotina Delay (ver cdigo Assembly pgina, 14).
Esta rotina permite a parametrizao na gama [1..255] a que corresponde uma contagem de tempo
na gama [0,1s..2,5s]. O registo W utilizado para a passagem do parmetro da entrada para a rotina.
O trecho de cdigo abaixo indicado, representa o cdigo da rotina main do programa. Inicialmente
feita a configurao do PORTB do PIC como sada, para que seja possvel a activao/desactivao
do led (RB0). De seguida o programa entra num ciclo infinito forando a sada RB0 ao estado ON
durante 0,5s e ao estado OFF durante 1s.
A primeira instruo (bsf PORTB,RB0) coloca na sada (RB0) o nvel lgico 1 (5 volts). A
seguinte instruo (movlw 50) coloca no registo W o valor do parmetro de entrada da rotina De-
lay, invocada de seguida, o que vai fazer com que o led esteja acesso durante 0,5s. A instruo
(bcf PORTB,RB0) coloca na sada (RB0) o nvel lgico 0 (0 volts). A rotina Delay novamente
invocada tendo agora como valor de entrada 100, o que vai fazer com que o led esteja apagado durante
um tempo t2. Este ciclo repete-se sempre.
13
www.mecatronicadegaragem.blogspot.com
;===================================================================;
; Delay ;
; Pode gerar delays entre 10 mS e 2,5 S ;
; O valor de entrada e passado em W (1..255) ;
; ;
; Notas: o loop base e de 1 uS (T=200 nS <=> 4*1/20MHz) ;
; ;
;===================================================================;
Delay
movwf delay_mult ; Carrega o valor mltiplo
Del_m10 movlw 50 ; de 10 mS
movwf delay_k50 ; 50 => 10 mS
Del_50 movlw 200 ; 200 => 200 uS
movwf delay_k200 ; Carrega o valor
Del_200 nop ; correspondente a 200 uS
nop
decfsz delay_k200,f ; Decrementa "delay_k200".
; O resultado colocadao em
; "delay_k200"
goto Del_200 ; while( delay_k200 > 0 )
decfsz delay_k50,f ;
goto Del_50 ; while( delay_k50 > 0 )
decfsz delay_mult,f ; Decrementa "delay_mult".
; O resultado colocadao
; em "delay_mult"
goto Del_m10 ; while( delay_mult > 0 )
return
Elementos de Apoio
14
www.mecatronicadegaragem.blogspot.com
TP1 - Entrada/Sada
Tema a desenvolver Durao
Entrada e Sada bsica 2 aulas
1 Resumo
2 Objectivos
3 Descrio
O PIC16F876 dispe de um total de 22 linhas de E/S de 1 bit. Estas esto organizados em 3 portos,
denominados de porto A, porto B e porto C. Cada porto tem associado um par de registos: TRIS e
PORT (ver descrio mais frente). O porto A agrupa 5 linhas de 1 bit configurveis, como entrada
ou como sada, identificadas pelas siglas RA0, RA1, RA2, RA3 e RA4. Cada um dos portos B e C
agrupa 8 linhas configurveis como entrada ou como sada identificadas pelas siglas Rx0, Rx1, Rx2,
Rx3, Rx4, Rx5, Rx6 e Rx7, em que x pode tomar o valor B ou C.
Algumas destas 22 linhas tm atribudas diversas funes (que no a de simples linha de en-
trada/sada), podendo o programador configurar por software a funo efectivamente desempenhada.
De entre as funes disponveis destacam-se as seguintes:
15
www.mecatronicadegaragem.blogspot.com
O registo PORT um registo de dados, aqui que a informao presente nas linhas de entrada ou
sada recolhida ou disponibilizada. Cada porto tem associado um registo de dados prprio, PORTA,
PORTB e PORTC.
O registo TRIS um registo programvel de 1 byte (8 bits) disponvel no banco 1 (memria
RAM), que controla se uma linha em particular uma entrada ou uma sada. Existe um registo TRIS
para cada porto. O TRISA controla o estado de E/S das 6 linhas do porto A, enquanto que TRISB
e TRISC controlam respectivamente o estado de E/S das 8 linhas do porto B e porto C. Uma vez
configurada as direces pretendidas das linhas do porto, por programao do registo TRIS, pode-se
efectuar leituras ou escritas no porto usando o registo PORT.
Todos os bits contidos nos registos mencionados, correspondem univocamente a uma linha de en-
trada/sada de um bit. Por exemplo, o bit 0 do registo PORTA e do registo TRISA, correspondem
linha RA0, o bit 1 linha RA1 e assim por diante. Um 1 no bit 0 do registo TRIS configura a linha
como entrada enquanto um 0 configura a linha como sada. Uma maneira intuitiva de relembrar o
conceito, advm do facto de o 1 ser parecido com o I que provm da inicial da palavra inglesa
Input e o 0 ser parecido com O que provm de Output.
A figura 11 mostra um esquema conceptual da configurao atravs do registo TRISB, de um
porto. A linha RB0 est configurada como entrada ou como sada? Qual ser o nvel lgico presente
no bit 0 do registo PORTB?
Observa-se na figura que o bit 0 do registo TRISB est definido a 1, logo a linha RB0 est
configurada como entrada. Quanto ao valor do bit 0 no registo PORTB, temos de considerar dois
momentos, uma vez que a entrada varia no tempo: ao primeiro momento corresponde o nvel lgico
0 e ao segundo o nvel lgico 1.
16
www.mecatronicadegaragem.blogspot.com
Quando necessrio usar uma ou mais linhas de E/S de um determinado porto, importante fazer-se a
sua inicializao logo no inicio da rotina main do programa. A inicializao no mais que a confi-
gurao da direco dos dados presentes nas linhas de E/S, por configurao do registo TRIS.
importante realar que, se porventura a inicializao das linhas de E/S no for feita, estas por
defeito (aquando do reset do PIC) encontram-se todas como entrada. Assim se uma das funciona-
lidades do programa a desenvolver for a recepo de informao digital em todas as linhas de um
determinado porto ( excepo do porto A), este no necessita de ser inicializado.
RA4 a nica linha do porto A que pode ser configurada como entrada digital pelo registo TRISA,
para as restantes necessrio tambm a configurao do registo ADCON1 (descrio feita no trabalho
prtico 9).
O trecho de cdigo Assembly seguinte, exemplifica uma inicializao por programao de todos
os portos do PIC. Este mostra, para cada porto, 3 formas de configurao do registo TRIS:
17
www.mecatronicadegaragem.blogspot.com
4 Trabalho a realizar
2. Mantendo o circuito, alterar o programa anterior por forma a permitir o controlo temporizado
do led ligado a RB0.
Inicialmente o led activado por presso no boto ligado a RA4. Aps se ter deixado de
premir o boto, manter durante um tempo t o led acesso. A figura 13, mostra o comportamento
pretendido para a sada, com t=2,5s.
18
www.mecatronicadegaragem.blogspot.com
Elementos de Apoio
19
www.mecatronicadegaragem.blogspot.com
5.1 Ponto 1
; Trabalho Prtico n 1 Ponto I
; Alterao do programa "exemplo.asm" incluso de boto on/off
;
; Resumo:
; Led pisca-pisca (DUTTY CYCLE varivel), com switch on/off.
;
; 5 V
; |
; /
; \
; / RES 10K
; ___________ \ SW
; | | | __|__
; | PIC16F876 |-<-- RA4 ---------*---------o o----- 0V
; | |
; | | /-----\ RES 220
; | |->-- RB0 ------| LED |------\/\/\/---- 0V
; | | \-----/
; |___________|
;
; figura 1. esquema de ligao PIC.
;
;********************************************************************
; *
; Nome ficheiro: trab1p1.asm *
; ltima actualizao 22/Julho /2005 *
; *
; Autores: Jos Miguel Gaspar *
; Olmpia Rodrigues *
; *
; Orientador: Prof. Jos Lus Azevedo *
; *
; Universidade de Aveiro *
; Seminrio EEI 2004/2005 *
; *
;********************************************************************
; *
; Ficheiro necessrio: 16f876.lkr *
; *
;********************************************************************
list p=16f876 ; - directiva list, define
; o processor a usar
radix decimal ; - directiva radix especifica
; definio das variveis
#include "p16f876.inc" ; - directiva include inclui
; ficheiro adicional
errorlevel -302 ; Turn off banking message
; known tested (good) code
;--------------------------------------------------------------------
; Constantes
;--------------------------------------------------------------------
RA0 EQU 0
RA1 EQU 1
RA2 EQU 2
RA3 EQU 3
RA4 EQU 4
RA5 EQU 5
RB0 EQU 0
RB1 EQU 1
RB2 EQU 2
RB3 EQU 3
RB4 EQU 4
RB5 EQU 5
20
www.mecatronicadegaragem.blogspot.com
RB6 EQU 6
RB7 EQU 7
RC0 EQU 0
RC1 EQU 1
RC2 EQU 2
RC3 EQU 3
RC4 EQU 4
RC5 EQU 5
RC6 EQU 6
RC7 EQU 7
;----------------------------------------------------------------------
; Variveis (REGISTOS DE USO GERAL) Bank0
;----------------------------------------------------------------------
UDATA 0x20
delay_mult RES 1 ; Variaveis de controlo
delay_k50 RES 1 ; dos loops da rotina Delay
delay_k200 RES 1 ;
start_stop RES 1 ; start_stop FLAG
;--------------------------------------------------------------------
; Macros to select the register Banks
;--------------------------------------------------------------------
Bank0 MACRO ; Macro to select data RAM Bank 0
bcf STATUS,RP0
bcf STATUS,RP1
ENDM
Bank1 MACRO ; Macro to select data RAM Bank 1
bsf STATUS,RP0
bcf STATUS,RP1
ENDM
Bank2 MACRO ; Macro to select data RAM Bank 2
bcf STATUS,RP0
bsf STATUS,RP1
ENDM
Bank3 MACRO ; Macro to select data RAM Bank 3
bsf STATUS,RP0
bsf STATUS,RP1
ENDM
;********************************************************************
ORG 0x0000 ; - directiva "ORG" origem do
; programa "ORG 0x0000" vector
; de reset
clrf PCLATH ; - instruo "clrf PCLATH" apaga
; todos os bits do registo garante
; que a memria do programa
; iniciada na pgina 0
goto main ; - instruo "goto main" salta para
; o endereo de memria do programa
; principal
;--------------------------------------------------------------------
; Rotina Main
;--------------------------------------------------------------------
ORG 0x0005 ; Program Memory PAGE 0
main ; Programa principal.
Bank1 ; DATA memory (RAM) Bank1
movlw b11111110 ; RB[0] output
movwf TRISB ; RB[7:1] inputs
movlw b00010000 ; RA[7:5 & 3:0] outputs
movwf TRISA ; RA[4] input
Bank0 ; DATA memory (RAM) Bank0
clrf PORTB ; Inicializao PORTB
clrf PORTA ; Inicializao PORTA
loop ; while(1) {
21
www.mecatronicadegaragem.blogspot.com
22
www.mecatronicadegaragem.blogspot.com
5.2 Ponto 2
23
www.mecatronicadegaragem.blogspot.com
;--------------------------------------------------------------------
RA0 EQU 0
RA1 EQU 1
RA2 EQU 2
RA3 EQU 3
RA4 EQU 4
RA5 EQU 5
RB0 EQU 0
RB1 EQU 1
RB2 EQU 2
RB3 EQU 3
RB4 EQU 4
RB5 EQU 5
RB6 EQU 6
RB7 EQU 7
RC0 EQU 0
RC1 EQU 1
RC2 EQU 2
RC3 EQU 3
RC4 EQU 4
RC5 EQU 5
RC6 EQU 6
RC7 EQU 7
TEMPO_ON EQU 255 ; Gama [1..255] = [10ms..2,5s]
;----------------------------------------------------------------------
; Variveis (REGISTOS DE USO GERAL) Bank0
;----------------------------------------------------------------------
UDATA 0x20
delay_mult RES 1 ; Variaveis de controlo
delay_k50 RES 1 ; dos loops da rotina Delay
delay_k200 RES 1 ;
;--------------------------------------------------------------------
; Macros to select the register Banks
;--------------------------------------------------------------------
Bank0 MACRO ; Macro to select data RAM Bank 0
bcf STATUS,RP0
bcf STATUS,RP1
ENDM
Bank1 MACRO ; Macro to select data RAM Bank 1
bsf STATUS,RP0
bcf STATUS,RP1
ENDM
Bank2 MACRO ; Macro to select data RAM Bank 2
bcf STATUS,RP0
bsf STATUS,RP1
ENDM
Bank3 MACRO ; Macro to select data RAM Bank 3
bsf STATUS,RP0
bsf STATUS,RP1
ENDM
;********************************************************************
vector_reset ORG 0x00 ; Processor reset vector
clrf PCLATH ; Ensure page bits are cleared
goto main ; Go to beginning of program
;--------------------------------------------------------------------
; Rotina Main
;--------------------------------------------------------------------
24
www.mecatronicadegaragem.blogspot.com
25
www.mecatronicadegaragem.blogspot.com
return
;********************************************************************
END ; directive end of program
26
www.mecatronicadegaragem.blogspot.com
5.3 Ponto 3
27
www.mecatronicadegaragem.blogspot.com
RA2 EQU 2
RA3 EQU 3
RA4 EQU 4
RA5 EQU 5
RB0 EQU 0
RB1 EQU 1
RB2 EQU 2
RB3 EQU 3
RB4 EQU 4
RB5 EQU 5
RB6 EQU 6
RB7 EQU 7
RC0 EQU 0
RC1 EQU 1
RC2 EQU 2
RC3 EQU 3
RC4 EQU 4
RC5 EQU 5
RC6 EQU 6
RC7 EQU 7
;----------------------------------------------------------------------
; Variveis (REGISTOS DE USO GERAL) Bank0
;----------------------------------------------------------------------
UDATA 0x20
delay_mult RES 1 ; Variaveis de controlo
delay_k50 RES 1 ; dos loops da rotina Delay
delay_k200 RES 1 ;
;--------------------------------------------------------------------
; Macros to select the register Banks
;--------------------------------------------------------------------
Bank0 MACRO ; Macro to select data RAM Bank 0
bcf STATUS,RP0
bcf STATUS,RP1
ENDM
Bank1 MACRO ; Macro to select data RAM Bank 1
bsf STATUS,RP0
bcf STATUS,RP1
ENDM
Bank2 MACRO ; Macro to select data RAM Bank 2
bcf STATUS,RP0
bsf STATUS,RP1
ENDM
Bank3 MACRO ; Macro to select data RAM Bank 3
bsf STATUS,RP0
bsf STATUS,RP1
ENDM
;********************************************************************
ORG 0x0000 ; - directiva "ORG" origem do
; programa "ORG 0x0000" vector
; de reset
clrf PCLATH ; - instruo "clrf PCLATH" apaga
; todos os bits do registo garante
; que a memria do programa
; iniciada na pgina 0
goto main ; - instruo "goto main" salta para
; o endereo de memria do programa
; principal
;--------------------------------------------------------------------
; Rotina Main
;--------------------------------------------------------------------
ORG 0x0005 ; Program Memory PAGE 0
main ; Programa principal.
call InitCfg ;
incrementa ;
28
www.mecatronicadegaragem.blogspot.com
29
www.mecatronicadegaragem.blogspot.com
return
;********************************************************************
END ; directive end of program
30
www.mecatronicadegaragem.blogspot.com
1 Resumo
Com este trabalho, pretende-se consolidar os conhecimentos adquiridos nos trabalhos anteriores e
estudar o modo de acesso a variveis em memria RAM, por endereamento indirecto.
2 Objectivos
3 Descrio
31
www.mecatronicadegaragem.blogspot.com
32
www.mecatronicadegaragem.blogspot.com
4 Trabalho a realizar
2. Construir finalmente um contador [0..F] crescente/decrescente por presso nos botes S1/S2
respectivamente (S1 encontra-se ligado a RB0, S2 encontra-se ligado a RA4).
33
www.mecatronicadegaragem.blogspot.com
Elementos de Apoio
34
www.mecatronicadegaragem.blogspot.com
5.1 Ponto 1
; Trabalho Prtico n 2 I
; Implementao descodificador hex para 1 display de 7 segmentos
;
;********************************************************************
; *
; Nome ficheiro: trab2.asm *
; ltima reviso 3/Junho/2005 *
; *
; Autores: Jos Miguel Gaspar *
; Olmpia Rodrigues *
; *
; Orientador: Prof. Jos Lus Azevedo *
; *
; Universidade de Aveiro *
; Seminrio EEI 2004/2004 *
; *
;********************************************************************
; *
; Ficheiro necessrio: p16f876.lkr *
; *
;********************************************************************
list p=16f876 ; list directive to define
radix decimal ; processor
#include "p16f876.inc" ; processor specific variable
; definitions
errorlevel -302 ; Turn off banking message
; known tested (good) code
;--------------------------------------------------------------------
; Constantes
;--------------------------------------------------------------------
RA0 EQU 0
RA1 EQU 1
RA2 EQU 2
RA3 EQU 3
RA4 EQU 4
RA5 EQU 5
RB0 EQU 0
RB1 EQU 1
RB2 EQU 2
RB3 EQU 3
RB4 EQU 4
RB5 EQU 5
RB6 EQU 6
RB7 EQU 7
RC0 EQU 0
RC1 EQU 1
RC2 EQU 2
RC3 EQU 3
RC4 EQU 4
RC5 EQU 5
RC6 EQU 6
RC7 EQU 7
;--------------------------------------------------------------------
; Displays de 7 segmentos -|gfedcba-|
;--------------------------------------------------------------------
seg7_0 EQU b01111110 ; Valor 0
seg7_1 EQU b00001100 ; Valor 1
seg7_2 EQU b10110110 ; Valor 2
seg7_3 EQU b10011110 ; Valor 3
seg7_4 EQU b11001100 ; Valor 4
seg7_5 EQU b11011010 ; Valor 5
35
www.mecatronicadegaragem.blogspot.com
;--------------------------------------------------------------------
; Macros to select the register Banks
;--------------------------------------------------------------------
Bank0 MACRO ; Macro to select data RAM Bank 0
bcf STATUS,RP0
bcf STATUS,RP1
ENDM
Bank1 MACRO ; Macro to select data RAM Bank 1
bsf STATUS,RP0
bcf STATUS,RP1
ENDM
Bank2 MACRO ; Macro to select data RAM Bank 2
bcf STATUS,RP0
bsf STATUS,RP1
ENDM
Bank3 MACRO ; Macro to select data RAM Bank 3
bsf STATUS,RP0
bsf STATUS,RP1
ENDM
;********************************************************************
ORG 0x0000 ; Processor reset vector
clrf PCLATH ; Ensure page bits are cleared
goto main ; Go to beginning of program
;--------------------------------------------------------------------
; Rotina Main
;--------------------------------------------------------------------
ORG 0x0005 ; Program Memory PAGE 0
36
www.mecatronicadegaragem.blogspot.com
37
www.mecatronicadegaragem.blogspot.com
38
www.mecatronicadegaragem.blogspot.com
5.2 Ponto 2
; Trabalho Prtico n 2 II
; Implementao contador crescente para 1 display de 7 segmentos
;
;********************************************************************
; *
; Nome ficheiro: trab2p2.asm *
; ltima reviso 3/Junho/2005 *
; *
; Autores: Jos Miguel Gaspar *
; Olmpia Rodrigues *
; *
; Orientador: Prof. Jos Lus Azevedo *
; *
; Universidade de Aveiro *
; Seminrio EEI 2004/2004 *
; *
;********************************************************************
; *
; Ficheiro necessrio: p16f876.lkr *
; *
;********************************************************************
list p=16f876 ; list directive to define
radix decimal ; processor
#include "p16f876.inc" ; processor specific variable
; definitions
errorlevel -302 ; Turn off banking message
; known tested (good) code
;--------------------------------------------------------------------
; Constantes
;--------------------------------------------------------------------
RA0 EQU 0
RA1 EQU 1
RA2 EQU 2
RA3 EQU 3
RA4 EQU 4
RA5 EQU 5
RB0 EQU 0
RB1 EQU 1
RB2 EQU 2
RB3 EQU 3
RB4 EQU 4
RB5 EQU 5
RB6 EQU 6
RB7 EQU 7
RC0 EQU 0
RC1 EQU 1
RC2 EQU 2
RC3 EQU 3
RC4 EQU 4
RC5 EQU 5
RC6 EQU 6
RC7 EQU 7
;--------------------------------------------------------------------
; Displays de 7 segmentos -|gfedcba-|
;--------------------------------------------------------------------
seg7_0 EQU b01111110 ; Valor 0
seg7_1 EQU b00001100 ; Valor 1
seg7_2 EQU b10110110 ; Valor 2
seg7_3 EQU b10011110 ; Valor 3
seg7_4 EQU b11001100 ; Valor 4
seg7_5 EQU b11011010 ; Valor 5
seg7_6 EQU b11111000 ; Valor 6
seg7_7 EQU b00001110 ; Valor 7
seg7_8 EQU b11111110 ; Valor 8
seg7_9 EQU b11001110 ; Valor 9
39
www.mecatronicadegaragem.blogspot.com
;--------------------------------------------------------------------
; Macros to select the register Banks
;--------------------------------------------------------------------
Bank0 MACRO ; Macro to select data RAM Bank 0
bcf STATUS,RP0
bcf STATUS,RP1
ENDM
Bank1 MACRO ; Macro to select data RAM Bank 1
bsf STATUS,RP0
bcf STATUS,RP1
ENDM
Bank2 MACRO ; Macro to select data RAM Bank 2
bcf STATUS,RP0
bsf STATUS,RP1
ENDM
Bank3 MACRO ; Macro to select data RAM Bank 3
bsf STATUS,RP0
bsf STATUS,RP1
ENDM
;********************************************************************
ORG 0x0000 ; Processor reset vector
clrf PCLATH ; Ensure page bits are cleared
goto main ; Go to beginning of program
;--------------------------------------------------------------------
; Rotina Main
;--------------------------------------------------------------------
ORG 0x0005 ; Program Memory PAGE 0
main ; Programa principal.
call InitCfg ; rotina de configurao
bsf PORTA,RA1 ; seleciona o display em RA3
40
www.mecatronicadegaragem.blogspot.com
loop ; while(1) {
btfss PORTA,RA4 ; Se SW em RB4, for selecionado
incf bcd_in,f ; incrementa bcd_in
call bcd_7seg ; bcd_7seg(bcd_in)
movlw 20 ; W(reg) = 20
call Delay ; delay( 0,20 seg )
btfss PORTB,RB0 ; Se SW em RB0, for selecionado
decf bcd_in,f ; decrementa bcd_in
goto loop ; }
;********************************************************************
41
www.mecatronicadegaragem.blogspot.com
42
www.mecatronicadegaragem.blogspot.com
1 Resumo
2 Objectivos
3 Descrio
O princpio de funcionamento deste circuito em tudo igual ao circuito do trabalho anterior, o nmero
dos displays que vai ser alterado. Sero 3 os displays que tero de ser refrescados no tempo, para
que os valores enviados possam ser visualizados em simultneo.
Analisando os diagramas dos circuitos (ver pgina 19) entende-se que apenas um valor enviado,
de cada vez para um s display, (s um interruptor se encontra fechado). Note-se ainda que os todos
os segmentos dos displays esto ligados mesma sada (PORTB RB[7..1]) do PIC. Assim e tendo
em conta que os dados na sada so diferentes, aquando do envio de informao para cada display
ao mesmo tempo. Estes devem ser actualizados periodicamente com uma taxa fixa (taxa de refres-
camento aprox. = 10ms). uma vez que o olho humano no tem a percepo do envio da informao
enviada aos trs displays ao mesmo tempo.
43
www.mecatronicadegaragem.blogspot.com
(a) (b)
(c)
4 Trabalho a realizar
Elementos de Apoio
44
www.mecatronicadegaragem.blogspot.com
Como se observa na figura 20(a), o banco de memria especificado com o bit IRP e o bit mais
significativo do registo FSR. Mais detalhes sobre o registo FSR, ver pgina 31 do guia.
Um endereo dentro do banco seleccionado especificado pelos 7 bits menos significativos do
registo FSR.
Uma vez que o registos STATUS e FSR so comuns a todos os bancos de memria RAM, no
existe obstculo na operao, mesmo que o banco de memria RAM seja alterado.
(a) Seleco com, IRP e FSR bits (b) Seleco com RP1:RP0 bits
Na figura 20(b), o banco de memria pretendido especificado com os bits RP1:RP0. Uma forma
de optimizar este procedimento de alternncia entre bancos atravs do uso de MACROS. Para isso,
basta definir inicialmente uma macro para cada banco de memria RAM. No exemplo seguinte temos
45
www.mecatronicadegaragem.blogspot.com
uma macro para o Bank1 de memria RAM, a generalizao para outros bancos possvel desde de
que, seja respeitada a configurao dos bits RP1:RP0.
NOTA: Provavelmente uma das flags mais utilizadas, usada na deteco de zero no resultado de uma
operao lgica ou aritmtica.
NOTA: A flag activa, aquando da execuo de uma operao, ADDWF, ADDLW, SUBLW ou
SUBWF, causando carry no bit 3 do resultado (operaes de 4 bits).
NOTA: Esta flag activa, quando a operao sobre o registo causa um carry no bit 8 do resultado
(operaes de 8 bits).
46
www.mecatronicadegaragem.blogspot.com
; Trabalho Prtico n 3
; Implementao descodificador hex para 3 displays de 7 segmentos
; taxa mxima
;
;********************************************************************
; *
; NomeFicheiro: trab3.asm *
; Data: 3/Junho/2005 *
; Verso: 1.0 *
; *
; Autores: Jos Miguel Gaspar *
; Olmpia Rodrigues *
; *
; Orientador: Prof. Jos Lus Azevedo *
; *
; Universidade de Aveiro *
; Seminrio EEI 2004/2004 *
; *
;********************************************************************
; *
; Ficheiro necessrio: P16F876.INC *
; *
;********************************************************************
list p=16f876 ; list directive to define
radix decimal ; processor
#include "p16f876.inc" ; processor specific variable
; definitions
errorlevel -302 ; Turn off banking message
; known tested (good) code
;--------------------------------------------------------------------
; Constantes
;--------------------------------------------------------------------
RA0 EQU 0
RA1 EQU 1
RA2 EQU 2
RA3 EQU 3
RA4 EQU 4
RA5 EQU 5
RB0 EQU 0
RB1 EQU 1
RB2 EQU 2
RB3 EQU 3
RB4 EQU 4
RB5 EQU 5
RB6 EQU 6
RB7 EQU 7
RC0 EQU 0
RC1 EQU 1
RC2 EQU 2
RC3 EQU 3
RC4 EQU 4
RC5 EQU 5
RC6 EQU 6
RC7 EQU 7
;--------------------------------------------------------------------
; Displays de 7 segmentos -|gfedcba-|
;--------------------------------------------------------------------
seg7_0 EQU b01111110 ; Valor 0
seg7_1 EQU b00001100 ; Valor 1
seg7_2 EQU b10110110 ; Valor 2
seg7_3 EQU b10011110 ; Valor 3
seg7_4 EQU b11001100 ; Valor 4
seg7_5 EQU b11011010 ; Valor 5
seg7_6 EQU b11111000 ; Valor 6
47
www.mecatronicadegaragem.blogspot.com
48
www.mecatronicadegaragem.blogspot.com
;--------------------------------------------------------------------
ORG 0x0005 ; Program Memory PAGE 0
main ; Programa principal.
call InitCfg ; rotina de configurao
loop ; while(1){
clrf disp_7seg ; disp_7seg = 0
movlw 0x0f ; 0x0f -> W(reg)
call prt_disp7seg ; prt_disp7seg(W(reg))
movlw 0x0f
call prt_disp7seg ; prt_disp7seg(W(reg))
movlw 0x00
call prt_disp7seg ; prt_disp7seg(W(reg))
goto loop ; }
;********************************************************************
49
www.mecatronicadegaragem.blogspot.com
50
www.mecatronicadegaragem.blogspot.com
;===================================================================;
; bcd_7seg ;
; Input: bcd_in - valor BCD de entrada ;
; Output: no devolve nada (void) ;
; ;
; Resumo: routina => BCD to 7segment display, envia o valor ;
; passado em bcd_in para a PORTB por ;
; endereamento indirecto por registo. ;
; Retorna em Bank0 ;
;===================================================================;
bcd_7seg
movlw seg70 ; Incio da tabela de valores
addwf bcd_in,w ; & do val a mostrar da tabela
movwf FSR ; Set do endereo da tabela
movf INDF,w ; leitura do valor de 7seg
movwf PORTB ; envio do valor para o PORTB
return
;===================================================================;
; Delay ;
; Pode gerar delays entre 10 mS e 2,5 S ;
; O valor de entrada e passado em W (1..255) ;
; ;
; Notas: o loop base e de 1 uS (T=200 nS <=> 4*1/20MHz) ;
; ;
; Retorna em Bank0 ;
;===================================================================;
Delay
movwf delay_mult ; Carrega o valor multiplo
Del_m10 movlw 50 ; de 10 mS
movwf delay_k50 ; 50 => 10 mS
Del_50 movlw 200 ; 200 => 200 uS
movwf delay_k200 ; Carrega o valor
Del_200 nop ; correspondente a 200 uS
nop
decfsz delay_k200,f ; Decrementa "delay_k200".
; O resultado colocadao em
; "delay_k200"
goto Del_200 ; while( delay_k200 > 0 )
decfsz delay_k50,f ;
goto Del_50 ; while( delay_k50 > 0 )
decfsz delay_mult,f ; Decrementa "delay_mult".
; O resultado colocadao
; em "delay_mult"
goto Del_m10 ; while( delay_mult > 0 )
return ;
;********************************************************************
END ; directive end of program
51
www.mecatronicadegaragem.blogspot.com
NOTAS:
52
www.mecatronicadegaragem.blogspot.com
1 Resumo
2 Objectivos
3 Descrio
O tempo de execuo de uma instruo normal de 1 ciclo de relgio (200 ns), com a excepo das
instrues de salto condicional, decfsz, incfsz, btfss, btfsc, (apenas quando executada a instruo de
salto) e as de salto incondicional, goto, que levam 2 ciclos de relgio (400 ns). Assim e de forma
precisa, pode-se o contar tempo recorrendo contagem de instrues de um determinado trecho de
cdigo, exemplo:
; n de ciclos de instrues
;---------------------------
delay movlw 100 ; 1
movwf timer ; + 1
loop nop ; + (1 x 100)
nop ; + (1 x 100)
decfsz timer,f ; + (1 x 100)
goto loop ; + (2 x 99) + 1
;---------------------------
return ; Total 501
O tempo que o processador leva a executar cada um dos primeiros 99 ciclos de loop de 1s,
uma vez que, a instruo nop demora 1 ciclo de relgio, decfsz 1 ciclo de relgio e goto 2 ciclos de
relgio. O ltimo ciclo de loop demora menos 200ns, dado que a instruo goto no executada.
Logo o tempo total de aproximadamente 100s (mais exactamente 99,8s).
53
www.mecatronicadegaragem.blogspot.com
54
www.mecatronicadegaragem.blogspot.com
Abaixo mostra-se o cdigo Assembly da rotina Delay, de notar que, o ciclo base de 1s da rotina,
foi feito um pouco imagem do trecho de cdigo exemplo descrito no incio do trabalho, recorrendo s
instrues de nop (no operation), decfsz (decrement skip if zero) e goto. No entanto, envoltos no ciclo
base esto mais dois ciclos de loop que provocam um aumento do valor de instrues executadas o
que implica necessariamente um aumento de tempo. Estes ciclos Del_200 e Del_50, respectivamente
de 1s200 = 200s e 1s20050 = 10ms, permitem que para uma entrada compreendida entre
[1..255] podemos ter atrasos de entre 10ms e 2,5s.
;===================================================================;
; Delay ;
; Pode gerar delays entre 10 mS e 2,5 S ;
; O valor de entrada e passado em W (1..255) ;
; ;
; Notas: o loop base e de 1 uS (T=200 nS <=> 4*1/20MHz) ;
; ;
;===================================================================;
Delay
movwf delay_mult ; Carrega o valor mltiplo
Del_m10 movlw 50 ; de 10 mS
movwf delay_k50 ; 50 => 10 mS
Del_50 movlw 200 ; 200 => 200 uS
movwf delay_k200 ; Carrega o valor
Del_200 nop ; correspondente a 200 uS
nop
decfsz delay_k200,f ; Decrementa "delay_k200".
; O resultado colocadao em
; "delay_k200"
goto Del_200 ; while( delay_k200 > 0 )
decfsz delay_k50,f ;
goto Del_50 ; while( delay_k50 > 0 )
decfsz delay_mult,f ; Decrementa "delay_mult".
; O resultado colocadao
; em "delay_mult"
goto Del_m10 ; while( delay_mult > 0 )
return
55
www.mecatronicadegaragem.blogspot.com
4 Trabalho a realizar
2. Construir uma rotina que implemente a contagem decrescente do valor 0x60 presente na va-
rivel, inicializada no ponto anterior. O decremento deve ser feito em decimal, ou seja de 60s
59s at 0s (ver figura 23).
Esta rotina deve ser chamada, a cada segundo, no programa que implementa a visualizao da
varivel descrita no ponto anterior. O programa principal deve, ao detectar a chegada da varivel
a 0, enviar para os displays a mensagem End (ver figura 24)
56
www.mecatronicadegaragem.blogspot.com
57
www.mecatronicadegaragem.blogspot.com
Elementos de Apoio
58
www.mecatronicadegaragem.blogspot.com
5.1 Ponto 1
; Trabalho Prtico n 4 II
;
; Implementao de relgio de 60 segundos, com rotina Delay
;
;********************************************************************
; *
; NomeFicheiro: trab4p1.asm *
; Data: 3/Junho/2005 *
; Verso: 1.0 *
; *
; Autores: Jos Miguel Gaspar *
; Olmpia Rodrigues *
; *
; Orientador: Prof. Jos Lus Azevedo *
; *
; Universidade de Aveiro *
; Seminrio EEI 2004/2004 *
; *
;********************************************************************
; *
; Ficheiro necessrio: P16F876.LKR *
; *
;********************************************************************
list p=16f876 ; - directiva list, define
; o processor a usar
radix decimal ; - directiva radix especifica
; definio das variveis
#include "p16f876.inc" ; - directiva include inclui
; ficheiro adicional
errorlevel -302 ; Turn off banking message
; known tested (good) code
;--------------------------------------------------------------------
; Constantes
;--------------------------------------------------------------------
RA0 EQU 0
RA1 EQU 1
RA2 EQU 2
RA3 EQU 3
RA4 EQU 4
RA5 EQU 5
RB0 EQU 0
RB1 EQU 1
RB2 EQU 2
RB3 EQU 3
RB4 EQU 4
RB5 EQU 5
RB6 EQU 6
RB7 EQU 7
RC0 EQU 0
RC1 EQU 1
RC2 EQU 2
RC3 EQU 3
RC4 EQU 4
RC5 EQU 5
RC6 EQU 6
RC7 EQU 7
;--------------------------------------------------------------------
; Displays de 7 segmentos -|gfedcba-|
59
www.mecatronicadegaragem.blogspot.com
;--------------------------------------------------------------------
seg7_0 EQU b01111110 ; Valor 0
seg7_1 EQU b00001100 ; Valor 1
seg7_2 EQU b10110110 ; Valor 2
seg7_3 EQU b10011110 ; Valor 3
seg7_4 EQU b11001100 ; Valor 4
seg7_5 EQU b11011010 ; Valor 5
seg7_6 EQU b11111000 ; Valor 6
seg7_7 EQU b00001110 ; Valor 7
seg7_8 EQU b11111110 ; Valor 8
seg7_9 EQU b11001110 ; Valor 9
seg7_A EQU b11101110 ; Valor A
seg7_B EQU b11111000 ; Valor B
seg7_C EQU b01110010 ; Valor C
seg7_D EQU b10111100 ; Valor D
seg7_E EQU b11110010 ; Valor E
seg7_F EQU b11100010 ; Valor F
seg7_n EQU b10101000 ; Valor n
seg7_null EQU b00000000 ; Valor Null
;--------------------------------------------------------------------
; Variveis (REGISTOS DE USO GERAL) Bank0
;--------------------------------------------------------------------
variaveis UDATA 0x20
seg70 RES 1 ; Valor 0 endereo
seg71 RES 1 ; Valor 1 endereo
seg72 RES 1 ; Valor 2 endereo
seg73 RES 1 ; Valor 3 endereo
seg74 RES 1 ; Valor 4 endereo
seg75 RES 1 ; Valor 5 endereo
seg76 RES 1 ; Valor 6 endereo
seg77 RES 1 ; Valor 7 endereo
seg78 RES 1 ; Valor 8 endereo
seg79 RES 1 ; Valor 9 endereo
seg7A RES 1 ; Valor A endereo
seg7B RES 1 ; Valor B endereo
seg7C RES 1 ; Valor C endereo
seg7D RES 1 ; Valor D endereo
seg7E RES 1 ; Valor E endereo
seg7F RES 1 ; Valor F endereo
seg7n RES 1 ; Valor n endereo
seg7null RES 1 ; Valor null endereo
bcd_in RES 1 ; endereo de entrada BCD
counter RES 1 ; valor a ser decrementado
disp_7seg RES 1 ; seleo do display de 7_seg
delay_mult RES 1 ; Variaveis de controlo
delay_k50 RES 1 ; dos loops
delay_k200 RES 1 ; da rotina Delay
delay_cnt RES 1
aux RES 1
;--------------------------------------------------------------------
; Macros to select the register Banks
;--------------------------------------------------------------------
Bank0 MACRO ; Macro to select data RAM Bank 0
bcf STATUS,RP0
bcf STATUS,RP1
ENDM
Bank1 MACRO ; Macro to select data RAM Bank 1
bsf STATUS,RP0
bcf STATUS,RP1
ENDM
Bank2 MACRO ; Macro to select data RAM Bank 2
60
www.mecatronicadegaragem.blogspot.com
bcf STATUS,RP0
bsf STATUS,RP1
ENDM
Bank3 MACRO ; Macro to select data RAM Bank 3
bsf STATUS,RP0
bsf STATUS,RP1
ENDM
;********************************************************************
ORG 0x0000 ; Processor reset vector
clrf PCLATH ; Ensure page bits are cleared
goto main ; Go to beginning of program
;--------------------------------------------------------------------
; Rotina Main
;--------------------------------------------------------------------
ORG 0x0005 ; Program Memory PAGE 0
main ; Programa principal.
call InitCfg ; rotina de configurao
movlw 0x60 ;
movwf counter ; Valor Inicial do contador seg
loop movlw 0 ;
movwf disp_7seg ; display 2
movfw counter ;
andlw 0xf ;
call display ; display(W,disp_7seg);
movlw 1 ;
call delay ; Delay(10 ms)
movlw 1 ;
movwf disp_7seg ; display 1
swapf counter,w ;
andlw 0x0f ;
call display ; display(W,disp_7seg);
movlw 1 ;
call delay ; Delay(10 ms)
goto loop ;
;********************************************************************
61
www.mecatronicadegaragem.blogspot.com
;--------------------------------------------------------------------
movlw seg7_0 ; Set 7segment valor 0
movwf seg70 ; Save valor 0
movlw seg7_1 ; Set 7segment valor 1
movwf seg71 ; Save valor 1
movlw seg7_2 ; Set 7segment valor 2
movwf seg72 ; Save valor 2
movlw seg7_3 ; Set 7segment valor 3
movwf seg73 ; Save valor 3
movlw seg7_4 ; Set 7segment valor 4
movwf seg74 ; Save valor 4
movlw seg7_5 ; Set 7segment valor 5
movwf seg75 ; Save valor 5
movlw seg7_6 ; Set 7segment valor 6
movwf seg76 ; Save valor 6
movlw seg7_7 ; Set 7segment valor 7
movwf seg77 ; Save valor 7
movlw seg7_8 ; Set 7segment valor 8
movwf seg78 ; Save valor 8
movlw seg7_9 ; Set 7segment valor 9
movwf seg79 ; Save valor 9
movlw seg7_A ; Set 7segment valor A
movwf seg7A ; Save valor A
movlw seg7_B ; Set 7segment valor B
movwf seg7B ; Save valor B
movlw seg7_C ; Set 7segment valor C
movwf seg7C ; Save valor C
movlw seg7_D ; Set 7segment valor D
movwf seg7D ; Save valor D
movlw seg7_E ; Set 7segment valor E
movwf seg7E ; Save valor E
movlw seg7_F ; Set 7segment valor F
movwf seg7F ; Save valor F
movlw seg7_n ; Set 7segment pattern N
movwf seg7n ; Save pattern N
movlw seg7_null ; Set 7segment pattern NULL
movwf seg7null ; Save pattern N
return
;===================================================================;
; Input: BCD_IN - valor BCD de entrada ;
; Input: DISP_7SEG - seleo do display a ser refrescado ;
; Output: no devolve nada (void) ;
; ;
; Resumo: Subroutina de Controlo dos displays ;
; Retorna em Bank0 ;
;===================================================================;
display
movwf bcd_in ;
movfw PORTA ; w = PORTA
andlw 0xF1 ;
movwf aux ; aux = w & 0xf1
disp_0 movfw disp_7seg ; switch(disp_7seg)
sublw 0x00 ;
btfss STATUS,Z ;
goto disp_1 ;
movfw aux ; case_0
iorlw 0x08 ; w = aux | 0x08
goto break ; break
disp_1 movfw disp_7seg ; switch(dis_7seg)
sublw 0x01 ;
btfss STATUS,Z ;
goto disp_2 ;
movfw aux ; case_1
iorlw 0x04 ; w = aux | 0x04
62
www.mecatronicadegaragem.blogspot.com
63
www.mecatronicadegaragem.blogspot.com
5.2 Ponto 2
; Trabalho Prtico n 4 II
;
; Implementao de relgio de 60 segundos, com rotina Delay
;
;********************************************************************
; *
; NomeFicheiro: trab4p2.asm *
; Data: 3/Junho/2005 *
; Verso: 1.0 *
; *
; Autores: Jos Miguel Gaspar *
; Olmpia Rodrigues *
; *
; Orientador: Prof. Jos Lus Azevedo *
; *
; Universidade de Aveiro *
; Seminrio EEI 2004/2004 *
; *
;********************************************************************
; *
; Ficheiro necessrio: P16F876.LKR *
; *
;********************************************************************
list p=16f876 ; - directiva list, define
; o processor a usar
radix decimal ; - directiva radix especifica
; definio das variveis
#include "p16f876.inc" ; - directiva include inclui
; ficheiro adicional
errorlevel -302 ; Turn off banking message
; known tested (good) code
;--------------------------------------------------------------------
; Constantes
;--------------------------------------------------------------------
RA0 EQU 0
RA1 EQU 1
RA2 EQU 2
RA3 EQU 3
RA4 EQU 4
RA5 EQU 5
RB0 EQU 0
RB1 EQU 1
RB2 EQU 2
RB3 EQU 3
RB4 EQU 4
RB5 EQU 5
RB6 EQU 6
RB7 EQU 7
RC0 EQU 0
RC1 EQU 1
RC2 EQU 2
RC3 EQU 3
RC4 EQU 4
RC5 EQU 5
RC6 EQU 6
RC7 EQU 7
;--------------------------------------------------------------------
; Displays de 7 segmentos -|gfedcba-|
;--------------------------------------------------------------------
seg7_0 EQU b01111110 ; Valor 0
64
www.mecatronicadegaragem.blogspot.com
65
www.mecatronicadegaragem.blogspot.com
66
www.mecatronicadegaragem.blogspot.com
goto loop
;********************************************************************
67
www.mecatronicadegaragem.blogspot.com
68
www.mecatronicadegaragem.blogspot.com
;===================================================================;
bcd_7seg
movlw seg70 ; Incio da tabela de valores
addwf bcd_in,w ; endereo do valor a mostrar
movwf FSR ; Set do endereo da tabela
movf INDF,w ; leitura do valor de 7seg
movwf PORTB ; envio do valor para o PORTB
return
;===================================================================;
; Input: COUNTER - valor de entrada ;
; Output: COUNTER - valor decrementado uma unidade ;
; Flag de Zero afectada: ;
; Z=0 if COUNTER != FF ;
; Z=1 if COUNTER == FF ;
; Retorna em Bank0 ;
;===================================================================;
countdown
decf counter,f ; counter--
movfw counter ; w = counter
sublw 0xFF ;
btfsc STATUS,Z ; if( w == 0xFF )
return ; return
movfw counter ; w = counter
andlw 0x0F ; w = w & 0x0F
sublw 0x0F ;
btfss STATUS, Z ; if( w != 0x0F)
goto dif_xf ; goto dif_xf
movfw counter ; w = counter
andlw 0xF0 ; w = w & 0xF0
iorlw 0x09 ; w = w | 0x09
movwf counter ; counter = w
dif_xf: bcf STATUS,Z ; reset ZERO flag
return
;===================================================================;
; Delay ;
; Pode gerar delays entre 10 mS e 2,5 S ;
; O valor de entrada e passado em W (1..255) ;
; ;
; Notas: o loop base e de 1 uS (T=200 nS <=> 4*1/20MHz) ;
; ;
; Retorna em Bank0 ;
;===================================================================;
delay
movwf delay_mult ; Carrega o valor multiplo
Del_m10 movlw 50 ; de 10 mS
movwf delay_k50 ; 50 => 10 mS
Del_50 movlw 200 ; 200 => 200 uS
movwf delay_k200 ; Carrega o valor
Del_200 nop ; correspondente a 200 uS
nop
decfsz delay_k200,f ; Decrementa "delay_k200".
; O resultado colocadao em
; "delay_k200"
goto Del_200 ; while( delay_k200 > 0 )
decfsz delay_k50,f ;
goto Del_50 ; while( delay_k50 > 0 )
decfsz delay_mult,f ; Decrementa "delay_mult".
; O resultado colocadao
; em "delay_mult"
goto Del_m10 ; while( delay_mult > 0 )
return
;********************************************************************
69
www.mecatronicadegaragem.blogspot.com
70
www.mecatronicadegaragem.blogspot.com
5.3 Ponto 3
; Trabalho Prtico n 4 III
;
; Implementao de relgio de 60 segundos, com rotina Delay
;
;********************************************************************
; *
; NomeFicheiro: trab4p3.asm *
; Data: 3/Junho/2005 *
; Verso: 1.0 *
; *
; Autores: Jos Miguel Gaspar *
; Olmpia Rodrigues *
; *
; Orientador: Prof. Jos Lus Azevedo *
; *
; Universidade de Aveiro *
; Seminrio EEI 2004/2004 *
; *
;********************************************************************
; *
; Ficheiro necessrio: P16F876.LKR *
; *
;********************************************************************
list p=16f876 ; - directiva list, define
; o processor a usar
radix decimal ; - directiva radix especifica
; definio das variveis
#include "p16f876.inc" ; - directiva include inclui
; ficheiro adicional
errorlevel -302 ; Turn off banking message
; known tested (good) code
;--------------------------------------------------------------------
; Constantes
;--------------------------------------------------------------------
RA0 EQU 0
RA1 EQU 1
RA2 EQU 2
RA3 EQU 3
RA4 EQU 4
RA5 EQU 5
RB0 EQU 0
RB1 EQU 1
RB2 EQU 2
RB3 EQU 3
RB4 EQU 4
RB5 EQU 5
RB6 EQU 6
RB7 EQU 7
RC0 EQU 0
RC1 EQU 1
RC2 EQU 2
RC3 EQU 3
RC4 EQU 4
RC5 EQU 5
RC6 EQU 6
RC7 EQU 7
;--------------------------------------------------------------------
; Displays de 7 segmentos -|gfedcba-|
;--------------------------------------------------------------------
71
www.mecatronicadegaragem.blogspot.com
72
www.mecatronicadegaragem.blogspot.com
ENDM
Bank3 MACRO ; Macro to select data RAM Bank 3
bsf STATUS,RP0
bsf STATUS,RP1
ENDM
;********************************************************************
ORG 0x0000 ; Processor reset vector
clrf PCLATH ; Ensure page bits are cleared
goto main ; Go to beginning of program
;--------------------------------------------------------------------
; Rotina Main
;--------------------------------------------------------------------
ORG 0x0005 ; Program Memory PAGE 0
main ; Programa principal.
call InitCfg ; rotina de configurao
init_count movlw 0 ;
movwf disp_7seg ; display 2
movfw counter ;
andlw 0xf ;
call display ; display(W,disp_7seg);
movlw 1 ;
call delay ; Delay(10 ms)
movlw 1 ;
movwf disp_7seg ; display 1
swapf counter,w ;
andlw 0x0f ;
call display ; display(W,disp_7seg);
movlw 1 ;
call delay ; Delay(10 ms)
btfsc PORTA,RA4 ; START ON
goto init_count ; NO?
; YES
do_main movlw 1 ; do{
call delay ; delay ( 10ms )
if_main btfsc disp_7seg,0 ; if(disp_7seg == 0)
goto else_main ; {
movfw counter ; ; w = counter
andlw 0x0F ; ; w = w & 0x0F
; W = counter & 0x0F
goto display_main ;
else_main ; } else
swapf counter,w ;
andlw 0x0F ;
btfsc STATUS,Z ;
goto $+3 ;
; W = counter >> 4
display_main call display ; display(W,disp_7seg);
incf disp_7seg,w ;
andlw 0x01 ;
movwf disp_7seg ; disp_7seg=(++disp_7seg)&0x01
decfsz delay_cnt,f ; if((timer0_cnt--) == 0 )
goto do_main ; {
movlw 100 ;
movwf delay_cnt ; timer0_cnt = 100;
call countdown ; countdown(counter);
btfss STATUS,Z ; }while(STATUS,Z == 0);
goto do_main ; Yes, repeat COUNT
; No, TIME OUT
loop clrf disp_7seg
movlw 0x0d
call prt_disp7seg
movlw 0x10
call prt_disp7seg
73
www.mecatronicadegaragem.blogspot.com
movlw 0x0E
call prt_disp7seg
goto loop
;********************************************************************
74
www.mecatronicadegaragem.blogspot.com
75
www.mecatronicadegaragem.blogspot.com
76
www.mecatronicadegaragem.blogspot.com
;********************************************************************
END ; directive end of program
77
www.mecatronicadegaragem.blogspot.com
NOTAS:
78
www.mecatronicadegaragem.blogspot.com
1 Resumo
2 Objectivos
3 Descrio
79
www.mecatronicadegaragem.blogspot.com
relgio foram aplicados inicialmente, mostrando o contador o valor binrio 3. Depois de 255 pul-
sos de relgio terem sido aplicados, o prximo pulso efectua a passagem, de 11111111 (0xFF) a
00000000 (0x00), sendo que a passagem sinalizada atravs de um sinal de sada, a este sinal d-se
o nome de timer overflow. Pode ser gerado por interrupo (ver trabalho prtico 7), ou por polling, a
vantagem de usar uma interrupo para o timer clara uma vez que o programa pode realizar outras
operaes, enquanto aguarda pela sinalizao do overflow.
3.1 Timer 0
Especificao do timer 0
Activao por overflow do bit 2 INTCON TOIF, na passagem de 0xFF para 0x00;
Pode gerar interrupes de fim de contagem, bit 2 INTCON TOIF, desde que o bit 7
INTCON GIE, esteja activo.
80
www.mecatronicadegaragem.blogspot.com
A figura 28 mostra o diagrama de blocos para o timer 0. A linha a vermelho, descreve deste a
entrada at ao timer o modo de seleco do sinal (relgio) de funcionamento. A seleco do sinal
entrada feita pelo bit TOCS do registo OPTION_REG (ver pgina 82), sendo que este o clock
interno do PIC, 5Mhz, (1 ciclo de instruo de relgio do micro). A seleco efectuada usa ainda
um pr-divisor ou contador programvel (prescaler) de 8 bits, este permite dividir o sinal de entrada
por um mximo de 256 (sinal de sada com pr diviso mxima = 19,5Khz). O nmero de contagens
do pr-divisor determinado pelos bits PS0, PS1, PS2 (bits 0, 1, & 2) do registo OPTION_REG.
Finalmente o sinal de relgio chega ao mdulo timer 0, este um contador binrio de 8 bits podendo
contar at 256. Durante a contagem, quando detectada a passagem de 255(0xFF) a 0(0x00), ou
seja o overflow, activado um sinal atravs de uma flag, (bit 2 do registo INTCON - TOIF, pgina
83). Esta flag deve ser reposta a zero por programao, de maneira a permitir a sinalizao de novo
overflow.
O cdigo Assembly seguinte mostra uma possvel programao do timer 0 por polling, para uma
contagem a cada 10 ms, na activao a 1 ou a 0 do registo switch. De notar que o valor carregado no
registo TMR0 o valor de partida de contagem do mdulo timer 0, ou seja uma contagem crescente
at 256.
81
www.mecatronicadegaragem.blogspot.com
82
www.mecatronicadegaragem.blogspot.com
O INTCON contm vrios bits que inibem e desinibem as respectivas fontes de interrupo:
83
www.mecatronicadegaragem.blogspot.com
4 Trabalho a realizar
1. Voltar ao trabalho trabalho prtico 4 (ponto 3, relgio de 60s com boto START), substituir a
contagem de tempo efectuada pela rotina Delay no refrescamento dos displays de 7 segmentos,
pelo timer 0.
Perguntas:
Elementos de Apoio
84
www.mecatronicadegaragem.blogspot.com
; Trabalho n 5
; Implementao de relgio de 60 segundos, V. II c/ timer0
;
; Objecivos:
; Introduo Programao de Timers
;
;********************************************************************
; *
; Nome ficheiro: trab5.asm *
; Data: 1/Junho/2005 *
; Verso: 1.0 *
; *
; Autores: Jos Miguel Gaspar *
; Olmpia Rodrigues *
; Orientador: Prof. Jos Lus Azevedo *
; *
; Universidade de Aveiro *
; Seminrio EEI 2004/2005 *
; *
;********************************************************************
; *
; Ficheiro necessrio: p16f876.lkr *
; *
;********************************************************************
list p=16f876 ; list directive to define
radix decimal ; processor
#include "p16f876.inc" ; processor specific variable
; definitions
errorlevel -302 ; Turn off banking message
; known tested (good) code
;--------------------------------------------------------------------
; Constantes
;--------------------------------------------------------------------
RA0 EQU 0
RA1 EQU 1
RA2 EQU 2
RA3 EQU 3
RA4 EQU 4
RA5 EQU 5
RB0 EQU 0
RB1 EQU 1
RB2 EQU 2
RB3 EQU 3
RB4 EQU 4
RB5 EQU 5
RB6 EQU 6
RB7 EQU 7
RC0 EQU 0
RC1 EQU 1
RC2 EQU 2
RC3 EQU 3
RC4 EQU 4
RC5 EQU 5
RC6 EQU 6
RC7 EQU 7
TMR0_HW_VAL1 EQU 60 ; 10ms aprox.
TMR0_HW_VAL2 EQU 120 ; 5ms aprox.
TMR0_SFW_VAL EQU 100 ;
;--------------------------------------------------------------------
;Displays de 7 segementos -|gfedcba-|
;--------------------------------------------------------------------
85
www.mecatronicadegaragem.blogspot.com
86
www.mecatronicadegaragem.blogspot.com
ENDM
;********************************************************************
ORG 0x0000 ; Processor reset vector
clrf PCLATH ; Ensure page bits are cleared
goto main ; Go to beginning of program
;--------------------------------------------------------------------
; Rotina Main
;--------------------------------------------------------------------
ORG 0x0005
main ; Programa principal.
call InitCfg ; rotina de configurao
do_main ; do{
btfss INTCON,T0IF ; while(TOIF == 0) {}
goto $-1 ;
bcf INTCON,T0IF ; T0IF = 0;
movlw TMR0_HW_VAL1 ;
movwf TMR0 ; Set Hardware timer0 Value
if_main btfsc disp_7seg,0 ; if(disp_7seg == 0)
goto else_main ; {
movfw counter ; w = counter
andlw 0x0F ; w = w & 0x0F
movwf bcd_in ; bcd_in = counter & 0x0F
goto display_main;
else_main ; } else
swapf counter,w ;
andlw 0x0F ;
btfsc STATUS,Z ;
goto $+3 ; if (STATUS,Z==1)
movwf bcd_in ; bcd_in = counter >> 4;
display_main call display ; display(bcd_in,disp_7seg);
incf disp_7seg,w ;
andlw 0x01 ;
movwf disp_7seg ; disp_7seg = (++disp_7seg) & 0x01;
decfsz timer0_cnt,f ;
goto do_main ;
movlw TMR0_SFW_VAL ; if((timer0_cnt--) == 0 )
movwf timer0_cnt ; timer0_cnt = 100;
call countdown ; countdown(counter)
btfss STATUS,Z ; }while(STATUS,Z == 0);
goto do_main ; Yes, repeat COUNT
; No, TIME OUT
loop ; while(1){
clrf disp_7seg ; disp_7seg = 0
movlw 0x0d ; Val_disp0
call prt_disp7seg ; prt_disp7seg(W(reg))
movlw 0x10 ; Val_disp1
call prt_disp7seg ; prt_disp7seg(W(reg))
movlw 0x0e ; Val_disp2
call prt_disp7seg ; prt_disp7seg(W(reg))
goto loop ; }
;********************************************************************
87
www.mecatronicadegaragem.blogspot.com
; ;
; Notas: ;
;===================================================================;
InitCfg
;----------------- I/O - InitCfg -----------------------------------;
Bank1 ; DATA memory (RAM) Bank1
clrf TRISA ; RA[7:0] outputs
movlw b00000001 ; RB[7:1] outputs
movwf TRISB ; RB[1] input
;----------------- TRM0 - InitCfg ----------------------------------;
clrf OPTION_REG ; clear OPTION_REG
bsf OPTION_REG,PS2 ;
bsf OPTION_REG,PS1 ; TMR0 Rate
bsf OPTION_REG,PS0 ; 1:256
Bank0 ; DATA memory (RAM) Bank0
clrf disp_7seg ;
movlw 0x59 ;
movwf counter ; Valor Inicial do contador seg
;--------------------------------------------------------------------
; Inicializao dos registros associados aos displays 7seg
;--------------------------------------------------------------------
movlw seg7_0 ; Set 7segment valor 0
movwf seg70 ; Save valor 0
movlw seg7_1 ; Set 7segment valor 1
movwf seg71 ; Save valor 1
movlw seg7_2 ; Set 7segment valor 2
movwf seg72 ; Save valor 2
movlw seg7_3 ; Set 7segment valor 3
movwf seg73 ; Save valor 3
movlw seg7_4 ; Set 7segment valor 4
movwf seg74 ; Save valor 4
movlw seg7_5 ; Set 7segment valor 5
movwf seg75 ; Save valor 5
movlw seg7_6 ; Set 7segment valor 6
movwf seg76 ; Save valor 6
movlw seg7_7 ; Set 7segment valor 7
movwf seg77 ; Save valor 7
movlw seg7_8 ; Set 7segment valor 8
movwf seg78 ; Save valor 8
movlw seg7_9 ; Set 7segment valor 9
movwf seg79 ; Save valor 9
movlw seg7_A ; Set 7segment valor A
movwf seg7A ; Save valor A
movlw seg7_B ; Set 7segment valor B
movwf seg7B ; Save valor B
movlw seg7_C ; Set 7segment valor C
movwf seg7C ; Save valor C
movlw seg7_D ; Set 7segment valor D
movwf seg7D ; Save valor D
movlw seg7_E ; Set 7segment valor E
movwf seg7E ; Save valor E
movlw seg7_F ; Set 7segment valor F
movwf seg7F ; Save valor F
movlw seg7_n ; Set 7segment pattern N
movwf seg7n ; Save pattern N
movlw seg7_null ; Set 7segment pattern NULL
movwf seg7null ; Save pattern N
;---------------------------------------------------------------------------
; Programao do Timer0
;---------------------------------------------------------------------------
movlw TMR0_HW_VAL1 ; Set Hardware timer0 Value
movwf TMR0 ; Set TMR0
88
www.mecatronicadegaragem.blogspot.com
89
www.mecatronicadegaragem.blogspot.com
90
www.mecatronicadegaragem.blogspot.com
1 Resumo
Construo de uma mquina de estados que implemente um semforo para automveis e pees.
2 Objectivos
3 Descrio
91
www.mecatronicadegaragem.blogspot.com
A figura 30 um exemplo de um diagrama de estados, que mostra a interaco entre os vrios estados
propostos no trabalho prtico, este exemplifica a maneira como so efectuadas as transies entre
estados ao longo do tempo. De notar que os tempos t1 a t5 representam os tempos em que os estados
esto em execuo. A tabela 3 descreve a activao (ON) dos leds durante a execuo dos estados.
92
www.mecatronicadegaragem.blogspot.com
4 Trabalho a realizar
1. Dispondo de 5 leds ( 2 vermelhos, 2 verdes e 1 amarelo ), implementar na placa branca dois
semforos, um para automveis e outro para pees, ligados respectivamente em RB1, RB2,
RB3 e RB4,RB5 (ver figura 31 ).
93
www.mecatronicadegaragem.blogspot.com
Elementos de Apoio
94
www.mecatronicadegaragem.blogspot.com
; Trabalho n 6
;
; Semforo Rodovirio (automveis & pees)
;
;
;********************************************************************
; *
; NomeFicheiro: trab6.asm *
; Data: 3/Junho/2005 *
; Verso: 1.0 *
; *
; Autores: Jos Miguel Gaspar *
; Olmpia Rodrigues *
; *
; Orientador: Prof. Jos Lus Azevedo *
; *
; Universidade de Aveiro *
; Seminrio EEI 2004/2004 *
; *
;********************************************************************
; *
; Ficheiro necessrio: P16F876.LKR *
; *
;********************************************************************
list p=16f876 ; list directive to define
radix decimal ; processor
#include "p16f876.inc" ; processor specific variable
; definitions
errorlevel -302 ; Turn off banking message
; known tested (good) code
;====================================================================
; Constantes
;====================================================================
RB0 EQU 0
RB1 EQU 1
RB2 EQU 2
RB3 EQU 3
RB4 EQU 4
RB5 EQU 5
RB6 EQU 6
RB7 EQU 7
RA0 EQU 0
RA1 EQU 1
RA2 EQU 2
RA3 EQU 3
RA4 EQU 4
RA5 EQU 5
RA6 EQU 6
RA7 EQU 7
TMR0_SFW_VAL EQU 50 ; Set Software timer0_count Value
TMR0_HW_VAL EQU 60 ; Set Hardware timer0 Value
;====================================================================
; Constantes de tempo de espera nos estados em unidades de 0,5 seg
;====================================================================
t_verd2amar_A EQU 3 ; tempo,s1 = 1,5s
t_amar2verm_A EQU 2 ; tempo,s2 = 1s
t_verde_P EQU 8 ; tempo,s3 = 4s
t_verd_interm EQU 6 ; tempo,s4 = 3s
t_verm_A_P EQU 3 ; tempo,s5 = 1,5s
95
www.mecatronicadegaragem.blogspot.com
;======================================================================
; Definicoes - PORTA
;======================================================================
;
;INPUTS
SW1 EQU RA4 ; SW1 est ligado a RA4
;====================================================================
; Definicoes - PORTB
;====================================================================
;
;OUTPUTS
LED_VERM_A EQU RB1 ; LED1 est ligado a RB1
LED_AMAR_A EQU RB2 ; LED2 est ligado a RB2
LED_VERD_A EQU RB3 ; LED3 est ligado a RB3
LED_VERM_P EQU RB4 ; LED4 est ligado a RB4
LED_VERD_P EQU RB5 ; LED5 est ligado a RB5
;====================================================================
; Variaveis
;====================================================================
variaveis UDATA 0x20
delay_mult RES 1 ; Variaveis de controlo dos loops
delay_k50 RES 1 ; da rotina Delay
delay_k200 RES 1
conta_verd2amar_A RES 1
conta_amar2verm_A RES 1
conta_verde_P RES 1
conta_verd_interm RES 1
conta_verm_A_P RES 1
estado RES 1
timer0_cnt RES 1
;====================================================================
; Macros to select the register Banks
;====================================================================
Bank0 MACRO ; Macro to select data RAM Bank 0
bcf STATUS,RP0
bcf STATUS,RP1
ENDM
Bank1 MACRO ; Macro to select data RAM Bank 1
bsf STATUS,RP0
bcf STATUS,RP1
ENDM
Bank2 MACRO ; Macro to select data RAM Bank 2
bcf STATUS,RP0
bsf STATUS,RP1
ENDM
Bank3 MACRO ; Macro to select data RAM Bank 3
bsf STATUS,RP0
bsf STATUS,RP1
ENDM
;====================================================================
; Macros to select the states
;====================================================================
macro_inicial MACRO ; Macro to select state 0
bsf PORTB,LED_VERD_A ; LED VERDE AUTOMOVEIS ON
bcf PORTB,LED_AMAR_A ; LED AMARELO AUTOMOVEIS OFF
bcf PORTB,LED_VERM_A ; LED VERMELHO AUTOMOVEIS OFF
bcf PORTB,LED_VERD_P ; LED VERDE PEOES OFF
bsf PORTB,LED_VERM_P ; LED VERMELHO PEOES ON
96
www.mecatronicadegaragem.blogspot.com
ENDM
macro_verd2amar_A MACRO ; Macro to select state 1
bcf PORTB,LED_VERD_A ; LED VERDE AUTOMOVEIS OFF
bsf PORTB,LED_AMAR_A ; LED AMARELO AUTOMOVEIS ON
bcf PORTB,LED_VERM_A ; LED VERMELHO AUTOMOVEIS OFF
bcf PORTB,LED_VERD_P ; LED VERDE PEOES OFF
bsf PORTB,LED_VERM_P ; LED VERMELHO PEOES ON
ENDM
macro_amar2verm_A MACRO ; Macro to select state 2
bcf PORTB,LED_VERD_A ; LED VERDE AUTOMOVEIS OFF
bcf PORTB,LED_AMAR_A ; LED AMARELO AUTOMOVEIS OFF
bsf PORTB,LED_VERM_A ; LED VERMELHO AUTOMOVEIS ON
bcf PORTB,LED_VERD_P ; LED VERDE PEOES OFF
bsf PORTB,LED_VERM_P ; LED VERMELHO PEOES ON
ENDM
macro_verde_P MACRO ; Macro to select state 3
bcf PORTB,LED_VERD_A ; LED VERDE AUTOMOVEIS OFF
bcf PORTB,LED_AMAR_A ; LED AMARELO AUTOMOVEIS OFF
bsf PORTB,LED_VERM_A ; LED VERMELHO AUTOMOVEIS ON
bsf PORTB,LED_VERD_P ; LED VERDE PEOES ON
bcf PORTB,LED_VERM_P ; LED VERMELHO PEOES OFF
ENDM
macro_verd_interm MACRO ; Macro to select state 4
bcf PORTB,LED_VERD_A ; LED VERDE AUTOMOVEIS OFF
bcf PORTB,LED_AMAR_A ; LED AMARELO AUTOMOVEIS OFF
bsf PORTB,LED_VERM_A ; LED VERMELHO AUTOMOVEIS ON
bsf PORTB,LED_VERD_P ; LED VERDE PEOES ON
bcf PORTB,LED_VERM_P ; LED VERMELHO PEOES OFF
ENDM
macro_verm_A_P MACRO ; Macro to select state 4
bcf PORTB,LED_VERD_A ; LED VERDE AUTOMOVEIS OFF
bcf PORTB,LED_AMAR_A ; LED AMARELO AUTOMOVEIS OFF
bsf PORTB,LED_VERM_A ; LED VERMELHO AUTOMOVEIS ON
bcf PORTB,LED_VERD_P ; LED VERDE PEOES OFF
bsf PORTB,LED_VERM_P ; LED VERMELHO PEOES ON
ENDM
;********************************************************************
ORG 0x0000 ; Processor reset vector
clrf PCLATH ; Ensure page bits are cleared
goto main ; Go to beginning of program
;--------------------------------------------------------------------
; Rotina Main
;--------------------------------------------------------------------
ORG 0x0005 ;
main ; Programa principal.
call InitCfg
loop ; do{
btfss INTCON,T0IF ; while(TOIF == 0){}
goto $-1 ;
bcf INTCON,T0IF ; T0IF = 0;
movlw TMR0_HW_VAL ; Set Hardware timer0 Value
movwf TMR0 ; Set TMR0
decfsz timer0_cnt,f ; if(timer0_cnt == 0)
goto loop ; {
movlw d50 ;
movwf TMR0_SFW_VAL ; timer0_cnt = 100;
; while( timer0_cnt !=0 )
switch movfw estado ; w = estado
sublw 0x00
97
www.mecatronicadegaragem.blogspot.com
btfsc STATUS,Z
goto estado_inicial
movfw estado
sublw 0x01
btfsc STATUS,Z
goto estado_verd2amar_A
movfw estado
sublw 0x02
btfsc STATUS,Z
goto estado_amar2verm_A
movfw estado
sublw 0x03
btfsc STATUS,Z
goto estado_verde_P
movfw estado
sublw 0x04
btfsc STATUS,Z
goto estado_verd_interm
movfw estado
sublw 0x05
btfsc STATUS,Z
nop
goto estado_verm_A_P
estado_inicial ; estado inicial
macro_inicial
btfsc PORTA,SW1 ; while(sw1 == 0) {}
goto estado_inicial
incf estado,f ; estado++;
movlw t_verd2amar_A
movwf conta_verd2amar_A
movlw t_amar2verm_A
movwf conta_amar2verm_A
movlw t_verde_P
movwf conta_verde_P
movlw t_verd_interm
movwf conta_verd_interm
movlw t_verm_A_P
movwf conta_verm_A_P
goto loop ; break;
estado_verd2amar_A
macro_verd2amar_A
decfsz conta_verd2amar_A,f ; if (count_amar_a == 0)
goto loop ; {
incf estado,f ; estado++:
goto loop ; break;
estado_amar2verm_A
macro_amar2verm_A
decfsz conta_amar2verm_A,f ; if (count_verm_a == 0)
goto loop ; {
incf estado,f ; estado++:
goto loop ; break;
estado_verde_P
macro_verde_P
decfsz conta_verde_P ,f ; if (count_verd_p == 0)
goto loop ; {
incf estado,f ; estado++:
goto loop ; break;
estado_verd_interm
macro_verd_interm ; led verde peoes on
btfss conta_verd_interm,0
98
www.mecatronicadegaragem.blogspot.com
goto off_led
bsf PORTB,LED_VERD_P
goto fim
off_led bcf PORTB,LED_VERD_P
fim decfsz conta_verd_interm,f ; if (count_inter_p == 0)
goto loop
incf estado,f
goto loop
estado_verm_A_P
macro_verm_A_P
decfsz conta_verm_A_P,f ; if (count_verd_p == 0)
goto loop ; {
clrf estado ; estado=0;
goto loop ; break;
;===================================================================;
; InitCfg ;
; Configurao inicial dos registros associados ;
; ao programa principal ;
; ;
; Retorna em Bank0 ;
; ;
;===================================================================;
InitCfg
;----------------- Analog 2 Digital - InitCfg ----------------------;
Bank1 ; DATA memory (RAM) Bank1
movlw 0x06 ; W = 0x06
movwf ADCON1 ; ADCON1 (PORTA I/O digital)
;----------------- I/O - InitCfg -----------------------------------;
movlw b0001000 ; R4 inputs
movwf TRISA ;
movlw b1100000 ; R[5:0] outputs
movwf TRISB ; R[7:6] inputs
;----------------- TRM0 - InitCfg ----------------------------------;
clrf OPTION_REG ; clear OPTION_REG
bsf OPTION_REG,PS2 ;
bsf OPTION_REG,PS1 ; TMR0 Rate
bsf OPTION_REG,PS0 ; 1:256
Bank0 ; DATA memory (RAM) Bank0
clrf estado ; estado = 0;
clrf PORTA ; Inicializao PORTA
;---------------------------------------------------------------------------
; Programao do Timer0
;---------------------------------------------------------------------------
movlw TMR0_HW_VAL ; Set Hardware timer0 Value
movwf TMR0 ; Set TMR0
movlw TMR0_SFW_VAL ; Set Software timer0_count Value
movwf timer0_cnt ; Save time0_count adjust
return
END ; end of program
99
www.mecatronicadegaragem.blogspot.com
NOTAS:
100
www.mecatronicadegaragem.blogspot.com
1 Resumo
Pretende-se com este trabalho prtico, introduzir o conceito da transferncia de informao I/O por
interrupo, ilustrado-o com uma soluo do trabalho 1 (led controlado por boto de presso) por
interrupo.
No final do trabalho, utilizaremos o exemplo desenvolvido nos trabalhos 4 e 5 (relgio de 60s),
para gerar interrupes atravs do timer 0 e da linha INT0/RB0 do PIC.
2 Objectivos
3 Descrio
O PIC16F876 tem a possibilidade de contar com um sistema de interrupes. Este sistema, consiste
num mecanismo atravs do qual um acontecimento interno ou externo, (assncrono relativamente ao
programa), pode interromper a execuo, do programa em curso. automaticamente produzido um
salto para a rotina de atendimento (RSI), onde executado o cdigo que processa o evento gerador da
interrupo, uma vez terminada a RSI, a execuo do programa interrompido retomada.
Existem 13 fontes de interrupo no PIC16F876, vejamos algumas:
101
www.mecatronicadegaragem.blogspot.com
A figura 32, representa o esquema simples de uma interrupo genrica. Antes da RSI pro-
priamente dita, feito automticamente o reset do bit GIE, (bit 7 do registo INTCON), ou seja a
desactivao de todas as interrupes durante o atendimento. O endereo de retorno guardado na
stack, sendo atribudo ao PC (program counter) o endereo 0x0004 (o que equivale a um salto para o
endereo 4 da memria de programa).
dever do programador, salvaguardar o contexto dos seguintes registos, W(reg), STATUS e
PCLATH. Uma vez dentro da RSI, a fonte de interrupo pode ser determinada por polling aos bits
de interrupo; das fontes de interrupo utilizadas. Os mesmos devem ser repostos a zero antes da
terminao da RSI, evitando-se desse modo a gerao (no desejada) de uma nova interrupo.
Nos trechos de cdigo assembly seguintes, mostra-se em primeiro lugar o programa principal, inici-
almente com a configurao dos registos TRISB e INTCON, cuja descrio pode ser encontrada nas
pginas 16 e 83 respectivamente.