Professional Documents
Culture Documents
Alunos de seminrio da Licenciatura em Ensino de Electrnica e Informtica ltima Reviso 4 de Maio de 2006
Guia realizado sob a orientao do Prof. Doutor Jos Lus Azevedo <jla@det.ua.pt> Prof. Auxiliar do Departamento de Electrnica e Telecomunicaes da Universidade de Aveiro
Resumo
A elaborao deste guia insere-se no mbito do seminrio da Licenciatura em Ensino de Electrnica e Informtica. A motivao do trabalho vm ao encontro da lacuna documental existente sobre microcontroladores no mbito da disciplina de Sistemas Digitais do ensino secundrio, por forma minimizar a falta de recursos foram desenvolvidos dois guias de trabalhos prticos sobre microcontroladores, um para cada, aluno e professor. Para o efeito escolheu-se um microcontrolador da famlia 16F87X da Microchip, para a realizao dos diversos trabalhos prticos
iii
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 seminrio.
Contedo
Resumo Contedo Lista de Figuras Lista de Tabelas Introduo 1 Enquadramento geral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1 2 3 Trabalhos prticos a realizar . . . . . . . . . . . . . . . . . . . . . . . . . .
iii viii x xi 1 1 1 3 3 5 5 5 5 5 8 8 10 11 12
TP0 - Introduo ao Assembly e MPLAB IDE 1 2 3 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Objectivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Descrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1 4 Ambiente de desenvolvimento MPLAB IDE . . . . . . . . . . . . . . . . .
Trabalho a Realizar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1 4.2 4.3 4.4 Criao de um projecto no MPLAB IDE . . . . . . . . . . . . . . . . . . . Traduo do cdigo fonte em cdigo mquina . . . . . . . . . . . . . . . . . Programao do PIC16F876 atravs da linha srie . . . . . . . . . . . . . . Estrutura base de um programa em Assembly . . . . . . . . . . . . . . . . .
TP1 - Entrada/Sada 1 2 3 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Objectivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Descrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1 3.2 4 Registos TRIS e PORT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Inicializao dos portos . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Trabalho a realizar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
TP2 - Descodicador Hexadecimal / 7Seg, 1 display 1 2 3 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Objectivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Descrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1 3.2 4 Endereamento Indirecto, Registo FSR e INDF . . . . . . . . . . . . . . . . Seleco do Banco de Memria . . . . . . . . . . . . . . . . . . . . . . . .
Trabalho a realizar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
TP3 - Descodicador Hexadecimal / 7Seg, 3 Displays 1 2 3 4 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Objectivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Descrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Trabalho a realizar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1 Descrio do registo STATUS . . . . . . . . . . . . . . . . . . . . . . . . .
TP4 Contador de 60 segundos, verso I 1 2 3 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Objectivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Descrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1 Rotina Delay . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
vi
ndice de Contedos
4 Trabalho a realizar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 35 35 35 35 36 38 39 40 41 41 41 41 42 43 45 45 45 45 46 48 51 51 51 51 52
TP5 Relgio de 60 segundos, verso II 1 2 3 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Objectivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Descrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1 3.2 3.3 4 Timer 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Registo OPTION_REG Registo INTCON . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Trabalho a realizar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
TP6 Semforo rodovirio(automveis/pees) 1 2 3 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Objectivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Descrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1 4 Diagrama de estados - Semforo rodovirio . . . . . . . . . . . . . . . . . .
Trabalho a realizar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
TP7 - Relgio 60 segundos, verso III 1 2 3 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Objectivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Descrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1 4 Led pisca-pisca com boto ON/OFF por interrupo . . . . . . . . . . . . .
Trabalho a realizar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
TP8 USART Universal Synchronous Asynchronous Receiver Transmitter 1 2 3 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Objectivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Descrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1 Congurao dos pinos de transmisso/recepo . . . . . . . . . . . . . . .
vii
Trabalho a realizar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
TP9 ADC - Converso Analgica / Digital 1 2 3 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Objectivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Descrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1 3.2 3.3 3.4 3.5 3.6 4 Entrada Analgica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Resultado da converso A/D . . . . . . . . . . . . . . . . . . . . . . . . . . Mecanismo de aquisio da ADC . . . . . . . . . . . . . . . . . . . . . . . Etapas na programao da ADC (polling) . . . . . . . . . . . . . . . . . . . Registo ADCON0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Registo ADCON1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Trabalho a realizar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Apendix A Apendix B
viii
Lista de Figuras
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 Disposio dos componentes na placa de CI DETUA . . . . . . . . . . . . . . . . . Esquema da placa PIC DETUA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Janela associada ao processo de simulao de um programa no MPLAB IDE . . . . . Projecto em MPLAB IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Visualizao de janelas de informao memria do PIC . . . . . . . . . . . . . . . . fase 1 - criao de um novo projecto . . . . . . . . . . . . . . . . . . . . . . . . . . fase 2 - seleco do microcontrolador. . . . . . . . . . . . . . . . . . . . . . . . . . Adicionar um cheiro fonte existente ou criar um novo. . . . . . . . . . . . . . . . . Traduo do cdigo fonte em cdigo mquina. . . . . . . . . . . . . . . . . . . . . . WinPIC Loader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Congurao de uma linha em E/S . . . . . . . . . . . . . . . . . . . . . . . . . . . Diagrama do circuito, led on/off. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Diagrama temporal da sada temporizada . . . . . . . . . . . . . . . . . . . . . . . . Diagrama do circuito para o contador up/down . . . . . . . . . . . . . . . . . . . . . Acesso memria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Endereamento Indirecto cdigo de demonstrao . . . . . . . . . . . . . . . . . . . Seleco do banco de memria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Diagrama do circuito, 1 display de 7 segmentos . . . . . . . . . . . . . . . . . . . . Processo de refrescamento dos displays . . . . . . . . . . . . . . . . . . . . . . . . Seleco dos bancos de memria RAM. . . . . . . . . . . . . . . . . . . . . . . . . Diagrama de uxo da rotina Delay . . . . . . . . . . . . . . . . . . . . . . . . . . . Diagrama do circuito para para visualizao do valor 0x60 . . . . . . . . . . . . . 4 4 7 7 8 8 9 9 10 11 16 18 18 19 21 22 23 24 26 27 30 32
ix
Lista de Tabelas
1 2 3 4 5 Descrio dos temas a abordar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . HEX 7 segmentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Descrio do estado dos leds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tempo minmo entre estados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Taxa de transmisso em modo assncrono (BRGH = 1) . . . . . . . . . . . . . . . . 1 24 42 43 52
xi
Introduo
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 especca, podendo cada um deles ser realizado independentemente um dos outros. Contudo, para um aluno sem experincia 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 fundamentais: a) os trabalhos esto organizados com um grau de diculdade 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.
1.1
Trabalho 0 1 2 3 4 5 6 7 8 9
Tabela 1: Descrio dos temas a abordar. 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 conhecimento das potencialidades que ambiente de desenvolvimento disponibiliza na realizao dos trabalhos
Introduo
Processador RISC (Reduce Instrution Set Computer) 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. As seguintes caractersticas da memria; Memria de programa (FLASH) de 8K (words) de 14 bits; Cada instruo codicada numa word de 14 bits; Memria de dados RAM de 368 bytes; Memria de dados EEPROM de 256 bytes; Stack de 8 nveis. As seguintes caractersticas de perifricos: 22 linhas de entrada/sada, agrupadas em 3 portos (PORTA 6 linhas, PORTB e PORTC 8 linhas); 3 timers, 2 de 8 bits e 1 de 16 bits; Conversor analgico digital de 10 bits, com um mximo de 5 canais de entrada analgica; USART (Universal Synchronous Asynchronous Receiver Transmitter); 13 tipos de interrupes, por exemplo externa RB0/INT, TMR0 timer overow.
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 seguintes o esquema elctrico do circuito bem como a disposio dos componentes na placa de circuito impresso.
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 microcontroladores 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.
Objectivos
Criao de um projecto no ambiente de desenvolvimento MPLAB IDE. Conhecer o processo de traduo de cdigo fonte para cdigo mquina. Conhecer o processo de programao do microcontrolador atravs do WinPIC Loader. Introduo programao em linguagem Assembly.
3
3.1
Descrio
Ambiente de desenvolvimento MPLAB IDE
O MPLAB IDE um ambiente de desenvolvimento integrado que permite a edio, o debugging e a traduo para cdigo mquina de programas em linguagem Assembly. Disponibiliza essencialmente, as seguintes ferramentas: Editor com reconhecimento das instrues do PIC e directivas do Assembler em syntax highlight. 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;
4
4.1
Trabalho a Realizar
Criao de um projecto no MPLAB IDE
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 gura 6).
Figura 7: fase 2 - seleco do microcontrolador. 4. Ao projecto que acabou de se criar, associa-se agora o cheiro 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 cheiro com a extenso ".asm", de modo a activar a funcionalidade syntax highlight (menu File Save As... guardando o cheiro no directrio c:\aulas\exemplo criado anteriormente). Neste exemplo o cdigo fonte j se encontra num cheiro no directrio do projecto. Este cheiro pode ser adicionado ao projecto clicando com o boto direito do rato em cima de Source Files Add Files... (ver gura 8(b)).
Regies de memria de dados e programa do PIC. Mapeamento de seces lgicas no cdigo fonte, em regies de programa e dados. Esto disponveis cheiros originais de script para todos os PIC, localizados por defeito no seguinte directrio: c:\Program Files\Microchip\MPASM Suite\LKR. Para adicionar o cheiro pretendido, clicar com o boto direito do rato em cima de Script Files Add Files....
4.2
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 grco de sada que mostra a evoluo da compilao car completo a 100% e de cor verde; caso contrrio car vermelho, o que indica a existncia de um ou mais erros. Na ausncia de erros de syntax, criado o cheiro de sada que tem como nome principal o nome do projecto com extenso ".hex".
10
TP0 - Introduo ao Assembly e MPLAB IDE 4.3 Programao do PIC16F876 atravs da linha srie
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 cheiro 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 cheiro em formato Intel Hex ( extenso ".hex"). 2. Executar o programa WinPIC Loader, clicar em File Open seleccionar o cheiro ".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
Guia prtico sobre microcontroladores PIC 4.4 Estrutura base de um programa em Assembly
list radix p=16f876 decimal ; - directiva "list", define ; o processador a usar ; - directiva "radix" especifica ; a definio das variveis ; - directiva "include" inclui ; ficheiro adicional
#include "p16f876.inc"
;==================================================================== ; 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
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 congurao do PORTB do PIC como sada, para que seja possvel a activao/desactivao do led (RB0). De seguida o programa entra num ciclo innito 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 Delay, 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.
main
b11111110 TRISB
loop bsf movlw call bcf movlw call goto PORTB,RB0 50 Delay PORTB,RB0 100 Delay loop
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
Memria RAM -> Bank 1 RB[0] output RB[7:1] inputs Memria RAM -> Bank 0 while(1) { Set LED in RB0 ON 50 -> W(reg) delay( 0,5 seg ) Set LED in RB0 OFF 100 -> W(reg) delay( 0,10 seg ) }
13
Elementos de Apoio
Manual terico da disciplina. DataSheet PIC16F876(DS30292C) Microchip, captulo 3. - I/O Ports, pgina 29. DataSheet PIC16F876(DS30292C) Microchip, captulo 13 - Instrution Set Summary, pgina 135.
14
TP1 - Entrada/Sada
Tema a desenvolver Entrada e Sada bsica Durao 2 aulas
Resumo
Programao e interface dos portos do PIC, atravs da implementao de programas em linguagem Assembly para leitura e escrita de dados nas linhas de entrada/sada (E/S) que compem os portos.
Objectivos
Familiarizao do aluno com a linguagem assembly do PIC; Programao dos registos associados aos portos de E/S; Leitura e escrita de dados nos portos; No nal do trabalho, dever estar compreendido o mecanismo bsico de E/S do PIC.
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 congurveis, como entrada ou como sada, identicadas pelas siglas RA0, RA1, RA2, RA3 e RA4. Cada um dos portos B e C agrupa 8 linhas congurveis como entrada ou como sada identicadas 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 entrada/sada), podendo o programador congurar por software a funo efectivamente desempenhada. De entre as funes disponveis destacam-se as seguintes: Entrada analgica, disponvel, por exemplo na linha RA0/AN0 (2); Interrupo externa, disponvel em RB0/INT (21); Entrada de clock externo do Timer 0, disponvel em RA4/T0CKL (6);
15
3.1
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 congurada as direces pretendidas das linhas do porto, por programao do registo TRIS, pode-se efectuar leituras ou escritas no porto usando o registo PORT.
Utilizao dos registos TRIS e PORT Todos os bits contidos nos registos mencionados, correspondem univocamente a uma linha de entrada/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 congura a linha como entrada enquanto um 0 congura 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 gura 11 mostra um esquema conceptual da congurao atravs do registo TRISB, de um porto. A linha RB0 est congurada como entrada ou como sada? Qual ser o nvel lgico presente no bit 0 do registo PORTB? Observa-se na gura que o bit 0 do registo TRISB est denido a 1, logo a linha RB0 est congurada 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
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 congurao da direco dos dados presentes nas linhas de E/S, por congurao 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 funcionalidades 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 congurada como entrada digital pelo registo TRISA, para as restantes necessrio tambm a congurao do registo ADCON1 (descrio feita no trabalho prtico 9). O trecho de cdigo Assembly seguinte, exemplica uma inicializao por programao de todos os portos do PIC. Este mostra, para cada porto, 3 formas de congurao do registo TRIS: 1. Transferncia para o registo W do literal em binrio, e consequente escrita em TRIS; 2. Colocao de todos os bits do registo TRIS a zero; 3. Read modify write, coloca apenas o bit correspondente a zero. ;---------------- I/O - Config -------------------------------------; Bank1 config 1 movlw movwf clrf bcf b00010000 TRISA TRISB TRISC,RC0 ; ; ; ; ; ; ; ; ; ; ; ; ; ; DATA memory (RAM) Bank1 RA[7:5 & 3:0] RA[4] RB[7:0] RC[7:1] RC[0] DATA memory Apaga todos Apaga todos Apaga todos entradas sada (RAM) Bank0 os bits do PORTA os bits do PORTB os bits do PORTC sadas entradas
config 2 config 3
17
Trabalho a realizar
1. Alterao do programa exemplo exemplo.asm de modo a que, atravs do boto de presso S2 da placa PIC ligado a RA4 (ver esquema da gura 12), seja possvel controlar o estado do led ligado ao pino RB0; boto premido led ligado, boto no premido led desligado.
Figura 12: Diagrama do circuito, led on/off. 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 gura 13, mostra o comportamento pretendido para a sada, com t=2,5s.
18
Elementos de Apoio
Manual terico da disciplina. DataSheet PIC16F876(DS30292C) Microchip, captulo 3. - I/O Ports, pgina 29. DataSheet PIC16F876(DS30292C) Microchip, captulo 11. - Analog-to-Digital Converter (A/D) Module, pgina 111. DataSheet PIC16F876(DS30292C) Microchip, captulo 13 - Instrution Set Summary, pgina 135.
19
NOTAS:
20
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.
Objectivos
Implementao de um descodicador hexadecimal / 7Segmentos por software. Utilizao de subrotinas na estrutura do programa. Compreenso dos conceitos associados ao acesso a variveis na memria RAM por endereamento indirecto.
3
3.1
Descrio
Endereamento Indirecto, Registo FSR e INDF
O FSR (File Select Register). usado no acesso em endereamento indirecto ou indexado de outros registos, em particular dos registos de uso geral. Se um registo com endereamento entre [0x20-0x7F] (Banco 0 de memria RAM) carregado no FSR, o contedo desse registo pode ser lido ou escrito atravs do registo de endereamento indirecto (INDF), localizado no topo de cada banco de memria (ver mapa de registos do PIC, Anexo A). Este mtodo pode ser usado no acesso a um grupo de dados localizados em memria RAM, atravs da leitura ou escrita de dados em INDF, a seleco do prximo elemento do grupo feito atravs do incremento de FSR (ver gura 16). O endereamento indirecto ou indexado, particularmente til na salvaguarda em memria RAM, de um grupo de dados lidos de um dado
21
NEXT
CONTINUE ; continua
22
A memria de dados (RAM) encontra-se organizada em bancos distintos (Banco 0, 1, 2 e 3) 4 no total, sendo que o acesso a cada um deles feito atravs de seleco. A seleco pode ser feita atravs de endereamento directo (ver registo STATUS pgina 27) ou indirecto. neste ltimo o bit mais signicativo do registo FSR, usado como bit menos signicativo na seleco do banco de memria a aceder; os restantes 7 bits so usados na especicao do registo dentro do banco de memria seleccionado. O bit mais signicativo para seleco do banco de memria, dado pelo bit IRP do registo de STATUS. Para mais detalhes ver descrio sobre o registo STATUS, pgina 27 do guia.
Trabalho a realizar
1. Visualizao, num display de 7 segmentos, de um digito codicado em hexadecimal (ver diagrama do circuito, gura 18). Para isso necessria a construo de uma rotina que receba um digito em hexadecimal e devolva o correspondente valor para activao de cada um dos segmentos do display. Este valor dever ser depois enviado para o PORTB. Para melhor compreender o conceito, a tabela 2 mostra a correspondncia entre os dgitos hexadecimal de entrada e o valor a enviar para cada um dos 7 segmentos do display. Por exemplo, para visualizar o digito 7 necessrio que o segmento a,b e c estejam activos, isto , mover para o PORTB o valor em binrio b00001110. 2. Construir nalmente 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).
23
Elementos de Apoio
Manual terico da disciplina. DataSheet PIC16F876(DS30292C) Microchip, captulo 2. - Memory Organization, seco 2.5 - Indirect Addressing, INDF and FSR Registers pgina 27. DataSheet PIC16F876(DS30292C) Microchip, captulo 3. - I/O Ports, pgina 29. DataSheet PIC16F876(DS30292C) Microchip, captulo 13 - Instrution Set Summary, pgina 135.
24
Resumo
Objectivos
Implementao de um sistema de visualizao hexadecimal com 3 displays, com a construo de uma rotina para refrescamento dos 3 displays por multiplexagem no tempo. Aprofundar os conhecimentos adquiridos durante o trabalho prtico 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 xa (taxa de refrescamento aprox. = 10ms). uma vez que o olho humano no tem a percepo do envio da informao enviada aos trs displays ao mesmo tempo.
25
(a)
(b)
(c)
Trabalho a realizar
1. Construo de um sistema de visualizao em 3 displays de 7 segmentos, de valores codicados em hexadecimal. Para isso, sugere-se o reaproveitamento da "bcd_7seg" construda no trabalho anterior. De modo a que a rotina "bcd_7seg" seja chamada por uma outra rotina, esta controla o envio da informao para cada display em momentos distintos, ao longo do tempo.
Elementos de Apoio
Manual terico da disciplina. DataSheet PIC16F876(DS30292C) Microchip, captulo 2. - Memory Organization, seco 2.5 - Indirect Addressing, INDF and FSR Registers pgina 27. DataSheet PIC16F876(DS30292C) Microchip, captulo 3. - I/O Ports, pgina 29. DataSheet PIC16F876(DS30292C) Microchip, captulo 13 - Instrution Set Summary, pgina 135.
26
O registo STATUS, fornece informaes sobre o resultado de instrues aritmticas realizadas na ALU (Unidade Aritmtica e Lgica do CPU), do banco de memria seleccionado e do estado de reset. bit 7 IRP: Usado na seleco do banco de memria em endereamento indirecto. 1 = Bank 2,3 (100h - 1FFh) 0 = Bank 0,1 ( 00h - FFh) Como se observa na gura 20(a), o banco de memria especicado com o bit IRP e o bit mais signicativo do registo FSR. Mais detalhes sobre o registo FSR, ver pgina 21 do guia. Um endereo dentro do banco seleccionado especicado pelos 7 bits menos signicativos 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.
Figura 20: Seleco dos bancos de memria RAM. bit 6-5 RP1:RP0: Usados na seleco do banco de memria em endereamento directo. 11 = Bank 3 (180h - 1FFh) 10 = Bank 2 (100h - 17Fh) 01 = Bank 1 ( 80h - FFh) 00 = Bank 0 ( 00h - 7Fh) Na gura 20(b), o banco de memria pretendido especicado com os bits RP1:RP0. Uma forma de optimizar este procedimento de alternncia entre bancos atravs do uso de MACROS. Para isso, basta denir inicialmente uma macro para cada banco de memria RAM. No exemplo seguinte temos
27
bit 4
TO: Condio de time-out do watchdog timer, permitida apenas leitura. 1 = Aps power-on, reset, instruo de CLRWDT, ou com instruo de SLEEP. 0 = Ocorrncia de time-out do watchdog timer.
bit 3
PD: Condio de power-down (poupana de energia), permitida apenas leitura. 1 = Aps power-up, ou aps a execuo da instruo de CLRWDT. 0 = Pela execuo da instruo de SLEEP.
bit 2
Z: Flag de Z (zero ag). 1 = Quando o resultado de operao lgica ou aritmtica zero 0 = Quando o resultado de operao lgica ou aritmtica no zero.
NOTA: Provavelmente uma das ags mais utilizadas, usada na deteco de zero no resultado de uma operao lgica ou aritmtica. bit 1 DC: Flag de Digit Carry. 1 = Quando o ocorre carry no bit 3 do resultado. 0 = Quando no ocorre carry no bit 3 do resultado. NOTA: A ag activa, aquando da execuo de uma operao, ADDWF, ADDLW, SUBLW ou SUBWF, causando carry no bit 3 do resultado (operaes de 4 bits). bit 0 C: Flag de carry 1 = Quando o ocorre carry no bit 8 do resultado. 0 = Quando no ocorre carry no bit 8 do resultado. NOTA: Esta ag activa, quando a operao sobre o registo causa um carry no bit 8 do resultado (operaes de 8 bits).
28
Resumo
Objectivos
Manipulao da rotina Delay para contagem de tempo; Envio de informao para dois displays a partir de um registo de 8 bits; Construo de uma rotina de decremento de uma varivel em BCD.
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 ;--------------------------; 1 ; + 1 ; + (1 x 100) ; + (1 x 100) ; + (1 x 100) ; + (2 x 99) + 1 ;--------------------------; Total 501
delay loop
100 timer
timer,f loop
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).
29
Disponvel deste o primeiro trabalho, a rotina Delay implementa a funcionalidade de contagem de tempo por contagem de instrues. Um exemplo disso, o trabalho prtico 0, onde o atraso efectuado pela rotina Delay, til no controle do tempo de on/off do led. A gura 21, mostra o diagrama de uxo da rotina Delay, mostrando as vrias etapas na contagem do tempo.
30
31
Trabalho a realizar
1. Implementao de um programa que permita a visualizao (com refrescamento a cada 10ms) em dois displays de 7 segmentos, de um valor presente em uma varivel (registo de uso geral), inicializada com o valor 0x60. A visualizao deve ser feita utilizando as rotinas "display" e "bcd_7seg" desenvolvidas nos trabalhos anteriores. A gura 22 mostra o esquema de ligao pretendido, bem como a estratgia a usar na codicao dos bits a enviar para cada display de 7 segmentos.
Figura 22: Diagrama do circuito para para visualizao do valor 0x60 2. Construir uma rotina que implemente a contagem decrescente do valor 0x60 presente na varivel, inicializada no ponto anterior. O decremento deve ser feito em decimal, ou seja de 60s 59s at 0s (ver gura 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 gura 24)
32
3. Depois do contador de 60s estar a funcionar correctamente, deve adicionar-se um boto de presso que implemente apenas o START do incio da contagem dos 60s (ver guras 25 e 26).
33
Elementos de Apoio
Manual terico da disciplina. DataSheet PIC16F876(DS30292C) Microchip, captulo 3. - I/O Ports, pgina 29. DataSheet PIC16F876(DS30292C) Microchip, captulo 13 - Instrution Set Summary, pgina 135.
34
Resumo
Objectivos
Introduo programao do timer 0, compreenso dos conceitos associados congurao; Modicar o programa desenvolvido em TP4, implementado o refrescamento dos displays por timers;
Descrio
Em muitos programas escritos para microcon-
troladores, muitas vezes necessrio medir tempo de determinados eventos ou efectuar contagens. Por exemplo, um sensor ligado a uma roda de bicicleta pode dar-nos o n de rotaes em cada segundo/minuto, isto conseguido com um registo contador que conta as voltas completas da roda, e um registo timer que conta os pulsos de relgio, sinalizando com um sinal interno a passagem de 1 segundo/minuto. Um registo contador/timer conta o nmero de
Figura 27: registo contador de 8 bits
pulsos digitais aplicados sua entrada. Se o sinal de relgio usado de uma frequncia conhecida, estamos perante um registo timer, uma vez que o tempo de durao da contagem igual ao valor apurado multiplicado pelo perodo de relgio. A gura 27 mostra um registo contador/timer de 8 bits, com entrada no bit menos signicativo (LSB) direita. O valor binrio guardado no registo incrementa a cada pulso aplicado. Trs pulsos
35
3.1
Timer 0
Especicao do timer 0 O temporizador / contador de 8 bits, TIMER 0 pode contar at 0xFF (255); Permite leitura e escrita; Pr-divisor de 8 bits programvel; Seleco de clock interno (FOSC/4) ou externo; Activao por overow do bit 2 INTCON TOIF, na passagem de 0xFF para 0x00; Seleco de anco ascendente ou descendente do clock externo; Pode gerar interrupes de m de contagem, bit 2 INTCON TOIF, desde que o bit 7 INTCON GIE, esteja activo.
36
37
bit 7
bit 6
bit 5
bit 4
bit 3
bit 2-0
38
O INTCON contm vrios bits que inibem e desinibem as respectivas fontes de interrupo: bit 7 GIE: Activao global das interrupes do PIC.
1 = Activa todas as interrupes. 0 = Desactiva todas as interrupes.
bit 6
bit 5
bit 4
bit 3
bit 2
bit 1
bit 0
39
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: (a) Notou alguma diferena no funcionamento do programa, com a incluso do timer 0?
Elementos de Apoio
Manual terico da disciplina. DataSheet PIC16F876(DS30292C) Microchip, captulo 3. - I/O Ports, pgina 29. DataSheet PIC16F876(DS30292C) Microchip, captulo 5. - Timer 0 Module, pgina 47. DataSheet PIC16F876(DS30292C) Microchip, captulo 13 - Instrution Set Summary, pgina 135.
40
Resumo
Construo de uma mquina de estados que implemente um semforo para automveis e pees.
Objectivos
Aprofundar os conhecimentos sobre timers. Implementao de uma mquina de estados por software.
Descrio
41
Guia prtico sobre microcontroladores PIC 3.1 Diagrama de estados - Semforo rodovirio
A gura 30 um exemplo de um diagrama de estados, que mostra a interaco entre os vrios estados propostos no trabalho prtico, este exemplica 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.
Estados S0 S1 S2 S3 S4 S5
vermelho_auto
amarelo_auto on
verde_auto on
vermelho_pees on on on
verde_pees
on intermitente on
42
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 gura 31 ).
Figura 31: Diagrama do circuito, semforo rodovirio 2. Desenvolvimento de um programa em assembly para controlo dos semforos, de acordo com o diagrama de estados da gura 30, que efectue a contagem de tempo na transio dos estados, com auxlio do timer 0. A tabela 4, dene o tempo mnimo que deve ser respeitado entre cada transio de estados. estados S0 S1 S2 S3 S4 S5 Tabela 4: Tempo minmo entre estados boto presso activo 1,5 1 4 3 1,5 t(segundos)
43
Elementos de Apoio
Manual terico da disciplina. DataSheet PIC16F876(DS30292C) Microchip, captulo 3. - I/O Ports, pgina 29. DataSheet PIC16F876(DS30292C) Microchip, captulo 5. - Timer 0 Module, pgina 47. DataSheet PIC16F876(DS30292C) Microchip, captulo 13 - Instrution Set Summary, pgina 135.
44
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 nal 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.
Objectivos
Compreenso da rotina de atendimento interrupo RSI ( Rotina de Servio de atendimento Interrupo ) descrita em exemplo; Construo de rotinas de atendimento interrupo. Gerao de interrupes atravs da linha de interrupo RB0/INT do PIC. Gerao de interrupes atravs da ag de overow TOIF do timer 0 do PIC, para refrescamento dos displays de 7 segmentos, e decremento da varivel contadora do relgio.
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: External RB0/INT pin, INTF. TMR0 timer overow, T0IF. PORTB<7:4> interrupt-on-change, RBIF.
45
Figura 32: Exemplo de uma interrupo A gura 32, representa o esquema simples de uma interrupo genrica. Antes da RSI propriamente 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. activar as interrupes globais, evitando assim interrupes recursivas. Para melhor compreender o conceito, mostra-se em exemplo da rotina de atendimento interrupo para o trabalho prtico 1, ver pgina 48.
3.1
Nos trechos de cdigo assembly seguintes, mostra-se em primeiro lugar o programa principal, inicialmente com a congurao dos registos TRISB e INTCON, cuja descrio pode ser encontrada nas pginas 16 e 39 respectivamente. De seguida o programa entra num ciclo innito forando a sada RB0 ao estado ON durante 0,5s e ao estado OFF durante 1s.
46
;-------------------------------------------------------------------; Rotina Main ;-------------------------------------------------------------------ORG 0x0005 main ;Aqui comea o programa principal ;----------------- I/O - InitCfg -----------------------------------; Bank1 ; DATA memory (RAM) Bank1 movlw b00000010 ; RB1 output movwf TRISB ; RB[7:2 & 0] inputs ;----------------- Interrupts enable bits --------------------------; Bank0 ; DATA memory (RAM) Bank0 bsf INTCON,GIE ; Global Int. Enable bit bsf INTCON,INTE ; External Int. enable bit ;-------------------------------------------------------------------; clrf PORTB ; Inicializao PORTB. clrf start_stop ; while_1 ; while(1) { btfsc start_stop,0 ; while (start_stop == 1) {} goto $-1 ; bsf movlw call bcf movlw call goto PORTB,RB1 25 Delay PORTB,RB1 25 Delay while_1 ; ; ; ; ; ; Set RB1 ON delay( 0,25 seg ) Set RB1 OFF delay( 0,25 seg )
; }
47
Trabalho a realizar
1. Modicar o programa (contador de 60s, verso II ) implementado em TP5, este deve agora implementar o START / STOP do relgio de 60 segundos, em qualquer altura da contagem decrescente. O diagrama do circuito pretendido, mostrado na gura 33.
48
Elementos de Apoio
Manual terico da disciplina. DataSheet PIC16F876(DS30292C) Microchip, captulo 3. - I/O Ports, pgina 29. DataSheet PIC16F876(DS30292C) Microchip, captulo 5. - Timer 0 Module, pgina 47. DataSheet PIC16F876(DS30292C) Microchip, captulo 12. - Special Features Of Tje Cpu, seco 12.10 - Interrupts, pgina 129. DataSheet PIC16F876(DS30292C) Microchip, captulo 13 - Instrution Set Summary, pgina 135.
49
NOTAS:
50
Resumo
Neste trabalho prtico, ser explorada a USART (Universal Synchronous Asynchronous Receiver Transmitter) do PIC16F876, no modo assncrono full duplex, na comunicao srie entre o PIC e o computador do laboratrio, atravs de um programa que implementa um terminal srie.
Objectivos
Compreenso dos passos de programao da USART, para recepo e transmisso de dados. Elaborao de rotinas para transmisso e recepo de um carcter. Elaborao de uma rotina para transmisso de um array de caracteres (strings).
Descrio
A USART, uma das duas portas de comunicao integradas no PIC16F876. Este circuito permite a congurao para comunicao sncrono ou assncrono, embora neste trabalho apenas estejamos interessados no modo de comunicao assncrona. Na comunicao com a USART cada bloco de dados composto por 8 bits (contudo pode ser utilizado um bit adicional para implementar um esquema de deteco de erros, de comunicao por vericao de paridade). O funcionamento da USART, denido atravs da programao de dois registos de controlo, TXSTA (registo de controlo/estado de transmisso) e RCSTA (registo de controlo/estado de recepo), mais detalhes ver pginas 55 e 56 respectivamente.
51
Guia prtico sobre microcontroladores PIC 3.1 Congurao dos pinos de transmisso/recepo
No modo assncrono, usa-se o pino (17) RC6 / TX / CK para transmisso de dados, sendo o pino (18) RC7 / RX / DT usado para recepo de dados. Para a USART funcionar correctamente, a entrada (linha RX), e a sada (linha TX) tm de ser denidos no registo TRISC, (ver congurao de um porto pgina 16). Assim, o bit 6 do porto C, denido em modo sada valor 0 e o bit 7 registo RCSTA, deve ser activado a 1.
Figura 34: Atribuio do porto srie
denido em modo entrada valor 1. Usando, RC6 e RC7 como porto para a USART, o bit SPEN do
3.2
A taxa de transmisso da USART, controlada pelo BRG (Baud Rate Generator). Esta denida pelo valor a colocar no registo SPBRG, este registo controla o perodo do sinal de sada de um free run timer de 8 bits. Em modo assncrono, o bit BRGH no registo TXSTA, usado para controlar a taxa de transmisso entre low speed e high speed, usar high speed na maioria dos casos vantajoso, uma vez que reduz a taxa de erro. As taxas de transmisso disponveis, para o PIC com uma FOSC de 20MHz esto descritas na tabela 5.
Taxa de transmisso (BAUD RATE) 9600 19200 28800 33600 57600 115200
52
no registo TXREG que so carregados os dados a transmitir, estes so depois enviados de forma automtica para o registo interno TSR e posteriormente transmitidos pelo porto TX. A transmisso de dados activada pelo bit TXEN do registo TXSTA. O bit menos signicativo (LSB, Least Signicant Bit), transferido em primeiro lugar. Uma vez transmitido o contedo do registo TXREG para TSR, o TXIF (bit indicador do estado do buffer em PIR1) sinaliza que o registo de transmisso da USART est vazio, tomando o valor 1. Os dados podem ser continuamente transmitidos, se primeiro fr detectada a sinalizao de TXIF, e de seguida fr efectuada uma escrita no registo TXREG. O TXIF no pode ser apagado por programao: automticamente forado a 0 quando os dados so movidos para TXREG;
Figura 35: Operao de transmisso assncrona Passos a seguir na congurao de uma Transmisso Assncrona.
1. Inicializar o registo SPBRG com a taxa de transferncia apropriada (ver tabela 5); 2. Activao da porta srie em modo assncrono, pondo a 0 o bit SYNC do registo TXSTA e a 1 o bit SPEN do registo RCSTA; 3. Por forma activar a transmisso o bit TXEN (registo TXSTA) activo a 1. Nessa altura o registo TXREG est em condies de ser escrito e o bit TXIF do registo PIR1 vem a 1; 4. Enviar os dados para o TXREG e comear a transmisso.
53
Os dados recebidos pela porta RX so recolhidos no registo RSR, atravs do circuito de recolha de dados (Data Recovery). Os dados so recolhidos pelo registo RSR, de acordo com a taxa de transmisso especicada pelo registo SPBRG e pelo bit BRGH do registo TXSTA (ver pgina 55). Aquando da deteco do stop bit, o contedo do registo RSR transferido para o registo RCREG. O bit RCIF do registo PIR1, toma o valor 1 quando os dados so escritos no registo RCREG, (sinalizando a recepo de nova informao). Os dados podem ser continuamente recebidos, se primeiro fr detectada a sinalizao e de seguida efectuar-se uma leitura do registo RCREG. O RCIF no pode ser apagado por programao, este 0 quando os dados so lidos de RCREG.
Figura 36: Operaco de recepco assncrona Passos a seguir na congurao na Recepo Assncrona.
1. Inicializar o registo SPBRG com a taxa de transmisso apropriada; 2. Activao da porta srie em modo assncrono, pondo a 0 o bit SYNC do registo TXSTA e a 1 o bit SPEN do registo RCSTA; 3. Permitir a recepo, activando o bit CREN do registo RCSTA; 4. Quando a recepo estiver terminada, a ag RCIF do registo PIR1 activado; 5. Para ler os oito bits recebidos, dever ser lido o registo RCREG.
54
bit 7
bit 6
bit 5
bit 4
bit 3 bit 2
bit 1
bit 0
55
bit 7
bit 6
bit 5
bit 4
bit 3
bit 2
bit 1
bit 0
56
Trabalho a realizar
1. Implementar um programa em assembly que permita a transmisso de 1 carcter, para o programa terminal do computador antrio (host computer terminal). 2. Implementar um programa em assembly que permita a recepo de 1 carcter, e posterior transmisso (atravs da rotina criada anteriormente) para o host computer terminal. 3. Implementar um programa em assembly que permita o envio de um array de caracteres, para o host computer terminal. Inicialmente o programa deve enviar para o terminal a string "Digite -> (p,i,e,x)?", e consoante o carcter seleccionado (premido), ser enviada para o terminal a string correspondente: (a) Quando recebido o carcter p enviada a mensagem "PIC - Ola, Mundo"; (b) Se recebido o carcter i ou e sero enviadas as strings respectivas s mensagens ora em Ingls ora em Espanhol. (c) Quando recebido o carcter x, ser enviada a mensagem "PIC - BYE BYE user". No entanto se um outro carcter for recebido, dever ser enviada para o terminal a mensagem seguinte "Caracter Invalido".
Elementos de Apoio
Manual terico da disciplina. DataSheet PIC16F876(DS30292C) Microchip, captulo 10. - Addressable Universal synchronous Asyncronous Receiver Transmiter (USART), pgina 95. DataSheet PIC16F876(DS30292C) Microchip, captulo 13 - Instrution Set Summary, pgina 135.
57
NOTAS:
58
Resumo
Converso A/D de valores de tenso (analgicos) provenientes de diferentes dispositivos. Interface atravs de sensor infravermelhos e potencimetro com visualizao de resultados em displays de 7 segmentos ou atravs do PC (terminal srie).
Objectivos
Introduo ao estudo do conversor A/D (ADC) do PIC. Implementao de um voltmetro digital bsico. Medio de distncias atravs de um sensor de infravermelhos.
Descrio
No processamento de sinais-analgicos h, muitas vezes, vantagem em os converter para sinais digitais, de modo a que possam se processados por um microprocessador. Os elemento que efectua a converso de um sinal analgico num digital (um valor numa determinada voltagem) designado por "conversor analgico digital" ADC. O PIC16F876 dispe de uma ADC de 10 bits, o que signica que o resultado pode ser representado com uma resoluo de 1/1024 gama mxima. possvel distinguir valores com cerca de 5mV de resoluo aproximadamente (5/1024 = 0.004883), supondo que a gama mxima de valores a medir de 5V, ou seja toda a gama entre 0V..5V.
3.1
Entrada Analgica
No PIC16F876, podemos seleccionar como entrada analgica, por programao 1 dos 5 canais disponveis (entradas RA0 - RA5, excepto RA4). O registo ADCON1 congura as linhas RA0 - RA5 (execpo RA4) do PIC como entradas analgicas/digitais ou referncia; a entrada seleccionada deve
59
3.2
O par de registos ADRESH e ADRESL de 8 bits cada, forma o local onde so colocados os 10 bits do resultado da converso, estes registos formam assim em conjunto um registo de 16 bits. A ADC, implementa duas formas no modo como formata o resultado de 10 bits nos registos ADRESH e ADRESL, justicado este ora esquerda ou direita (restantes bits extra so carregados a 0), ver gura 39. A seleco do formato feita pelo bit ADFM do registro ADCON1, os bits , .
60
O condensador de amostragem (CHOLD) do mdulo conversor A/D, carregado pela tenso aplicada entrada analgica. A tenso de CHOLD convertida para valores digitais atravs do conversor A/D. Uma vez que o condensador no carrega instantaneamente, necessrio aguardar um certo tempo, designado por tempo de HOLD, aps a seleco da entrada analgica pretendida nos bits CHS0-3 do ADCON0 (ver pgina 63). Uma vez que este tempo no implementado por hardware, da responsabilidade do programador implementar no programa um tempo de espera de aproximadamente 20s, entre a seleco da entrada analgica e o inicio da converso A/D. Durante este tempo, o CHOLD est desligado da entrada analgica. A converso A/D iniciada quando o bit GO do registo ADCON0 activado a 1. Quando a converso acaba o bit GO reposto a 0 por hardware. Existem duas maneiras de detectar o m de converso da ADC, a primeira atravs de polling ao bit GO at este ser 0, a segunda mais elegante, atravs de uma interrupo global. No caso de usar interrupes, o bit ADIE do registo PIE, assim como o bit do GIE do registo INTCON, devem estar activos a 1. Quando o m de converso for detectado, o bit ADIF do registo PIR1 activo 1 e a interrupo global ocorre. A gura 61 mostra o circuito no qual o condensador CHOLD carregado por VA. CHOLD carregado quando o interruptor (SS) fechado. O dodo foi colocado por proteco no sentido de evitar situaes de tenso superiores a VDD ou inferiores a VSS na entrada analgica.
Legenda: CHOLD: Condensador de amostragem / reteno ( 120pF ) RSS: Resistncia de amostragem ( cerca de 7K-ohm a VDD=5V ) SS: Interruptor RIC: Resistncia de ligao ( =<1K-ohm )
61
3.4
1. Congurao do conversor A/D ( Processo inicial) Congurao das entradas analgicas / tenso de referncia / I/0 digital ADCON1/PCFG0-3. Seleco do clock de converso da ADC, ADCON0/ADCS0-1 Ligar o conversor A/D, ADCON0/ADON 2. Congurao do canal de entrada Seleco do canal de entrada, ADCON0/CHS0-2 3. Tempo guarda de carga do condensador CHOLD Aguardar at o CHOLD esteja completamente carregado, aprox. 20s 4. Incio da converso Activar o bit GO, ADCON0/GO = 1 5. Aguardar o m de converso da ADC Fazer polling ao bit GO at que este seja 0 6. Leitura do resultado da converso A/D Ler o resultado no par de registos, ADRESH,ADRESL 7. Para a prxima converso, ir para item 1 ou 2 como desejado
62
bit 7-6
bit 5-3
bit 2
A/D completada).
bit 1 bit 0
63
bit 7
bit 6
64
Trabalho a realizar
1. Construo de um voltmetro digital simples. Este voltmetro faz a leitura de uma tenso elctrica entre 0V e 5V apresentando o resultado da converso A/D, nos displays de 7 segmentos. O valor convertido axado com um casa decimal (0.0 a 5.0V). De modo a implementar esta funcionalidade, deve-se programar a ADC com os seguintes parmetros: entrada analgica RA0, seleco do clock do conversor A/D = FOSC/32, resoluo de 8 bits na sada. NOTA: Uma vez que a escala de valores retornados da ADC [0..255], deve implementar uma mudana de escala para valores entre [0..50]. Implementao de uma rotina de hexadecimal decimal, de modo a poder axar nos displays de 7 segmentos o valor convertido.
Figura 41: Diagrama do circuito do voltmetro digital, visualizao com displays 7 segmentos 2. Finda a parte 1 do trabalho prtico, o passo seguinte alterar o programa anterior, de modo a que seja possvel o envio dos valores de tenso atravs da porta srie, para o PC.
65
66
Apendix A
Figura 43: Mapa de memria RAM, registos do PIC e registos de uso geral
67
68
Apendix B
; Ttulo : ; MPLAB IDE programa de demonstrao ; ; Resumo: ; Led pisca-pisca (DUTTY CYCLE varivel) ; ; ___________ ; | | ; | PIC16F876 | ; | | ; | | /-----\ RES ; | |->-- RB0 ------| LED |------\/\/\/---- 0V ; | | \-----/ ; |___________| ; ; figura 1. esquema de ligao PIC. ; ; ON (T1)| OFF (T2) | ON (T1) ; _______ _______ ; | | | | ; led _______| |_____________| |__________________ ; ; ; figura 2. diagrama temporal da sada. ; ;******************************************************************** ; * ; Nome ficheiro: exemplo.asm * ; ltima alterao: 24/Junho/2005 * ; * ; Autor: Prof. Jos Lus Azevedo * ; * ; Modificado por: Jos Miguel Oliveira Gaspar * ; Olmpia Rodrigues * ; * ; Universidade de Aveiro * ; Seminrio EEI 2004/2005 * ; * ;******************************************************************** ; *
69
#include "p16f876.inc"
; 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 T1 EQU 50 ; Gama [1..255] = [10ms..2,5s] T2 EQU 100 ; ;---------------------------------------------------------------------; Variveis (REGISTOS DE USO GERAL) Bank0 ;---------------------------------------------------------------------group1 iDATA ; dados inicializados delay_mult RES 1 ; Variaveis de controlo delay_k50 RES 1 ; dos loops da rotina Delay delay_k200 RES 1 ; ;--------------------------------------------------------------------
errorlevel -302
70
Apendix B
; Macros to select the register Banks ;-------------------------------------------------------------------Bank0 MACRO ; Macro to select data RAM Bank 0 bcf STATUS,RP0 bcf STATUS,RP1 ENDM Bank1 MACRO bsf STATUS,RP0 bcf STATUS,RP1 ENDM MACRO bcf bsf ENDM MACRO bsf bsf ENDM ; Macro to select data RAM Bank 1
Bank2
Bank3
;******************************************************************** Reset_vector 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 ; Bank0 ; DATA memory (RAM) Bank0 clrf PORTB ; Inicializao PORTB. loop ; while(1) { bsf PORTB,RB0 ; Set (ON) LED in RB0 ON movlw call T1 Delay ; W(reg) = 50 ; delay( 0,5 seg )
71
;********************************************************************
;************************** ROTINAS ********************************* ;******************************************************************** ;******************************************************************** ;===================================================================; ; Delay ; ; Pode gerar delays entre 10 mS e 2,5 S ; ; O valor de entrada e passado em W (1..255) ; ; Retorna em Bank0 ; ; ; ; Notas: o loop base e de 1 uS (T=200 nS <=> 4*1/20MHz) ; ; ; ;===================================================================; 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 ;
72
Apendix B
; Trabalho n 1 ; Implementao de um led pisca-pisca, em RB1 ; com boto on/off por INTERRUPO ; ; Objectivos: ; Introduo s Interrupes EXEMPLO ; ; Observaes: ; ;******************************************************************** ; * ; Nome ficheiro: trab1Int.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 radix p=16f876 decimal ; list directive to define ; processor ; ; ; ; processor specific variable definitions Turn off banking message known tested (good) code
;-----------------------------------------------------------------------------; Constantes ;-----------------------------------------------------------------------------RA0 RA1 RA2 RA3 RA4 RA5 RB0 RB1 EQU EQU EQU EQU EQU EQU EQU EQU 0 1 2 3 4 5 0 1
73
;---------------------------------------------------------------------; Variveis (REGISTOS DE USO GERAL) ;---------------------------------------------------------------------variaveis UDATA 0x20 delay_mult RES 1 ; Variaveis de controlo dos loops delay_k50 RES 1 ; da rotina Delay delay_k200 RES 1 ; start_stop w_save status_save pclath_save RES RES RES RES 1 1 1 1 ; SAVE W ; SAVE STATUS REG ; SAVE PCLATH REG
;-------------------------------------------------------------------; Macros to select the register Banks ;-------------------------------------------------------------------Bank0 MACRO bcf bcf ENDM MACRO bsf bcf ENDM MACRO bcf bsf ENDM ; Macro to select data RAM Bank 0 STATUS,RP0 STATUS,RP1
Bank1
Bank2
74
Apendix B
Bank3 MACRO bsf bsf ENDM ; Macro to select data RAM Bank 3 STATUS,RP0 STATUS,RP1
;******************************************************************** ; Processor reset vector ; Ensure page bits are cleared ; Go to beginning of program ; Processor Interrupt Vector ; Go to interrupt service ; rotine ;-------------------------------------------------------------------; Rotina Main ;-------------------------------------------------------------------ORG 0x0005 main ;Aqui comea o programa principal call InitCfg while_1 ; while(1) { btfsc start_stop,0 ; while (start_stop == 1) {} goto $-1 ; bsf movlw call bcf movlw call goto PORTB,RB1 25 Delay PORTB,RB1 25 Delay while_1 ; Set RB1 ON ; ; delay( 0,25 seg ) ; Set RB1 OFF ; ; delay( 0,25 seg ) ; } ORG clrf goto ORG goto 0x0000 PCLATH main 0x0004 interrupt_start
;********************************************************************
;************************** ROTINAS ********************************* ;******************************************************************** ;******************************************************************** ;===================================================================; ; InitCfg ; ; Configurao inicial dos registros associados ; ; ao programa principal, PORTOS I/O, Timer0, INTERRUPTS. ; ; ; ; Retorna em Bank0 ; ; ; ; Notas: ; ;===================================================================; InitCfg
75
76
Apendix B
;******************************************************************** ;******************************************************************** interrupt_start movwf w_save ; salvaguarda do W reg. swapf STATUS,W ; clrf STATUS ; DATA memory (RAM) Bank0 movwf status_save ; salvaguarda do STATUS reg. movf PCLATH,W ; movwf pclath_save ; salvaguarda do PCLATH reg. clrf PCLATH ; pgina 0, de memria de ; programa bcf INTCON,INTF ; reset, do bit INTF incf start_stop,w ; andlw 0x01 ; movwf start_stop ; toggle do start_stop (0/1) ; interrupt_end movf pclath_save,w; restauro do PCLATH reg. movwf PCLATH ; swapf status_save,w; restauro da DATA memory (RAM) ; Bank? inicial movwf STATUS ; swapf w_save,f ; restauro do W reg. swapf w_save,w ; retfie END
77