FUNDAÇÃO ESCOLA TÉCNICA LIBERATO SALZANO VIEIRA DA CUNHA
CURSO DE ELETRÔNICA ELETRÔNICA DE POTÊNCIA
INTRODUÇÃO A PROGRAMAÇÃO C PARA MICROCONTROLADORES
MICROCHIP
Augusto Mombach
APRESENTAÇÃO
A presente apostila surgiu da necessidade do professor de Eletrônica de Potência aprender os conceitos básicos de programação de dispositivos de controle de potência. Tendo em vista que, praticamente todos os controles, são realizados por dispositivos programáveis e dentre esses os micro controladores se destacam, pela sua flexibilidade no uso e aplicações e considerando também que a programação, com uma grande variedade de aplicações e de uso por dispositivos de variadas marcas é a programação em “ C”, desenvolvemos esta apostila que pretende dar uma base teórico-prática para a programação e uso de micro controladores PIC utilizando os programas integrados , MPLB IDE V8.xx, CCS e HI-Tech software, muito utilizados na escola.
Os programas exemplo ficarão a disposição na página do Prof. Irineu, bem como esta apostila. Sugestões de aprimoramento serão sempre bem vindas.
Os exemplos básicos são variados e focados para o controle de dispositivos que se relacionam com eletrônica de potência.
Esta apostila deverá receber melhoramentos ao longo do tempo com exemplos de programas desenvolvidos por alunos e professores do Curso de Eletrônica da Fundação Liberato Salzano Vieira da Cunha.
1. MICROCONTROLADORES – CONCEITOS BÁSICOS
1.1. Microcontrolador: é um dispositivo eletrônico capaz de ser programado eletronicamente através de software específico com o objetivo de realizar operações lógicas e aritméticas que serão utilizadas para o controle de dispositivos ligados ao mesmo (periféricos), tais como, botões, led´s, displays, componentes eletrônicos como por exemplo integrados dos mais variados tipos, SCR´s, transistores, etc.
Em nosso caso específico usaremos um Microcontrolador da família PIC (Peripheral Integrated Controller), da empresa americana Microchip (http://www.microchip.com/).
Um Microcontrolador é um componente diferenciado de um microprocessador tendo em vista que possui uma série de “periféricos internos” tais como memórias, geradores de PWM (de uso em eletrônica de potência) entradas e saídas analógicas e digitais (conversores A/D e D/A) que normalmente em um microprocessador estariam como periféricos (externos) ao mesmo. Poderíamos de forma resumida concluir que um Microcontrolador, tem internamente, “ como cérebro” um microprocessador. 1.1.1. ESTRUTURA BÁSICA DOS PIC´S UTILIZADOS NO CURSO
1.1.2. PIC 16F690
Internamente possui todos os dispositivos típicos de um sistema micro processado, a começar com uma CPU (Unidade Central de Processamento), cuja finalidade é interpretar as instruções de programa. Uma memória PROM (Memória Programável somente para Leitura) na qual irá memorizar de maneira permanente as instruções de programa. Uma memória RAM (Memória de Acesso Aleatório) para memorizar as variáveis utilizadas no programa. Uma série de linhas de entrada e saídas nominadas de “I/O” para controlar dispositivos externos ou receber pulsos/sinais de sensores, chaves, etc. Dispositivos auxiliares ao seu funcionamento como geradores de clock, barramentos (bus), contadores e outros.
Este é o pic utilizado no Curso de Eletrônica como básico para o aprendizado de programação. Na figura 2 estão enumerados e descritos os 20 pinos deste Microcontrolador. A descrição dos pinos, bem como a função dos pinos pode ser visualizada na tabela da figura 3 e 4 a seguir.
Figura 3 - Tabela com a nomenclatura e função do pinos do pic16F690
Continuação da tabela de descrição da pinagem e função dos pinos.
Figura 4 - Tabela com a nomenclatura e função dos pinos do pic16F690 – continuação
Figura 5 - diagrama de blocos do PIC 16F690
Então, de acordo com a figura 5, podemos visualizar que para este PIC, entre outras I/O temos três temporizadores, três portas (PORTA, PORTB, PORTC) de entrada e saída, etc.
Também é possível visualizar os diferentes barramentos e como é feita a comunicação entre as diversas partes do Microcontrolador através dos mesmos.
Na figura 6 estão os endereços dos registradores de funções especiais.
Figura 6 - Registradores de funções especiais
1.1.3 PIC 16F877A (Base para este texto: versão 40 pinos)
Figura 7 Recursos do PIC16F877A
USART. Conversores analógicos/digitais de 10 bits e comparadores analógicos. Módulos CCP : capture, Compare e PWM (importante em eletrônica potência).
A estrutura interna do micro controlador pode ser visto na figura 9 e pode ser comparada com a versão anteriormente apresentada.
Figura 9 - Diagrama de blocos do PIC16F877A
Figura 10 - Funções dos pinos 1
Figura 12 - Mapa dos registradores do PIC 16F877
Exercícios:
1- Quais as principais diferenças entres os dois microcontroladores apresentados? Verifique, na internet, os preços dos dois tipos para a comparação
2- O que limitaria o uso de um ou o outro?
1.2.COMPONENTES BÁSICOS DA ARQUITETURA DOS MICROCONTROLADORES PIC 1.2.1. UNIDADE LÓGICA E ARITMÉTICA (ULA)
É onde todas as operações lógicas e aritméticas (soma e subtração) são efetuadas. Normalmente o registrado W estará envolvido nestas operações. Observe as figuras dos diagramas de blocos dos microcontroladores: O destino destas operações podem ser o registrador W (Work Register) ou um registrador definido no argumento da instrução (memória de dados)
1.2.2. CICLOS DE MÁQUINA
Nos microcontroladores PIC o sinal de frequência de clock externo é dividido, internamente por quatro. O período deste sinal interno define o tempo que definimos ciclo de máquina. Então para um sinal de clock externo de 4MHz, o período do sinal de clock interno será de 1µs (fclock= 4MHz/4=1Mhz, logo o período T=1µs). O CICLO DE MÁQUINA É CONSIDERADO COMO 4 PERÍODOS DE CLOCK INTERNO, isto está ilustrado na figura 13.
Figura 13 - Conceito de ciclo de máquina
Esta divisão é assinalada com as letras Q1, Q2, Q3 e Q4. O o contador de programas é incrementado na fase Q1 (PC, PC+1, PC+2, etc). A instrução seguinte é buscada na memória de programa e armazenada no registrador de instruções no ciclo Q4. Ela é decodificada e executada no próximo ciclo, entre Q1 e Q4. Essa característica de buscar a informação em um ciclo de máquina e executa-la no seguinte é chamada de PIPELINE, portanto as informações são executadas em um ciclo de máquina, com exceção de saltos (desvios) que ocorrem no programa em execução. Neste caso será necessário dois ciclos de máquina.
1.2.3. MEMÓRIA DE PROGRAMA
A memória de programa é o local onde as instruções do mesmo são armazenadas. No caso do 16F877A esta memória é de 8192 palavras (word) ou 8kB e de 14 bits cada uma. Parte destes 14 bits formam o OPCODE (Operation Code) e o restante o argumento da instrução.
Existe ainda a pilha (Stack), que é um local separado da memória de programa onde são armazenados os endereços de retorno quando é usado instruções de chamadas de rotina.
1.2.4. MEMÓRIA DE DADOS
A memória de dados é uma memória volátil tipo RAM, que de forma sucinta podemos dividir da seguinte forma: Os registradores especiais (Special Function Register – SFR) e os registradores de uso geral (General Purpose Register – GPR). Como o ponteiro de memória de programa tem a capacidade de endereçar somente 128 posições de memória de cada vez (7 bits), a memória de programa é dividida em bancos (1, 2, 3 e 4 no 16F877A – veja a figura 12), isto implica que posições de memória somente poderão ser acessadas caso o banco a que ela pertença seja previamente indicado através de um bit específico do SFR: STATUS. Tal situação pode ser vista na figura 14.
1.2.5. INTERRUPÇÕES
As interrupções são eventos que ocorrem a qualquer momento (eventos assíncronos) que causam um desvio no processamento. Este desvio tem como destino o vetor interrupção. Depois de atendidas as requisições que ocasionaram a interrupção o programa volta ao seu caminho original onde parou. Uma analogia pode ser feito quando uma pessoa está, por exemplo, almoçando (rotina principal) e toca o telefone. Ela interrompe o almoço para atender a chamada. Ao término desta volta a almoçar.
As interrupções no PIC podem ocorrer por vários motivos como TIMERS(3), fim de escrita na EEPROM, comparador, USART(2), além de interrupções externas, geradas por sinais externos que são conectados a portas específicas do Microcontrolador. Isto pode ocorrer para reconhecer que um botão foi pressionado, por exemplo. O reconhecimento pela porta pode ser feito pela borda de subida ou descida do sinal.
1.2.6. PORTAS
Estes registradores servem para configurar os pinos das portas como entrada ou saída. Quando é colocado ´1´ em um bit do TRIS, o pino relacionado a ele é considerado uma entrada (1->Input). Quando é colocado ´0´ no mesmo bit do registrador o mesmo será considerado uma saída (0->out). Para configurar a porta A deve ser utilizado o TRIS A, a porta B o TRIS B, e assim por diante.
As portas A, B, C e D (no PIC16F877A) são denominadas PORTS (PORTA, PORTB, PORTC E PORTE. Nestas portas deveremos ter como entrada ou saída o nível lógico correspondente a instrução de um programa ou uma tensão (ou corrente com os devidos valores máximos e mínimos permitidos).
1.2.7. CONTADORES
O PIC possui internamente um recurso denominado TIMER. No PIC há vários temporizadores (no PIC 16F877A há o TIMER 0, TIMER 1 e o TIMER 2). O Timer 0 (zero) é um contador interno de 8 bits incrementado pelo ciclo de máquina ou por um sinal externo (pela borda de subida ou descida), sendo esta opção feita por software durante a programação. Se o ciclo de máquina é de 1 µs cada incremento do timer corresponderá a um intervalo de tempo de tempo de 1µs. Se necessário intervalos de tempos maiores para o mesmo ciclo de máquina, utilizamos o recurso do PRE-SCALE.
O PRE-SCALE é um divisor de frequência programável do sinal que incrementa o TIMER 0. Quando o pre-scale é de 1:1 cada ciclo de máquina corresponde a um incremento do TIMER 0. Ao alterarmos o pre-scale para, por exemplo 1:4, o TIMER 0 será incrementado uma a cada quatro ciclos de máquina. O TIMER 0 poderá ter 2n até 256 divisões do pre-scale, isto é 1/2n.
1.2.8. PARÂMETROS DE CONFIGURAÇÃO
- Tipos de oscilador: Internos e externos. Os osciladores internos podem ser de 32kHz ou 4MHz. A seleção é feita por software.
Osciladores externos:
RC_CLKOUT, para oscilador externo tipo RC com pino 15 operando como CLKOUT, isto é, com uma onda quadrada com ¼ da frequência;
RC_I/O, para oscilador externo tipo RC com o pino 15 operando como I/O(RA6); INTSC_CLKOUT, para oscilador interno com o pino 15 operando como I/O (RA6); EC_I/O para clock externo com pino 15 operando como I/O (RA6);
XT para osciladores externos tipo cristal ou ressoadores;
HS para cristais ou ressoadores externos com frequência elevadas (acima de 4MHz);
LP para cristais ou ressoadores externos com baixas frequências (abaixo de 200kHz), utilizados para minimizar consumo.
WATCHDOG (WDT) consiste em um contador que é incrementado por sinal de relógio (independente), de tal forma que este contador ao atingir sua contagem máxima retorna a zero e quando isso acontece o sistema todo é “ressetado”, indicando que há falhas. Se o sistema estiver funcionando de forma correta, de tempos em tempos uma instrução denominada clear wachtdog timer (CLWDT) zera o valor do contador, impedindo que o mesmo chegue ao seu valor máximo. Isto só irá ocorrer se houver um erro de processamento no sistema em questão.
POWER UP TIMER é um temporizador que faz com que o PIC aguarde alguns ciclos de máquina (72ms) para garantir que todo o sistema periférico 9displays, teclados, memórias, etc) estejam operacionais. Isto ocorre ao ligar o sistema.
BROWN OUT DETECT monitora a diferença de tensão elétrica entre os pinos de VDD e VSS, provocando a reinicialização do PIC quando esta diferença cai para um valor abaixo do mínimo definido para o mesmo (cerca de 4V) por cerca de 100µs. Quando isso ocorre haverá a reinicialização do PIC.
LOW VOLTAGE PROGRAM programação do PIC (em memória) em baixa tensão elétrica (5V). CÓDIGO DE PROTEÇÃO quando há a necessidade de proteção por “encriptação” do programa gravado no PIC.
1.2.9. CONFIGURAÇÃO DO PROGRAMA - DIRETRIZES Diretriz geral: _CONFIG
Tabela 1 - Configurações em assembler coluna 1 (PIC16F877A) –C para compilador CCS coluna 2 – C para compilador HITECH coluna 3
Assembler CCS HITECH
_CONFIG #fuses __CONFIG
_CP_ON – code protect ligado PROTECT CP_ON
_CP_OFF – desligado NOPROTEC CP_OFF
_DATA_CP_OFF – acesso externo a EEPROM desligado
NOCPD CPD_OFF
_DATA_CP_ON – ligado CPD CPD_ON
_PWRTE_ON – Power UP ligado PUT PWRTE_ON
_PWRTE_OFF – desligado NOPUT PWRTE_OFF
_WDT_ON – WatchDog ligado WDT WDTE_ON
_WDT_OFF – desligado NOWDT WDTE_OFF
_LVP_ON - programação em baixa tensão ativado
LVP LVP_ON
_LVP_OFF - desligado NOLVP LVP_OFF
_MCLRE_ON – Mater clear externo ativado
MCLRE_ON
_MCLRE_OFF – desligado MCLRE_OFF
_RC_OSC_CKOUT para RC externo com saída CKOUT
OSC_INTRCCLK _RC_OSC_NOCKOUT para RC
externo sem saída (com I/O)
FOSC_INTRCIO _EXTCLK_OSC para clock externo
sem saído CKOUT (com I/O)
FOSC_EXTRC _LP_OSC uso de cristal de baixa
frequência
LP FOSC_LP
_XT_OSC uso de cristal ou ressoadores externos
XT FOSC_XT
_HS_OSC uso de cristal de alta frequência
HS FOSC_HS
Exemplo: _CONFIG _CP_ON&_PWRTE_ON&WDT_OFF&INTOSC_OSC_NOCKOUT Exemplo (para o CCS): #fuses NOPROTECT,PUT,NOWDT,HS
Exercício:
Dada as linhas de configuração acima, traduza as mesmas, esclarecendo o que foi configurado em linguagem corrente.
2. PROGRAMAÇÃO DO PIC
Figura 15 - Carateres em ASCII
Uma vez preparado o nosso código em C (ou assembler), é necessário uma ferramenta de software que traduza o programa em linguagem C para uma linguagem que o PIC entenda (linguagem de máquina de zeros e uns que irão compor as instruções chamadas de OP CODE), este programa se chama compilador assembler ou assemblador. Aqui será usado o CCS e o HITECH.
Figura 16 - Esquema de blocos de compilação
2.1.CRIAÇÃO DE UM PROJETO COM O MPLAB
O MPLAB deve ser baixado e instalado em seu computador (computador da escola). Quando o mesmo é iniciado deverá apresentar uma tela conforme a figura 17 a seguir.
Figura 17 - Tela de abertura do MPLAB v8.76
A seguir um novo projeto deve ser criado, para isso é utilizado o assistente (wizard) do programa. Ele se encontra no menu Project/Project Wizard, conforme figura 18.
Figura 18 - Iniciando um projeto com o Wizard
Figura 19 - Janela do Project Wizard
A seguir clique em avançar e escolha o dispositivo (device). É o primeiro passo (step one).
Figura 20 - Escolha do PIC (select device)
Figura 21 - Escolha do compilador
Logo em seguida deveremos nomear e guardar (salvar) o novo projeto em algum lugar (arquivo) do computador, ou no caso de já ter algum projeto que necessita de reparos ou complementação o mesmo poderá ser aberto, assim a tela que aparecerá deverá ser semelhante a da figura 22.
Figura 22 - Arquivando o novo projeto
Figura 23 - Criando um novo projeto e salvando o mesmo
Figura 24 - Verificando os arquivos já existentes para eventual complementação ou correção
Precisamos agora escrever o programa para que os códigos de máquina sejam gerados, isto é devemos ter um ambiente de software onde esteja disponível um processador de texto para o programa a ser digitado e utilizando este mesmo espaço possamos compilar o mesmo. Isso é feito, clicando no menu File/ New, deverá então abrir uma janela conforme a figura 26.
Figura 26 - Local para a digitação do novo programa
O programa poderá ser escrito em linguagem C no processador de textos disponibilizado e depois salvo, no entanto é vantajoso salvar primeiramente o arquivo em branco (Untiled verifique que escrevendo nesta tela a cor das letras, elas são pretas). Para isso no menu File, clique em Save. Não se esqueça de dar um “nome.c” (com extensão C). Escreva agora, para testar, na tela, verifique que agora o próprio software organiza (com cores) o programa a ser digitado.
Agora é necessário adicionar o arquivo ao projeto em questão, pois as pastas que estão associadas ao projeto estão vazias, isto é feito clicando com o botão direito do mouse sobre a pasta Source Files e com o botão esquerdo clique em add files.
Figura 28 – Adicionando o programa a pasta “Source Files”
Para se exercitar com o ambiente do MPLAB o programa a seguir deve ser copiado e então colado na tela Untitled (figura27) que é o processador de texto do MPLAB. Todos os procedimentos colocados nas figuras anteriores devem ser feitos:
#include <16f877a.h> //introduz o cabecalho: qual o pic a ser utilizado
#use delay(clock = 20000000, RESTART_WDT)// define o clock do processador
#fuses hs,nowdt,noprotect,put,brownout,nolvp,nocpd, nowrt //fuses=bits de
configuracoes, no caso hs=cristal de alta frequencia. nao habilita wacht dog. nao codifica o programa. put=espera o cristal estabilizar. forca o reset se oscila a alimentacao. nolvp. etc. Veja: "configure -> Configuration Bits" no menu
#use fast_io(a)//todas as entradas e saidas sao digitais
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#byte porta = 0x05 //atribui o endereco 05H a porta a, embora ja seja este o endereco, facilita na programacao pois apenas eh necessario se referir ao porta (sem endereco)
#byte portb = 0x06
#byte portc = 0x07
#byte portd = 0x08
#byte porte = 0x09
#bit botao = portd.0 //a variavel "botao" eh atribuido a I/O portd.0
#bit led = portc.0
void main () //eh a funcao principal:todo o programa ira rodar entre a primeira linha depois da chave e a ultima linha antes da chave final
{
set_tris_a(0b11111111); // seta o port a (08 bits) como entrada (I->1 em binario : b)
set_tris_b(0b11111111);
set_tris_c(0b00000000); // todos foram configurados como saida, tendo em vista a minha placa de programaco
set_tris_d(0b11111111); //todos botoes (na placa) portanto podem ser considerados entrada
set_tris_b(0b00000101); // sao considerados apenas os tres ultimos algarismos
porta = 0x00; //zera inicialmente o dados da porta -> notacao em hexadecimal
portb = 0; //zera inicialmente o dados da portb -> notacao em decimal
portc=0b00000000; //zera inicialmente o dados da portc -> notacao em binario
portd=0x00; //zera inicialmente o dados da portd -> notacao em hexadecimal
porte=0x00; //zera inicialmente o dados da porte -> notacao em hexadecimal
while (TRUE)//enquanto a condicao entre pareteses for verdadeira, no caso sempre, o programa ira fazer o que esta entre as proximas chaves
RESTART_WDT();
if(botao)// condicao se(if) botao eh precionado)led=1, se nao led igual a zero _> tentar com !botao (negacao da condicao
led=1;
else
led=0;
}
}
O programa digitado acima serve para ligar e desligar um LED pressionando um botão. Neste estágio não temos nenhuma preocupação com o circuito eletrônico real, a idéia agora é o uso do MPLAB. Este é o nosso “projeto00”. Ele está pronto e irá funcionar no PIC16F877A.
Iremos agora discorrer sobre alguns procedimentos que sempre deverão ser feitos ao programar o PIC.
Você pode verificar que após a linha de programa, existe quase sempre “//” logo a seguir há uma explicação do que faz aquela linha de comando. Neste primeiro exercício há um exagero de “//”, pois é o nosso primeiro programa, no entanto, muitas vezes para uma linha de programa complicada é necessário escrever um comentário para lembrar, mais adiante o que deve fazer o programa naquela linha.
Então, ao programarmos em C, o programa irá ignorar o que existe após as “//”, e assim poderemos digitar ali o nosso comentário.
Então, seguindo uma sequência, a partir do cabeçalho, temos: # include <16f877A.h>
É especificado (diretiva) ao programa que anexe o arquivo de cabeçalho 16f877A.h. Este arquivo contém definições para símbolos, variáveis, tipos e funções úteis ao programa relativa ao Microcontrolador 16F877A.
#use delay(clock = 20000000, RESTART_WDT)
#use também é uma diretiva, especifica ao programa o valor da frequência de clock que é utilizado. Neste caso 20MHz.
É a configuração dos “fusíveis” (bits de configuração). xt significa que o oscilador é de cristal (externo) e é de alta frequência (hs -> f >4Mhz).
Não está acionado o WATCHDOG (nowdt), os códigos de programação neste caso estão acessíveis ou não protegidos (NOPROTEC), O programa será inicializado após 72ms do momento em que o pino MCLR ser colocado em nível alto, pois o PUT (power up timer) está setado. Se a tensão de alimentação cair ou oscilar o microprocessador será ressetado (brownout). Não está habilitada a programação com baixo consumo de energia, pois está setado nolvp (no low voltage programming). A proteção da EEPROM está desabilitada (nocpd) e finalmente a proteção da escrita em memória do programa também está desabilitada (nowrt).
A diretiva #usexxx_IO define como o compilador gerará o código para as instruções de entrada e saída. Ele terá efeito até que uma nova diretiva seja encontrada no decorrer do programa. Este é o método rápido de configurar as mesmas através de outra diretiva a instrução set_tris_X( ). Em nosso exemplo todas as entradas e saídas serão digitais.
#byte porta = 0x05 Atribui o endereço de memória (em hexadecimal) 0x05 a porta A. Embora seja esse o endereço da porta segundo o data sheet do PIC 16F877A ao fazermos isso, na programação basta referenciar a porta como “porta”, sem necessitarmos, toda a vez indicarmos o endereço. Quando escrevemos o endereço o mesmo pode ser escrito em binário, hexadecimal ou decimal, como o mostrado inicialmente no texto.
#bit botao = portb.0 é definida uma variável “botao” e ela estará na porta b (portb) bit 0. Veja figura 9.
#bit led = portc.0 foi definido uma variável chamada “led” que está vinculada ao pino 0 da porta c (portc.0).
void main() define uma função principal. É padronizada na linguagem C. Define o corpo principal do programa, que ficará entre as chaves definidas por este comando.
set_tris_a(0b11111111), define como serão considerados os pinos de entrada e saída das portas. O 1 será entrada (Input) e 0 (Output) saída. Neste caso todos os pinos da porta a são considerados como entrada de sinal. Como ficou definido anteriormente que as portas de entrada e saída (I/O) serão digitais, então na porta a teremos todos os pinos como entrada de dados. Este comando será utilizado juntamente com #use fast_io(x) e #byte portx=0xzz(hexadecimal).
portx=0x00, todas as portas são, inicialmente, zeradas (em hexadecimal).
if é um condicional (se) é utilizado para avaliar a condição que está entre parêntesis. Enquanto essa condição for verdadeira o comando continuará a ser executado. Em caso de ser falso (else) o comando, depois da instrução else, será executado.
Exercício: Agora. Com base nos comentários acima, descreva o programa em questão em linguagem corrente coloquial. Faça isso linha a linha.
3. SIMULANDO O PROJETO NO MPLAB SIM
Os projetos desenvolvidos podem ser, antes de montados, simulados com uma ferramenta de simulação que já está dentro do MPLAB, o MPLAB SIM. Assim poderemos verificar se há erros de programação, e também verificar os estados das diferentes portas, verificando se o projetado, irá funcionar na forma de circuitos eletrônicos, que certamente deverá ser montada a seguir.
Para fazer uso deste recurso o projetista deverá no menu Debugger/Select Tool clicar em MPLAB SIM, como mostra a figura 29.
Figura 29 - Iniciando o simulador
Figura 30 - Compilando o projeto
Assim que o programa é compilado surge a tela “output” dando um resumo do que ocorreu na compilação e finalizando com o número de erros (0 Errors) e os avisos da mesma.
Figura 31 - Apresentando os resultados da compilação
Exercícios:
2- Escreva apalavra Liberato depois da linha de programa while, por exemplo while (TRUE) liberato, ou while (liberato>100), ou (while TRUE=0), etc. Observe em cada caso o ouput.
Figura 32 - Botões de controle do MPLAB SIM
Descrição sumária dos botões: Run: executa o programa; Halt(Parar): Para a simulação;
Passo a passo: Roda o programa linha a linha e indica a posição com uma seta lateral a esquerda do programa;
Step Into: Executa a linha e se houver uma função entra na mesma;
Step Over: Executa a Linha, e se houver uma função e se houver uma função executa o bloco todo e pula para a linha seguinte;
Step Out: Sai da função;
Reset: Reinicia o programa (simulação), novamente, a partir da primeira linha.
3.1.VISUALIZANDO AS ENTRADAS E SAÍDAS DO MICROCONTROLADOR NO MPLAB SIM Run
Parar Passo a passo Step into
É possível definir os sinais de entrada (nos diferentes PORTX) para visualizar como se comportam as saídas (ou registradores) que, pelo programa desenvolvido devem dar uma resposta.
Para ter acesso a essa facilidade deveremos, com Ouput em MPLAM SIM, acessar na opção do menu, Debugger/Stimulus/New workbook como mostra a figura 33.
Figura 33 - Visualizando sinais em entradas e saídas
O passo seguinte é mostrado na figura 34. Como podemos visualizar é determinado a entrada cuja a saída deverá apresentar um efeito ocasionado por uma ação na mesma.
Neste caso RD0 refere-se a um botão que quando pressionado faz com que acenda um led. O Sinal escolhido é o toggle (cada vez que o botão é apertado) o led tem um estado distinto (ou ligado ou desligado).
Figura 34 - Ajuste de variáveis para observação
O “Stimulos” pode ser salvo e aberto posteriormente. As ações podem ser as seguintes: Set High: O pino setado (RD0 no caso) tomará o valor 1. Para zera-lo é necessário que seja executado Set Low.
Set Low: O pino ajustado tomará valor zero.
Toggle: Quando esta ação é executada o sinal mudará de estado, se estiver em zero será alterado para um ou vice-versa.
Pulse High: Um pulso de curta duração manterá o pino ajustado em um (ligado). Pulse Low: Um pulso de curta duração manterá o pino escolhido e zero (desligado).
Os pinos, como se observa na figura são escolhidos na coluna Pin/SFR, que corresponde aos pinos do PIC selecionado.
Width: Determina o valor da largura do pulso, nas opções Pulse High e Pulse Low. As unidades deste tempo são escolhidas na coluna units.
Para que as ações definidas sejam executadas é necessário clicar em fire.
As saídas podem ser observadas clicando no menu View/Wacht, como mostra a figura 35.
Figura 35 - Visualizando saídas
EXERCÌCIOS
A seguir são listados alguns exercícios, prontos ou outros onde é necessário apenas modificar o programa desenvolvido no corpo desta publicação. Portanto, ainda não estamos, ainda não estamos focando a programação C para microcontroladores, apenas fixando o ambiente MPLAB.
1. Simular o seguinte programa e encontrar no mesmo erros. #include <16f877A.h>
#use delay(clock=4000000, RESTART_WDT)
#fuses xt,nowdt,noprotect,put,brownout,nolvp,nocpd,nowrt #use fast_io(a) #use fast_io(b) #use fast_io(c) #use fast_io(d) #use fast_io(e)
#byte porta = 0x05 #byte portb = 0x06 #byte portc = 0x07 #byte portd = 0x08 #byte porte = 0x09
#bit BotaoLiga = portb.0 #bit BotaoDesliga = portb.1 #bit Motor1 = portb.2 #bit Lampada = portb.3
{
M o t o r 1 = 1 ; Lampada=1; }
if(!BotaoDesliga) {
M o t o r 1 = 0 ; Lampada=0; }
} }
2. Dado o seguinte circuito, primeiramente descreva qual a função do mesmo faça um programa que apertando a tecla SA14 ligue o led 0 (Apostila do CEFETES Centro Federal de Educação Tecnológica do Espirito Santo – Pag37).
3. O programa a seguir serve para acionar o led do circuito mostrado na figura 37. Simule o mesmo no MPLAB SIM. Analise com a ferramenta “Stimulus Controler” verificando as saídas com relação aos estímulos (sinais) nas respectivas entradas. Comente linha a linha o programa (Adaptado de Apostila do CEFETES Centro Federal de Educação Tecnológica do Espirito Santo – Pag40 a 42)
#use fast_io(a) #use fast_io(b) #use fast_io(c) #use fast_io(d) #use fast_io(e)
#byte porta = 0x05 #byte portb = 0x06 #byte portc = 0x07 #byte portd = 0x08 #byte porte = 0x09
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ENTRADAS *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #bit Botao7 = portb.1
#bit BotaoDesLiga = portb.2 #bit Botao9 = portb.3
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * SAÍDAS *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #bit HabLed = porta.4
#bit HabBotao = portb.6
#bit Led0 = portd.0 #byte Display = portd
Microcontroladores - PIC 42 MICROCONTROLADORES PIC EM C
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Configurações do Microcontrolador * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// configura CONFIG
setup_counters(RTCC_INTERNAL, WDT_2304MS);
// configura os TRIS set_tris_a(0b00100000); set_tris_b(0b00001111); set_tris_c(0b10011001); set_tris_d(0b00000000); set_tris_e(0b00000000);
// inicializa os ports
porta=0x00; // limpa porta portb=0x00; // limpa portb portc=0x00; // limpa portc portd=0x00; // limpa portd porte=0x00; // limpa porte
HabLed =1; HabBotao=1;//rb7
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Loop principal *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ while(TRUE)
{
RESTART_WDT();
if(Botao9) // testa botão portd = 0b01101111; if(Botao7) // testa botão portd = 0b00000111; if(BotaoDesLiga)
portd = 0b00000000; // caso contrário, led = 0
}
// FIM DO PROGRAMA }
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Fim do Programa *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */