Baixe o app para aproveitar ainda mais
Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
Curso Linguagem C para microcontroladores PIC Baseado no PIC18F4520 e no compilador CCS Carlos Eduardo Sandrini Luz _________________________________________________________________________ 2 – Carlos Eduardo Sandrini Luz Curso Linguagem C para microcontroladores PIC - 3 Sumário Introdução .......................................................................................... 14 Linguagem C ..................................................................................... 16 Programação de Microcontroladores em linguagem C ............................ 16 Capítulo 01 ......................................................................................... 17 Introdução aos Microcontroladores PIC .................................................... 17 1.1 – Microcontroladores PIC .............................................................. 17 1.2 - Memória ROM ............................................................................ 17 1.3 - Memória RAM ............................................................................ 18 1.3.1 – Registradores ..................................................................... 18 1.3.2 - Registradores de Propósito Geral .......................................... 18 1.3.3 - Registradores de Funções Especiais ...................................... 18 1.4 - CPU .......................................................................................... 18 1.4.1 - Funcionamento da CPU ........................................................ 19 Capítulo 02 ......................................................................................... 21 Introdução à Linguagem C ...................................................................... 21 2.1 - Palavras Reservadas ................................................................... 21 2.2 - Identificadores ........................................................................... 21 2.3- Tipos de dados ........................................................................... 21 2.4 - Modificadores de Tipo ................................................................. 22 2.5 -Variáveis .................................................................................... 23 2.5.1 - Declaração de Variáveis ....................................................... 23 2.5.2 - Variáveis Globais ................................................................. 24 2.5.3 - Variáveis Locais ................................................................... 24 2.6 - Operadores................................................................................ 24 2.6.1 - Operadores de Atribuição ..................................................... 24 2.6.2 – Operadores Aritméticos ....................................................... 25 2.6.3 – Operadores Relacionais ....................................................... 25 2.6.4 - Operadores lógicos bit-a-bit .................................................. 26 2.6.5 - Operadores lógicos relacionais: ............................................. 26 2.7 - Declarações de controle .............................................................. 26 _________________________________________________________________________ 4 – Carlos Eduardo Sandrini Luz 2.7.1 - Comando if ......................................................................... 26 2.7.2 - Comandos if-else ................................................................. 27 2.7.3 - Comandos switch-case ......................................................... 28 2.7.4 - Laço for .............................................................................. 29 2.7.5 - Laço while .......................................................................... 30 2.7.6 - Laço do-while ...................................................................... 30 2.8- Notação numérica ....................................................................... 31 Capítulo 03 ......................................................................................... 33 O PIC 18F4520 ...................................................................................... 33 3.1 - Introdução ................................................................................ 33 3.2 - Pinagem do PIC 18F4520 ............................................................ 34 3.2.1 - Nomenclatura dos pinos ....................................................... 34 3.3 - Estrutura interna do PIC 18F4420 e 18F4520 ................................ 38 3.4 - Oscilador ................................................................................... 39 3.5 - RESET ....................................................................................... 40 3.6 - Memória .................................................................................... 40 Capítulo 04 ......................................................................................... 45 Criando o primeiro programa .................................................................. 45 4.1 - O compilador CCS – PCWHD ....................................................... 45 4.1.1 - Criando um programa utilizando o compilador CCS ................. 45 4.2 - Estrutura de um programa em C ................................................. 48 4.3 – Diretivas ................................................................................... 49 Capítulo 05 ......................................................................................... 57 Entradas e saídas (I/O) .......................................................................... 57 5.1 - Ciclo de Máquina ........................................................................ 57 5.2 - Portas de entrada/saída (I/O) ...................................................... 58 5.2.1 - Registrador TRISx ............................................................... 58 5.2.1.1- Diretivas de direcionamento dos pinos ............................. 58 5.2.2 - Registrador PORTx .............................................................. 60 Curso Linguagem C para microcontroladores PIC - 5 5.2.2.1 - Funções de entrada ...................................................... 60 5.2.2.2 - Funções de saída .......................................................... 60 5.3 - Acionamento de LEDS ................................................................ 61 Circuito: ........................................................................................ 62 Código fonte do arquivo EX02.c: ..................................................... 62 5.4 - Gravando o microcontrolador ...................................................... 64 5.4.1 – Utilizando o Gravador .......................................................... 64 5.4.1.2 - Programando o microcontrolador ................................... 64 5.5- Entendendo o código fonte .......................................................... 67 5.6 - Funções de atraso (delay) ........................................................... 68 5.7 - Acionamento de chaves .............................................................. 69 Circuito: ........................................................................................ 70 Código fonte arquivo Ex03.c ........................................................... 70 Entendendo o código ...................................................................... 71 5.8 – Segundo exemplo de acionamento de chaves............................... 72 Código fonte arquivo Ex04.c ........................................................... 72 Entendendo o código ...................................................................... 73 5.9 - Diretiva #define ......................................................................... 74 Código fonte arquivo Ex05.c ........................................................... 74 5.10 – Funções .................................................................................. 75 5.10.1 -Protótipo de função ............................................................ 77 Capítulo 06 ......................................................................................... 79 Função printf ......................................................................................... 79 6.1 - Função printf ............................................................................. 79 6.2 - Formatação de strings ................................................................ 79 6.3 - Códigos diversos ........................................................................ 81 Capítulo 07 ......................................................................................... 83 LCD de 16 colunas e 2 linhas .................................................................. 83 7.1 - Display de Cristal Líquido (LCD) ................................................... 83 7.2 - Pinagem do LCD ........................................................................ 83 _________________________________________________________________________ 6 – Carlos Eduardo Sandrini Luz 7.3 - Criando uma biblioteca de funções para o LCD.............................. 85 7.3.1 - Procedimento para Inicialização de um LCD: .......................... 85 7.3.2 - Comandos Básicos de um Display de Cristal Líquido ................ 86 7.4 - Utilizando o LCD no modo 8 bits de dados. ................................... 88 Código fonte arquivo Ex06.c ........................................................... 88 Código fonte para as funções de controle do LCD (arquivo LCD8b.c) .. 89 Entendendo o código fonte ............................................................. 91 O Arquivo LCD8B.c ......................................................................... 92 7.5 - Utilizando o LCD no modo 4 bits de dados. ................................... 96 7.5.1 - Posicionando o código de 8 bits em 2 partes de 4 bits ............ 97 7.5.2 – O código em C para comunicação em 4 bits de dados. ........... 97 7.5.3 – Exemplo utilizando o LCD no modo 4 bits de dados ................ 99 Código fonte arquivo Ex07.c ........................................................... 99 Código fonte para as funções de controle do LCD (arquivo LCD4b.c) 100 Capítulo 08 ....................................................................................... 103 Interrupções ........................................................................................ 103 8.1 - Estudo das Interrupções ........................................................... 103 8.1.1 - Tipos de interrupções disponíveis ........................................ 103 8.1.2 - Representação da lógica das interrupções ............................ 105 8.2 - Função de tratamento das interrupções ...................................... 106 8.2.1 - Tratamento das interrupções no compilador CCS .................. 107 8.3 - Interrupção Externa ................................................................. 108 8.3.1 - Projeto de exemplo............................................................ 109 Circuito: ...................................................................................... 110 Código fonte arquivo Ex08.c ......................................................... 110 8.4 - Níveis de prioridade das interrupções ......................................... 111 8.5 - Tratamento de interrupções de alta prioridade no compilador CCS 112 Capítulo 09 ....................................................................................... 115 Timers ................................................................................................ 115 Curso Linguagem C para microcontroladores PIC - 7 9.1 - TIMER0 ................................................................................... 115 9.1.1 - Interrupção do TIMER0 .......................................................... 117 9.1.2 - Calculando o tempo total para a ocorrência da interrupção do TIMER0 no modo 8 bits. ............................................................... 117 9.1.3 - Contando um tempo de 1 segundo com o TIMER0 no modo 8 bits ............................................................................................. 118 9.1.4 – Utilizando a Interrupção do TIMER0 no modo 8 bits ............. 119 Circuito: ...................................................................................... 119 9.1.4.1 - Configuração do TIMER0 no compilador CCS ................. 119 Código fonte arquivo Ex09.c ......................................................... 120 Entendendo o código .................................................................... 121 9.1.5 – Interrupção do TIMER0 no modo 8 bits (exemplo II) .......... 123 Código fonte arquivo Ex10.c ......................................................... 124 Entendendo o código .................................................................... 126 9.1.6 –Utilizando o TIMER0 com um sinal externo ........................... 127 Circuito: ...................................................................................... 128 Código fonte arquivo Ex11.c ......................................................... 128 9.1.7 - Utilizando o TIMER0 no modo 16 bits .................................. 129 9.1.8- Calculando o tempo total para a ocorrência da interrupção do TIMER0 para o modo 16 bits. ........................................................ 129 9.1.9 - Contando um tempo de 10 segundos no modo 16 bits .......... 130 9.1.10 – Utilizando a Interrupção do TIMER0 no modo 16 bits ......... 131 Circuito: ...................................................................................... 131 Código fonte arquivo Ex12.c ......................................................... 131 9.2 - TIMER1 ................................................................................... 132 9.2.1 - Modo de escrita e leitura em 16 bits .................................... 134 9.2.2 - Circuito oscilador (Low Power) ............................................ 135 9.2.3 - Interrupção do TIMER1 ...................................................... 135 9.2.3.1 - Registrador PIE1......................................................... 135 9.2.3.2 - Registrador PIR1 ........................................................ 136 9.2.3.3 - Registradores TMR1L e TMR1H .................................... 136 _________________________________________________________________________ 8 – Carlos Eduardo Sandrini Luz 9.2.4 - Calculando o tempo total para ocorrência da interrupção do TIMER1 ....................................................................................... 136 9.2.5 - Contando um tempo de 1 segundo com o TIMER1 ............... 137 9.2.5.1 - Configurando o TIMER1 no CCS ................................... 138 9.2.6 – Utilizando as Interrupções do TIMER0 em 8 bits e do TIMER1 .................................................................................................. 138 Circuito: ...................................................................................... 140 Código fonte arquivo Ex13.c ......................................................... 140 9.2.7 - Utilizando o TIMER1 com um sinal externo .......................... 142 Circuito: ...................................................................................... 143 Código fonte arquivo Ex14.c ......................................................... 143 9.3 - TIMER2 ................................................................................... 144 9.3.1 - Registrador T2CON ............................................................ 145 9.3.2 - Interrupção do TIMER2 ...................................................... 146 9.3.2.1 - Registrador PIE1......................................................... 147 9.3.2.2 - Registrador PIR1 ........................................................ 147 9.3.2.3 - Registrador TMR2 ....................................................... 147 9.3.3 - Calculando o tempo total para a ocorrência da interrupção do TIMER2 ....................................................................................... 147 9.3.4 - Contando um tempo de 1 segundo com o TIMER2 ............... 148 9.3.4.1 - Configurando o TIMER2 no compilador CCS .................. 149 Circuito: ...................................................................................... 150 Código fonte arquivo Ex15.c ......................................................... 150 9.4 - Watchdog Timer (WDT) ............................................................ 151 9.4.1 - Tratando o Watchdog no compilador CCS ............................ 152 9.4.1.1 – Exemplo de programa utilizando o watchdog. ............... 152 Circuito: ...................................................................................... 153 Código fonte do arquivo Ex16.c ..................................................... 153 9.4.1.2 – Funcionamento do projeto .......................................... 154 Curso Linguagem C para microcontroladores PIC - 9 9.5 – Verificando o motivo do reset do microcontrolador ..................... 154 9.5.1 – Exemplo ........................................................................... 155 Código fonte do arquivo Ex14.c ..................................................... 155 9.5.2 – Funcionamento do projeto ................................................. 155 Capítulo 10 ....................................................................................... 157 Conversor Analógico/Digital .................................................................. 157 10.1 – Conversor A/D interno ............................................................ 157 10.2 - Processo de Conversão ........................................................... 161 10.3 - Ciclo de conversão Analógico/Digital ........................................ 162 10.3.1 - Conversão Manual ........................................................... 162 10.3.2 - Conversão Automática ..................................................... 163 10.4 - Configurando o Conversor A/D no CCS ..................................... 164 10.4.1 - As tensões de referência .................................................. 167 10.4.2 - Diretiva #DEVICE (Bits retornados) ................................... 168 10.5 – Primeiro exemplo para o conversor A/D. .................................. 168 Circuito: ...................................................................................... 169 Código fonte arquivo Ex18.c ......................................................... 169 10.6 – Segundo exemplo para o conversor A/D. ................................. 170 10.6.1 – Convertendo valores em tensão ....................................... 171 10.6.2 – O sensor LM35 ................................................................ 171 Código fonte arquivo Ex19.c ......................................................... 172 Entendo o código ......................................................................... 174 Conversão em temperatura. ...................................................... 174 Conversão em tensão. .............................................................. 174 Imprimindo os resultados no LCD .............................................. 174 Capítulo 11 ....................................................................................... 177 Tipos de Dados Avançados ................................................................... 177 11.1 - Matrizes de Dados .................................................................. 177 Capítulo 12 ....................................................................................... 179 Displays de 7 segmentos ...................................................................... 179 _________________________________________________________________________ 10 – Carlos Eduardo Sandrini Luz 12. 1- Os displays de 7 segmentos .................................................... 179 12.2 – O 74HC595 ........................................................................... 181 12.4 – Varredura dos displays de 7 segmentos ................................... 182 12.5 – Primeiro exemplo com displays de 7 segmentos. ...................... 183 Código fonte arquivo Ex20.c ......................................................... 183 Entendendo o código .................................................................... 186 12.6 – Segundo exemplo com displays de 7 segmentos. ...................... 189 Circuito: ...................................................................................... 189 Código fonte arquivo Ex21.c ......................................................... 190 Entendendo o código .................................................................... 193 Capítulo 13 ....................................................................................... 197 Comunicação Serial .............................................................................. 197 13.1 – USART .................................................................................. 197 13.2 - Modo de Transmissão/Recepção no modo Assíncrono ................ 197 13.3 - EUSART ................................................................................. 198 13.3.1 - Auto-Wake-Up quando da recepção de um caractere. ......... 198 13.3.2- Ajuste automático de baud rate; ....................................... 198 13.3.3 - Transmissão de um caractere break contendo 12 bits. ........ 198 13.4 - Registradores de controle e operação para EUSART ................... 199 13.5 - Suporte à comunicação serial no CCS ....................................... 201 13.6 - Funções para comunicação serial ............................................. 202 13.7 – Primeiro exemplo utilizando comunicação serial. ....................... 205 Circuitos:..................................................................................... 206 Código fonte arquivo Ex22.c ......................................................... 207 13.7.1 - Testando o código com software monitor serial .................. 207 13.8 - Segundo exemplo utilizando comunicação serial. ....................... 209 Circuitos:..................................................................................... 210 Código fonte arquivo Ex23.c ......................................................... 211 Funcionamento: ........................................................................... 212 Curso Linguagem C para microcontroladores PIC - 11 Capítulo 14 ....................................................................................... 215 Memória de dados EEPROM .................................................................. 215 14.1 - EEPROM ................................................................................ 215 14.2 - Processo de escrita na EEPROM ............................................... 216 14.3 - Processo de leitura da EEPROM ............................................... 217 14.4 - Acesso à EEPROM interna pelo CCS.......................................... 217 14.5 – Utilizando a EEPROM .............................................................. 218 Circuito: ...................................................................................... 218 Código fonte arquivo Ex24.c ......................................................... 219 Capítulo 15 ....................................................................................... 221 MSSP – Master Synchronous Serial Port ................................................. 221 15.1 Visão geral do módulo MSSP...................................................... 221 15.2 - Registros de controle .............................................................. 221 15.3 - Protocolo SPI ......................................................................... 221 15.3.1 - Registradores envolvidos .................................................. 223 15.3.2 - Operação em modo SPI.................................................... 225 15.3.3 - Habilitando o modo SPI .................................................... 226 15.3.4 - Modo Mestre ................................................................... 227 15.3.5 - Modo Escravo .................................................................. 228 15.3.6 - Memória serial 25LC256 ................................................... 229 15.3.6.1 - Princípios de operação da memória serial .................... 230 15.3.6.2 - Operação de Escrita .................................................. 231 15.3.6.3 - Operação de leitura ................................................... 233 15.3.7 - Protocolo SPI utilizando o compilador CCS ......................... 233 15.3.8 - Exemplo utilizando o protocolo de comunicação SPI............ 236 Circuito: ...................................................................................... 237 Código fonte arquivo Ex25.c ......................................................... 237 15.3.9 – O Conversor Digital Analógico MCP4921 ............................ 239 15.3.9.1 – Exemplo utilizando o MCP4921 .................................. 242 Código fonte arquivo Ex26.c ..................................................... 242 _________________________________________________________________________ 12 – Carlos Eduardo Sandrini Luz 15.4 - Protocolo de comunicação I2C ................................................. 244 15.4.1 - Registradores envolvidos .................................................. 245 15.4.2 - Operação em modo I2C Mestre ......................................... 249 15.4.2.1 - Transmissão em modo Mestre .................................... 251 15.4.2.2 - Recepção em modo Mestre ........................................ 251 15.4.3 - Endereçamento em 7 bits para o dispositivo escravo ........... 251 15.4.4 - Sequência de transmissão de dados .................................. 252 15.4.5 - Protocolo I2C utilizando o compilador CCS .......................... 253 15.4.5.1 - Funções CCS para comunicação utilizando o protocolo I2C .............................................................................................. 254 15.4.6 – Memória EEPROM Serial .................................................. 254 15.4.6.1 – Operação de Escrita.................................................. 256 15.4.6.2 – Operação de Leitura ................................................. 256 15.4.6.3 – Exemplo utilizando a memória EEPROM 24LC512 ........ 257 Código fonte arquivo Ex27.c ..................................................... 257 15.4.7 - Relógio de Tempo Real DS1307 ........................................ 259 15.4.7.1 - Princípio de funcionamento do DS1307 ....................... 260 15.4.7.2 – Exemplo utilizando o RTC DS1307 ............................. 261 Circuito: .................................................................................. 262 Código fonte arquivo Ex28.c ..................................................... 262 Arquivo ds1307.c ..................................................................... 265 15.4.7.3- Entendendo o código ds1307.c .................................... 268 Capítulo 16 ....................................................................................... 275 Módulo PWM ....................................................................................... 275 16.1 - PWM (Pulse Width Modulation) ................................................ 275 16.2 - Geração do sinal de PWM ........................................................ 275 16.3 - Cálculo do Período de PWM ..................................................... 276 16.4 - Resolução PWM ...................................................................... 277 Curso Linguagem C para microcontroladores PIC - 13 16.5 - Funções para o módulo PWM no compilador CCS ...................... 278 16.6 – Primeiro programa utilizando o módulo PWM 1 ......................... 279 Circuito: ...................................................................................... 280 Código fonte arquivo Ex29.c ......................................................... 280 16.6 – Segundo programa utilizando o módulo PWM 1 ........................ 281 Circuito: ...................................................................................... 281 Código fonte do arquivo EX30.c ..................................................... 281 _________________________________________________________________________ 14 – Carlos Eduardo Sandrini Luz Introdução Este curso é baseado no microcontrolador PIC18F4520 da microchip (www.microchip.com), e utilizando o compilador em linguagem C CCS módulo PCWHD. O compilador CCS módulo PCWHD é desenvolvido pela CCS Inc. (www.ccsinfo.com) e abrange toda a linha de microcontroladores PIC. Este compilador possui uma interface própria onde é possível criar projetos, editar o código fonte, compilar e, utilizando-se do Gravador e Depurador ICD-U64 (desenvolvido pela própria CCS), é possível a programação e depuração do microcontrolador diretamente pela interface. O compilador CCS também pode ser integrado ao MPLAB® através de um software ‘plug-in’ que pode ser baixado sem custo através do link www.ccsinfo.com/download. Através desta integração é possível editar, compilar, programar e depurar os projetos diretamente na interface de desenvolvimento MPLAB®, assim é possível a utilização de ferramentas que podem ser integradas a este software, como por exemplo, o gravador e depurador ICD3®, PICKIT3®, etc.. A CCS oferece uma versão de demonstração de seu compilador válida por um período de 45 dias sem limite no tamanho do programa e totalmente funcional para toda a linha de microcontroladores PIC. Para baixar a versão de demonstração basta seguir o link: http://www.ccsinfo.com/ccsfreedemo.php, lembrando que é necessário o preenchimento de um formulário de cadastro pelo usuário. Neste curso, apresentaremos os exemplos feitos na interface PCWHD, porém em alguns casos utilizaremos a integração ao MPLAB®. Todos os circuitos e exemplos de projetos criados, foram desenvolvidos e testados pelo autor na placa ACEPIC PRO V6.0 e também foram utilizados em aulas práticas ministradas na ACEPIC Tecnologia. Apesar de este curso ter como base o PIC18F4520, as explicações e programas podem ser adaptados facilmente para outros microcontroladores da Microchip. Setembro - 2018 http://www.microchip.com/ http://www.ccsinfo.com/ Curso Linguagem C para microcontroladores PIC - 15 Downloads Plug-In de integração CCS – MPLAB®: http://www.ccsinfo.com/downloads.php Versão de demonstração CCS – PCWHD: http://www.ccsinfo.com/ccsfreedemo.php Exemplos do Livro: http://www.acepic.com.br/suporte/Exemplos_Livro_CCS.zip http://www.ccsinfo.com/downloads.php http://www.ccsinfo.com/ccsfreedemo.php _________________________________________________________________________ 16 – Carlos Eduardo Sandrini Luz Linguagem C É uma linguagem de programação de propósito geral, estruturada, imperativa, procedural de alto e baixo nível, criada em 1972 por Dennis Ritchie no AT&T Bell Labs, para desenvolver o sistema operacional UNIX (que foi originalmente escrito em Assembly). Desde então, espalhou-se por muitos outros sistemas e tornou-se uma das linguagens de programação mais usadas influenciando muitas outras linguagens, especialmente o C++, que foi desenvolvida como uma extensão para C. Fonte: WIKIPEDIA Programação de Microcontroladores em linguagem C Atualmente, a maioria dos microcontroladores existentes no mercado, contam com compiladores em C para o desenvolvimento de software, pois a linguagem C permite a construção de programas e aplicações muito mais complexas do que o Assembly. O compilador C tem a capacidade de “traduzir” com alto grau de inteligência e velocidade o código em C para o código de máquina, portanto podemos dizer que a linguagem C possui grande eficiência. Essa eficiência da linguagem C faz com que o programador se preocupe mais com a programação em si e o compilador assume responsabilidades como localização da memória, operações matemáticas e lógicas, verificação de bancos de memórias e outros. Curso Linguagem C para microcontroladores PIC - 17 Capítulo 01 Introdução aos Microcontroladores PIC 1.1 – Microcontroladores PIC Os microcontroladores PIC são desenvolvidos pela Microchip Technology e seu nome real é PICmicro (Peripheral Interface Controller), porém é mais conhecido somente como PIC. Todos os microcontroladores PIC utilizam a arquitetura Harvard, ou seja, utilizam duas memórias distintas, uma para o armazenamento das instruções e outra para o gerenciamento de dados. Na composição dos microcontroladores PIC, podemos encontrar o processador (CPU), a memória ROM, a Memória RAM e as linhas de comunicação (bus de dados), além das portas de entrada/saída, periféricos, módulos de comunicação, comparadores, conversores analógico/digitais, memória EEPROM, etc. Conforme a figura 1.1 a seguir: Fig.: 1.1 – Composição de um microcontrolador PIC 1.2 - Memória ROM A memória ROM (Read Only Memory) também conhecida como memória de programa é do tipo não volátil, ou seja, os seus dados não são perdidos quando o microcontrolador não está energizado. Esta memória pode ter capacidade de 512 bytes a 128 Kbytes nos microcontroladores PIC de 8 bits. Esta memória é do tipo Flash, assim é possível escrever e ler em múltiplos endereços numa só operação, permitindo que os microcontroladores sejam reprogramados no próprio circuito (in-circuit) sem a necessidade de retirá-los da placa. _________________________________________________________________________ 18 – Carlos Eduardo Sandrini Luz 1.3 - Memória RAM A memória RAM (Random Access Memory) é do tipo volátil, assim seus dados serão perdidos ao retirar a alimentação do microcontrolador. Esta memória é destinada a armazenar variáveis e dados temporários que serão utilizados pelo microcontrolador para cálculos ou outro tipo de operações lógicas. A memória RAM divide-se em dois setores: 1.3.1 – Registradores Os registradores são pequenas porções de memória e seu tamanho é medido, geralmente, em bits (8 bits, 16 bits, 32 bits). São representados por um valor numérico, porém podemos dar um nome aos registradores no código de programação para facilitar a identificação e o acesso a eles. 1.3.2 - Registradores de Propósito Geral (GPR – General Porpose Registers) - Espaço destinado à criação das variáveis criadas pelo usuário e as variáveis do próprio compilador. 1.3.3 - Registradores de Funções Especiais (SFR - Special Function Registers) – Espaço que contém os bits de configuração e controle dos periféricos do microcontrolador. Para os microcontroladores PIC de 8 bits, podemos encontrar memórias RAM com capacidades de 32 bytes até 4 Kbytes. 1.4 - CPU A Unidade Central de Processamento (CPU – Central Processing Unit), é a unidade responsável por monitorar e controlar todos os processos dentro do microcontrolador (Figura 1.2). A CPU possui vários módulos e podemos destacar alguns de grande importância: Decodificador de instruções – Responsável por decodificar cada instrução; Contato de Programa (PC – Program Counter) – Controla a sequência do programa; Curso Linguagem C para microcontroladores PIC - 19 Unidade Lógica Aritimética (ALU – Arithmetical Logical Unit) – Responsável pelos cálculos e operações lógicas dos dados; Acumulador – É um registrador de função especial relacionado às operações da ALU. É utilizado para armazenar todos os dados sobre os quais serão realizados uma operação (adição, mudança, movimento, etc). Também armazena os resultados para uso em outros processamentos. Um registrador relacionado ao acumulador para exibir o estado deste é o registrador de função especial chamado STATUS. Fig. 1.2: CPU 1.4.1 - Funcionamento da CPU Primeiramente, antes de falarmos sobre o funcionamento da CPU, devemos saber que todas as instruções são sequências de bits 1 e 0 que informam o que a CPU deve fazer. Essas sequências de bits são conhecidas como opcodes (ou operation codes). Então, por exemplo, para a instrução RESET para um microcontrolador da família PIC18, teremos um código formado por 16 bits referente a esta instrução, ou seja, o opcode 00000000111111112. A CPU fará a leitura do opcode da memória de programa, onde a sua posição é controlada pelo Contador de Programa (PC), o código será decodificado pelo Decodificador de Instruções e em seguida a instrução será processada. Nesse momento, vários módulos da CPU serão incluídos no processo para que seja possível a realização da operação desejada. Após a execução da tarefa desejada, simplesmente teremos o resultado que pode ser escrito em um registrador interno da CPU. Podemos ter também a alteração de um valor na memória RAM ou até mesmo a alteração do contador de programa para que sejam gerados saltos ou laços, etc. A figura 1.3 a seguir mostra os ciclos de execução de uma instrução. _________________________________________________________________________ 20 – Carlos Eduardo Sandrini Luz Fig.: 1.3 – Sequência de processamento realizado pelo PIC Curso Linguagem C para microcontroladores PIC - 21 Capítulo 02 Introdução à Linguagem C 2.1 - Palavras Reservadas Toda linguagem de programação possui um conjunto de palavras definidas para interpretação do próprio compilador, sendo assim, essas palavras não deverão ser utilizas pelo usuário para outras finalidades além das definidas pelo compilador. Essas palavras são chamadas de Reservadas e em linguagem C, temos as seguintes: auto do goto signed unsigned break double if sizeof void case else int static volatile char enum long struct while const extern register switch continue float return typedef default for short union 2.2 - Identificadores Os identificadores são nomes dados às funções, variáveis, constantes, etc. Estes não devem conter caracteres acentuados, espaços, cê-cedilha(ç) e, devem sempre começar com uma letra ou o símbolo underline (_) que é tratado como letra. 2.3- Tipos de dados Os tipos de dados suportados pela linguagem C e utilizados no compilador CCS são identificados pelas palavras reservadas: char, int, float e void. A tabela 2.2 exibe os tipos de dados e o seu tamanho correspondente em bits. Tipo de dado Tamanho char 8 bits int 8 bits float 32 bits void 0 Tabela 2.1 – Tipos de dados O tipo char representa caracteres ASCII de 8 bits, sendo que cada variável do tipo char pode representar somente um caractere ASCII. _________________________________________________________________________ 22 – Carlos Eduardo Sandrini Luz O tipo int representa números inteiros de 8 bits. O tipo float representa números fracionários de 32 bits, sendo que este tipo de dado deve ser evitado tendo em vista o seu tamanho e a complexidade de operações para o microcontrolador envolvendo variáveis do tipo float . O tipo void é normalmente utilizado em funções para declarar que ela não deve retornar nenhum valor. 2.4 - Modificadores de Tipo Além dos tipos de dados acima, podemos utilizar comandos especiais para modificá-los e esses comandos são chamados de modificadores de tipo, sendo eles: signed, unsigned, short e long. O modificador de tipo signed pode ser utilizado para representar um número positivo ou negativo, assim um tipo de dado signed int pode representar valores de -127 a 128. O modificador unsigned define um tipo de dado sem sinal, ou seja, somente a parte positiva de uma variável, então o tipo de dados unsigned int representa valores de 0 a 255. O modificador short é utilizado para definir um valor menor do que o tipo modificado, ou seja, ao declaramos uma variável com o tipo short int, a variável tem seu tamanho reduzido para 1 bit. O modificador long é o contrário, ou seja, amplia o tamanho de uma variável, então uma variável declarada com o tipo de dado long int passa a ter o tamanho de 16 bits. A seguir, temos a tabela 2.2 com as informações de todos os tipos de dados e seus modificadores disponíveis para o compilador CCS. Tipo Tamanho Valores short int, int1, boolean 1 bit 0 ou 1 char 8 bits 0 a 255 int, int8 8 bits -128 a 127 signed int 8 bits -128 a 127 unsigned int 8 bits 0 a 255 Curso Linguagem C para microcontroladores PIC - 23 long int, int16 16 bits -32768 a 32767 signed long int, signed int16 16 bits -32768 a 32767 unsigned long int, unsigned int16 36 bits 0 a 65535 int32 32 bits -2147483648 a 2147483647 signed int32 32 bits -2147483648 a 2147483647 unsigned int32 32 bits 0 a 4294967295 float 32 bits 1,5-45 a 3,438 Tabela 2.2 – Tipos de dados e seus modificadores 2.5 -Variáveis As variáveis são uma representação simbólica onde são armazenados dados do programa ou dados externos como uma tecla pressionada ou uma tensão lida, etc. As variáveis, como vimos acima, podem conter letras e números, sempre começando com letras e não devem ter nome de palavras reservadas pelo compilador como, por exemplo, for, do, int, etc. 2.5.1 - Declaração de Variáveis Declarar uma variável é simplesmente informar ao compilador que uma variável chamada “X” é do tipo “Y” e é declarada da seguinte forma: <tipo> + <nome da variável>; Podemos também declarar e inicializar uma variável da seguinte forma: <tipo> + <nome da variável> = <valor da variável>; Exemplos: unsigned int x = 123; int conta; short x1; _________________________________________________________________________ 24 – Carlos Eduardo Sandrini Luz 2.5.2 - Variáveis Globais São declaradas no início de nosso código e que podem ser acessadas em qualquer ponto do programa: Exemplo: int conta; unsigned int c; void main() { conta = 10; c = 2; while(true); } 2.5.3 - Variáveis Locais São declaradas dentro de uma função e somente existe durante a execução da função. Elas são descartadas depois de executada a função: Exemplo: void main() { int conta; conta = conta++; while(true); } 2.6 - Operadores Temos, na linguagem C, vários operadores e podemos verificá-los a seguir: 2.6.1 - Operadores de Atribuição São utilizados para atribuir valores às variáveis: Curso Linguagem C para microcontroladores PIC - 25 Operador Descrição Exemplo = Associa um valor à variável a = 2 2.6.2 – Operadores Aritméticos Operador Descrição Exemplo + Soma dos argumentos a + b - Subtração dos argumentos a - b * Multiplicação dos argumentos a * b / Divisão dos argumentos a / b % Resto da divisão (só pode ser utilizado com valores inteiros) a % b ++ Soma 1 ao argumento a++ -- Subtrai 1 ao argumento a-- 2.6.3 – Operadores Relacionais São utilizados para comparação entre argumentos e retornam uma resposta verdadeira ou falsa. Como em linguagem C não existe uma variável booleana para um resultado verdadeiro ou falso, todo valor igual a 0 será considerado falso e todo valor diferente de 0 (qualquer valor) será considerado verdadeiro. Operador Descrição Exemplo == Compara se igual a a == 5 != Compara se diferente de a != 5 > Compara se maior que a > 5 < Compara se menor que a < 5 >= Compara se maior ou igual a a >= 5 <= Compara se menor ou igual a a <= 5 _________________________________________________________________________ 26 – Carlos Eduardo Sandrini Luz 2.6.4 - Operadores lógicos bit-a-bit Operador Descrição & E (AND) | OU (OR) ^ OU EXCLUSIVO (XOR) ~ Complemento (NOT) >> Deslocamento à direita << Deslocamento à esquerda 2.6.5 - Operadores lógicos relacionais: Operador Descrição && Comparação lógica E (AND) || Comparação lógica OU (OR) ! Comparação lógica Complemento (NOT) 2.7 - Declarações de controle 2.7.1 - Comando if O comando if é um comando de decisão e é utilizado para avaliar uma determinada condição e determinar se ela é verdadeira, caso seja, executa o bloco contido dentro desta condição. Sua forma geral é: if (exp) comando; Se o resultado da condição referente à expressão (exp) for verdadeiro, o comando será executado, caso contrário, o programa segue sem executar o comando. if (exp) { comando1; comando2; Curso Linguagem C para microcontroladores PIC - 27 } Para o caso acima, a mesma explicação anterior se aplica, sendo que agora, se a condição da expressão for verdadeira, serão executados comando1 e comando2. Exemplos: if (conta>50) conta = 0; Neste caso, se a variável conta atingir um valor maior que 50, o comando conta = 0 será executado e a variável conta será zerada. if (conta>50) { conta = 0; conta1++; } Neste caso, se a variável conta atingir um valor maior que 50, os comandos conta = 0 e conta1++ serão executados e assim a variável conta será zerada e a variável conta1 será incrementada em 1, respectivamente. 2.7.2 - Comandos if-else Neste caso, a condição if é utilizada da mesma forma anterior, sendo que agora, se a condição da expressão for falsa a condição else será executada, ou seja, neste caso existe a possibilidade de escolha de uma entre duas opções. Sua forma é: if (exp) comando1; else comando2; Caso a expressão seja verdadeira, o comando1 será executado, caso seja falsa, o comando2 será executado. Exemplo: if (conta>0) { conta = 0; conta1++; _________________________________________________________________________ 28 – Carlos Eduardo Sandrini Luz } else conta++; Para o exemplo, se o valor da variável conta for maior que 0, então os comandos conta = 0 e conta1++ serão executados, porém caso o valor da variável conta seja 0 ou menor que 0, então o comando conta++ será executado. 2.7.3 - Comandos switch-case Quando existem muitos valores para testar de uma só variável, o comando IF pode ficar meio confuso ou sem muita eficiência, para isso podemos utilizar os comandos switch-case e para finalizar o teste da variável, utilizamos a cláusula break. Veja a seguir a forma de utilização destes comandos: switch(variável) { case valor1: comando1; break; case valor2: comando2; break; default: comandoN; } Neste caso, a variável será testada e se o valor dela for igual a valor1, o comando1 será executado, se for igual ao valor2, o comando2 será executado e assim por diante, agora se o valor for diferente de qualquer caso (case), o comandoN será executado. Exemplo: switch(conta) { case 10: conta1++; break; case 15: conta2++; break; case 20: conta1++; conta2++; break; default: conta3++; } Curso Linguagem C para microcontroladores PIC - 29 Neste caso, se o valor da variável conta for igual a 10, a variável conta1 será incrementada, se o valor da variável conta for igual a 15, o valor da variável conta2 será incrementado, caso o valor de conta seja igual a 20, tanto os valores de conta1 quanto de conta2 serão incrementados, para todos outros valores diferentes para a variável conta, o valor de conta3 será incrementado. Note que após cada comando, temos a cláusula break, cuja função é encerrar o teste da variável tendo em vista já ter sido satisfeita a condição, assim se a variável conta tem seu valor igual a 10, o comando de incremento da variável conta1 será executado, ou seja, a condição já foi atendida e não é preciso testar mais a variável conta. Então, a cláusula break, encerra os testes feitos por case e, assim, o programa continua na próxima instrução após a estrutura switch. 2.7.4 - Laço for Este é um dos comandos de laço (loop ou repetição) disponíveis na linguagem C, a seu formato é: for(inicialização;condição(término);incremento) { comando1; comando2; } onde: inicialização: essa seção conterá uma inicialização para a variável; condição: responsável por contar a condição de finalização do laço; incremento: conterá a expressão para incremento da variável. Exemplo: int conta; int a = 0; for (conta=0;conta<10;conta++) a++; Neste exemplo, a variável conta será iniciada com o valor 0, a variável a será incrementada e, como o resultado da expressão (conta<10) ainda é verdadeiro, a variável conta será incrementada (conta++), assim como novamente a variável a. Essa repetição ou laço se dará enquanto o resultado da expressão for verdadeiro. _________________________________________________________________________ 30 – Carlos Eduardo Sandrini Luz 2.7.5 - Laço while Neste laço, os comandos serão repetidos enquanto a expressão for verdadeira, sua forma de utilização é a seguinte: while (exp) comando; Exemplo: int x = 0; while(x<10) x++; O programa ficará no laço de repetição while, enquanto a variável x for menor que 10 e só continuará quando o valor de x for maior ou igual a 10. int x = 0, y=0; while(y<10) { x++; y++; } Neste exemplo, temos duas variáveis (x e y) que serão incrementadas enquando o valor da variável y for menor que 10. 2.7.6 - Laço do-while Este laço é uma variação do laço while, sendo que, neste caso, o comando será executado antes de testar se a condição é verdadeira. Sua forma é: do { comando; } while(exp); O comando será executado pelo menos uma vez antes de verificar a condição da expressão. Curso Linguagem C para microcontroladores PIC - 31 Exemplo: int x = 0; int y = 10; do { x++; y--; } while(y!=1); Neste exemplo, pode-se verificar que a variável x vai se incrementar e a variável y será decrementada até enquanto seu valor for diferente de 1. 2.8- Notação numérica Em linguagem C, podemos usar as 4 formas de representação numérica, decimal, binária, hexadecimal e octal, sendo as mais comuns somente as 3 primeiras. Notação decimal: a representação desta notação é direta: Ex.: x = 10; Notação binária: esta representação vem precedida de 0b ou 0B, indicando a notação: Ex.: x = 0B00001010; Notação Hexadecimal: esta representação vem precedida de 0x ou 0X: Ex.: x = 0x0A; _________________________________________________________________________ 32 – Carlos Eduardo Sandrini Luz Curso Linguagem C para microcontroladores PIC - 33 Capítulo 03 O PIC 18F4520 3.1 - Introdução O PIC 18F4520 é baseado na arquitetura Harvard com instruções do tipo RISC (Conjunto reduzido de instruções). Este microcontrolador utiliza a tecnologia nanoWatt desenvolvida pela Microchip, permitindo menor consumo de energia. Veja suas características abaixo: O modelo utilizado no curso possui 40 pinos, sendo que 35 podem ser configurados como portas de entrada/saída (I/O) e 1 como entrada; Frequência de operação: DC a 40 MHz; Memória Flash de 32KB; Memória de dados RAM de 1536 bytes; Memória de dados EEPROM de 256 bytes; 20 fontes de interrupção; 13 canais de conversão analógico-digital (A/D) de 10 bits cada; 1 módulo de comparação, captura e PWM (CCP); 1 módulo de comparação, captura e PWM melhorado (ECCP); 1 módulo SPI; 1 módulo I2C; 2 comparadores analógicos; 1 timer de 8 ou 16 bits (TIMER0), 2 times de 16 bits (TIMER1 e TIMER3) e 1 timer de 8 bits (TIMER2); 1 comunicação EUSART (modo USART melhorado); 1 módulo de detecção de alto-baixa tensão (HLVD). _________________________________________________________________________ 34 – Carlos Eduardo Sandrini Luz 3.2 - Pinagem do PIC 18F4520 Fig. 3.1 – Pinagem do PIC 18F4520 3.2.1 - Nomenclatura dos pinos Pino Nome Tipo Descrição 1 MCLR/VPP/RE3 E Master Clear Reset/ Entrada de tensão de programação/ Entrada de uso geral (bit 3 PORTA E). 2 RA0/AN0 E/S Entrada/saída de uso geral (bit 0 PORTA A) / Entrada do canal analógico 0 3 RA1/AN1 E/S Entrada/saída de uso geral (bit 1 da PORTA A) / Entrada do canal analógico 1. 4 RA2/AN2/VREF- /CVREF E/S Entrada/saída de uso geral (bit 2 da PORTA A) / Entrada do canal analógico 2 / Entrada de tensão negativa de referência para o conversor A/D / Saída de Vref do comparador analógico. 5 RA3/AN3/VREF+ E/S Entrada/saída de uso geral (bit 3 da PORTA A) / Entrada do canal analógico 3 / Entrada de tensão positiva de referência para o conversor A/D. 6 RA4/T0CKI /C1OUT E/S Entrada/saída de uso geral (bit 4 da PORTA A) / Entrada de clock externo para o TIMER0 / Saída do comparador 1. Curso Linguagem C para microcontroladores PIC - 35 7 RA5/AN4/SS /HLVDIN/C2OUT E/S Entrada/saída de uso geral (bit 5 da PORTA A) / Entrada do canal analógico 4 / Seleção para o modo SPI escravo / Entrada do módulo de detecção de alta tensão / Saída do comparador 2. 8 RE0/RD/AN5 E/S Entrada/saída de uso geral (bit 0 da porta E) / Controle de leitura para comunicação paralela / Entrada do canal analógico 5. 9 RE1/WR/AN6 E/S Entrada/saída de uso geral (bit 1 da porta E) / Controle de escrita para comunicação paralela / Entrada do canal analógico 6. 10 RE2/CS/AN7 E/S Entrada/saída de uso geral (bit 2 da porta E) / Controle de seleção para comunicação paralela / Entrada do canal analógico 7. 11 VDD Alimentação positiva do microcontrolador. 12 VSS Terra (Referência de alimentação). 13 OSC1/CLKI/RA7 E/S Entrada do cristal oscilador / Entrada para fonte de clock externo / Entrada/saída de uso geral (bit 7 da porta A). 14 OSC2/CLKO/RA6 E/S Saída do cristal oscilador / No Modo RC é configurado como saída com ¼ da frequência de CLKI/ Entrada/saída de uso geral (bit 6 da porta A). 15 RC0/T1OSO/ T13CKI E/S Entrada/saída de uso geral (bit 0 da porta C) / Saída do oscilador para o TIMER1 / Entrada para clock externo para o TIMER1 e TIMER3. 16 RC1/T1OSI/CCP2 E/S Entrada/saída de uso geral (bit 1 da porta C) / Entrada do oscilador para o TIMER1 / Entrada para o módulo capture2 e saídas para os módulos de compare2 e PWM2 (entrada padrão). 17 RC2/CCP1/P1A E/S Entrada/saída de uso geral (bit 2 da porta C) / Entrada para o módulo capture1 e saídas para os módulos compare1 e PWM1 / Saída do módulo CCP1 estendido. 18 RC3/SCK/SCL E/S Entrada/saída de uso geral (bit 3 da porta C) / Entrada/ saída do módulo serial síncrono SPI / Entrada/saída do módulo serial síncrona I2C. 19 RD0/PSP0 E/S Entrada/saída de uso geral (bit 0 da porta D) / Entrada/saída de dados para comunicação paralela. 20 RD1/PSP1 E/S Entrada/saída de uso geral (bit 1 da porta D) / Entrada/saída de dados para comunicação paralela. _________________________________________________________________________ 36 – Carlos Eduardo Sandrini Luz 21 RD2/PSP2 E/S Entrada/saída de uso geral (bit 2 da porta D) / Entrada/saída de dados para comunicação paralela. 22 RD3/PSP3 E/S Entrada/saída de uso geral (bit 3 da porta D) / Entrada/saída de dados para comunicação paralela. 23 RC4/SDI/SDA E/S Entrada/saída de uso geral (bit 4 da porta C) / Saída de dados para o módulo SPI / Entrada/saída de dados para o módulo I2C. 24 RC5/SDO E/S Entrada/saída de uso geral (bit 5 da porta C) / Saída de dados para o módulo SPI 25 RC6/TX/CK E/S Entrada/saída de uso geral (bit 6 da porta C) / Transmissão para o módulo assíncrono USART estendido / Clock para o módulo síncrono USART estendido. 26 RC7/RX/DT E/S Entrada/saída de uso geral (bit 7 da porta C) / recepção para o módulo assíncrono USART estendido / dado para o módulo síncrono USART estendido. 27 RD4/PSP4 E/S Entrada/saída de uso geral (bit 4 da porta D) / Entrada/saída de dados para comunicação paralela. 28 RD5/PSP5/P1B E/S Entrada/saída de uso geral (bit 5 da porta D) / Entrada/saída de dados para comunicação paralela / Saída do módulo CCP1 estendido. 29 RD6/PSP6/P1C E/S Entrada/saída de uso geral (bit 6 da porta D) / Entrada/saída de dados para comunicação paralela / Saída do módulo CCP1 estendido. 30 RD7/PSP7/P1D E/S Entrada/saída de uso geral (bit 7 da porta D) / Entrada/saída de dados para comunicação paralela / Saída do módulo CCP1 estendido. 31 VSS Terra (Referência de alimentação). 32 VDD Alimentação positiva do microcontrolador. 33 RB0/INT0/FLT0/ AN12 E/S Entrada/saída de uso geral (bit 0 da porta B) / Interrupção externa 0 / Entrada de falha para o módulo PWM estendido. / Entrada do canal analógico 12. 34 RB1/INT1/AN10 E/S Entrada/saída de uso geral (bit 1 da porta B) / Interrupção externa 1 / Entrada do canal analógico 10. Curso Linguagem C para microcontroladores PIC - 37 35 RB2/INT2/AN8 E/S Entrada/saída de uso geral (bit 2 da porta B) / Interrupção externa 2 / Entrada do canal analógico 8. 36 RB3/AN9/CCP2 E/S Entrada/saída de uso geral (bit 3 da porta B) / Entrada do canal analógico 9 / Entrada para o módulo capture2 e saídas para os módulos de compare2 e PWM2 (entrada alternativa). 37 RB4/KBI0/AN11 E/S Entrada/saída de uso geral (bit 4 da porta B) / Pino de interrupção na mudança de estado / Entrada do canal analógico 11. 38 RB5/KBI1/PGM E/S Entrada/saída de uso geral (bit 5 da porta B) / Pino de interrupção na mudança de estado / Pino de ativação para a programação ICSP em baixa tensão. 39 RB6/KBI2/PGC E/S Entrada/saída de uso geral (bit 6 da porta B) / Pino de interrupção na mudança de estado / Entrada de clock para a programação ICSP. 40 RB7/KBI3/PGD E/S Entrada/saída de uso geral (bit 7 da porta B) / Pino de interrupção na mudança de estado / Pino de dados para a programação ICSP. _________________________________________________________________________ 38 – Carlos Eduardo Sandrini Luz 3.3 - Estrutura interna do PIC 18F4420 e 18F4520 Fig. 3.2 - Estrutura interna do PIC 18F4420 e 18F4520 Curso Linguagem C para microcontroladores PIC - 39 3.4 - Oscilador No PIC18F4520, podemos encontrar 10 tipos de osciladores que podem ser configurados através dos bits de configuração. Estes bits de configuração também são conhecidos como fuses. Os tipos de osciladores são: LP – Cristal de baixa frequência; XT – Cristal com frequências intermediárias; HS – Cristal de alta frequência; HSPLL – Cristal de alta frequência com PLL; RC – Oscilador RC externo com saída de clock dividido por 4 no pino RA6; RCIO – Oscilador RC externo com o pino RA6 como pino de entrada/saída; INTIO1 – Oscilador interno com saída de clock no pino RA6 e pino RA7 como entrada/saída; INTIO2 – Oscilador interno com os pinos RA6 e RA7 como pinos de entrada/saída; EC – Oscilador externo com entrada de clock no pino RA7 e saída dividida por 4 no pino RA6; ECIO – Oscilador externo com entrada de clock no pino RA7 e com RA6 como entrada/saída. Nos tipos LP, XT e HS é utilizado oscilador a cristal e a frequência destes podem ser verificadas nos datasheets dos microcontroladores. No tipo HSPLL, o sinal de clock é utilizado como sincronismo para um circuito PLL (Phase Locked Loop) que gera na saída deste circuito um sinal de 4 vezes a frequência do sinal de referência. Neste caso, é possível, por exemplo, que o microcontrolador opere em 40MHz utilizando um cristal de 10MHz. Nos tipos RC e RCIO são utilizados um circuito RC externo, sendo que para o RC, é gerado um sinal no pino RA6 com uma frequência dividida por 4 da frequência originada pela fonte de clock. Nos tipos INTIO1 e INTIO2, o sinal de clock é interno e gerado a partir de um oscilador RC interno. O usuário pode escolher clocks de 31,25KHz, 125KHz, 250KHz, 500KHz, 1MHz, 2MHz, 4 MHz e 8MHz. Os sinal de 4MHz e 8MHz podem ser aplicados ao PLL e assim, obter frequências de 16MHz e 32MHZ, respectivamente. No tipo INTIO1, o sinal de clock pode ser obtido no pino RA6. _________________________________________________________________________ 40 – Carlos Eduardo Sandrini Luz Nos tipos EC e ECIO, o microcontrolador receberá um sinal de clock gerado por um oscilador externo no pino RA7 e no tipo EC, este sinal dividido por 4 poderá ser obtido no pino RA6. Os registradores de controle responsáveis pela seleção e controle dos osciladores, são OSCTUNE e OSCCON. 3.5 - RESET O PIC18F4520, assim como a linha 18F, possui diversas fontes de reset, conforme segue: POR (Power-on-reset): Quando da detecção da alimentação do microcontrolador; Nível 0 no pino MCLR; Nível 0 no MCLR com o microcontrolador em modo sleep; Estouro do Watchdog; BOR (Brown-out-reset): Queda de tensão de alimentação; Instrução RESET; Estouro da pilha. 3.6 - Memória Os microcontroladores PIC têm basicamente 3 tipos de memórias, sendo esta memória de programa, memória de dados e memória EEPROM. Na memória de programa são armazenadas as instruções (código do programa). Essa memória é do tipo não volátil, ou seja, seus dados não serão perdidos se a alimentação do microcontrolador for retirada. Na figura 3.3, temos o mapa da memória de programa para os PICs 18F2420/2520/4420/4520. Curso Linguagem C para microcontroladores PIC - 41 Fig. 3.3 – Mapa de memória dos PICs 18F2420/2520/4420/4520 A memória de dados é responsável pelos dados dos registradores de funções especiais (Special Function Registers – SFR) e também pelos registradores de propósito gerais (General Purpose Registers – GPR). Esta memória é do tipo volátil, ou seja, os seus valores armazenados serão perdidos na retirada de alimentação do microcontrolador. Obs.: Os SFRs contém a configuração, controle e status dos periféricos e portas de entrada e saída e os GPRs conterá os dados do usuário. Na figura 3.4, podemos ver o mapa de memória de dados para os PICs 18F2520 e 18F4520. _________________________________________________________________________ 42 – Carlos Eduardo Sandrini Luz Fig. 3.4 – Mapa de memória de dados para os PICs 18F2520 e 18F4520 A seguir, na figura 3.5, é visto o mapa dos registradores de funções especiais (SFRs). Curso Linguagem C para microcontroladores PIC - 43 Fig. 3.5 – mapa de registradores de funções especiais para o PIC 18F4520 A memória EEPROM que também é do tipo não volátil, permite o armazenamento e manipulação de dados. _________________________________________________________________________ 44 – Carlos Eduardo Sandrini Luz Curso Linguagem C para microcontroladores PIC - 45 Capítulo 04 Criando o primeiro programa 4.1 - O compilador CCS – PCWHD Fig. 4.1 - Interface de desenvolvimento do compilador CCS - PCWHD 4.1.1 - Criando um programa utilizando o compilador CCS Para criar um projeto, pode-se utilizar a função PIC Wizard que está no menu File->New da interface CCS, conforme mostrado na figura 4.2, porém, neste curso, criaremos somente o arquivo com extensão c (*.c). Fig. 4.2 - Utilizando o PIC Wizard para criar um projeto no CCS _________________________________________________________________________ 46 – Carlos Eduardo Sandrini Luz Para criarmos os programas com o compilador CCS, clique sobre o menu File, em seguida escolha a opção New e logo em seguida, selecione Source File, conforme a figura 4.3: Fig. 4.3 - Criando um arquivo *.c Escolha a pasta onde será armazenado o seu arquivo e dê um nome a ele com a extensão “.c”, conforme mostrado na figura 4.4 e salve o arquivo. Fig. 4.4 - Salvando o arquivo EX01.c Após isso, teremos um editor de texto onde será escrito o código do programa. Neste editor, digite o código de acordo com a figura 4.5: Fig. 4.5 - Escrevendo o código fonte Curso Linguagem C para microcontroladores PIC - 47 Após escrever o código, pressione as teclas Ctrl+Alt+F9 no computador ou clique no menu Compile e em seguida no botão Compile conforme a figura 4.6: Fig. 4.6 - Compilando o programa Com isso, o código será compilado: Fig. 4.7 - Compilando o programa Após a compilação, a janela Output e Memory Use (uso da memória) serão exibidas, de acordo com a figura 4.8: Fig. 4.8 - Programa compilado sem erros Note que a quantidade de memória RAM e a memória ROM estão em 0%. Bem, esse primeiro programa foi feito somente para verificarmos a maneira de escrever um código fonte e compilá-lo diretamente na interface do compilador _________________________________________________________________________ 48 – Carlos Eduardo Sandrini Luz CCS – PCWHD. 4.2 - Estrutura de um programa em C Em linguagem C, os programas podem ter uma ou mais funções, isso faz com que tenhamos uma estrutura modular, ou seja, com que tenhamos blocos que podem ser acessados em qualquer parte do programa facilitando a visualização e o entendimento do programa. Todo programa C tem uma função principal (main) e a partir dela o programa será inicializado. Estrutura básica de um programa em C no compilador CCS: #include<18F4520.h> /*Inclusão do arquivo header (*.h) para o microcontrolador utilizado*/ #use delay (clock=8000000) /*Definição da frequência do cristal para cálculo dos delays*/ #fuses HS, NOWDT, PUT, BROWNOUT, NOLVP //Configuração dos bits de controle void main() { //Inicio da função. //Este é o bloco principal do programa. while(true); //Loop infinito } //Final da função. Dentro da função principal void main(), serão escritos os códigos de inicialização para o microcontrolador, ou seja, os ajustes dos periféricos. Esta função também pode conter uma ou mais chamadas às outras funções, porém todo o processamento do microcontrolador se dá à partir da função principal. Na função main temos também o laço while com a condição sempre verdadeira (true), este laço é chamado de laço infinito e é o responsável por manter o processamento. Uma função sempre se inicializa com uma chave, em seguida vem o bloco principal do programa (onde o código será escrito) e finalizamos a função fechando a chave. Note também as duas barras (//) antes das explicações. Essas barras iniciam um comentário e tudo que vier após estas barras não será compilado pelo Curso Linguagem C para microcontroladores PIC - 49 programa. Uma outra maneira de incluir comentários pode ser vista a seguir: /*Temos aqui outra forma de comentário no programa. Esta maneira é indicada quando precisamos escrever um comentário com mais de uma linha.*/ Neste caso, o comentário tem seu início com /* e é finalizado com */. 4.3 – Diretivas As Diretivas são comandos internos e que não são compilados, sendo estas dirigidas ao pré-processador e executadas pelo compilador antes da execução do processo de compilação. #include<18F4520.h> /*Inclusão do arquivo header (*.h) para o microcontrolador utilizado*/ #use delay (clock=8000000) /*Definição da frequência do cristal para cálculo dos delays*/ #fuses HS, NOWDT, PUT, BROWNOUT, NOLVP //Configuração dos bits de controle A primeira diretiva #include insere um arquivo ao programa ou ao projeto, no nosso caso, estamos incluindo o arquivo “18F4520.h” que é um arquivo tipo ‘header’ (cabeçalho) cuja finalidade é definir o endereço na memória de algumas funções e identificações para o microcontrolador PIC18F4520. Este arquivo, geralmente, está localizado em C:\Arquivos de Programas\PICC\Devices. A diretiva #use delay informa ao compilador a velocidade de clock do sistema, sendo necessária para as funções de atraso (delay_us() e delay_ms()) e outras funções que envolvem tempo de atraso. O valor informado na diretiva é especificado em Hertz. A diretiva #fuses é utilizada para a configuração dos bits de controle (conhecidos como fusíveis). Estes bits de controle são responsáveis por informar ao microcontrolador como deverá ser o seu funcionamento, ou seja, que tipo de oscilador será utilizado, se terá algum tipo de proteção ou não, algumas opções de reset e temporização, etc. #fuses HS, NOWDT, PUT, BROWNOUT, NOLVP //Configuração dos bits de controle _________________________________________________________________________ 50 – Carlos Eduardo Sandrini Luz HS = Oscilador HS (oscilador a cristal >= 4MHz); NOWDT = Watchdog desabilitado; PUT = Power Up Time habilitado; BROWNOUT = Brownout reset habilitado; NOLVP = Desabilitada programação por baixa tensão. Como podemos notar, temos somente 5 bits de controle configurados, porém existem mais bits de controle que precisam ser configurados para que o funcionamento do microcontrolador seja adequado. Na realidade, o compilador CCS já possui uma pré-configuração destes bits e para que possamos vê-las, basta clicar no menu Compile e, em seguida, no botão C/ASM List. Esta opção nos mostrará o código compilado em Assembly e, no final deste arquivo, temos a informação Configuration Fuses, conforme a figura a 4.20: Fig. 4.20 - Configurações dos bits de controle – fuses Verifica-se, através das configurações mostradas na figura que agora temos todos os bits de controle configurados. Note que as configurações, que fizemos pela diretiva fuses, se mantêm e, as que não foram definidas nesta diretiva, serão feitas automaticamente pelo compilador mantendo um padrão inicial. Curso Linguagem C para microcontroladores PIC - 51 Para ver o padrão utilizado pelo compilador, apenas comente a linha da diretiva fuses, compile novamente o arquivo e verifique o código em Assembly. Veja todas as opções de configuração dos bits de controle para o microcontrolador PIC 18F4520 a seguir: Fuse Descrição LP Oscilador LP (< 200 KHz) XT Oscilador XT (Oscilador a cristal <= 4MHz) HS Oscilador HS (oscilador a cristal >= 4MHz) H4 Habilita módulo PLL -> Freq x 4 EC Clock externo com CLKOUT EC_IO Clock externo INTRC_IO Oscilador RC interno, sem CLKOUT INTRC Oscilador RC interno RC_IO Oscilador RC com CLKOUT RC Oscilador RC (Resistor/Capacitor) NOWDT Watchdog desabilitado WDT Watchdog habilitado WDT1 Postscale watchdog em 1:1 WDT2 Postscale watchdog em 1:2 WDT4 Postscale watchdog em 1:4 WDT8 Postscale watchdog em 1:8 WDT16 Postscale watchdog em 1:16 _________________________________________________________________________ 52 – Carlos Eduardo Sandrini Luz WDT32 Postscale watchdog em 1:32 WDT64 Postscale watchdog em 1:64 WDT128 Postscale watchdog em 1:128 WDT256 Postscale watchdog em 1:256 WDT512 Postscale watchdog em 1:512 WDT1024 Postscale watchdog em 1:1024 WDT2048 Postscale watchdog em 1:2048 WDT4096 Postscale watchdog em 1:4096 WDT8192 Postscale watchdog em 1:8192 WDT16384 Postscale watchdog em 1:16384 WDT32768 Postscale watchdog em 1:32768 CCP2C1 Define o pino RC1 como pino de entrada/saída a ser utilizado pelo módulo CCP2 CCP2B3 Define o pino RB3 como pino de entrada/saída a ser utilizado pelo módulo CCP2 NOPBADEN Configura os pinos RB0, RB1, RB2, RB3 e RB4 como pinos de entrada/saída PBADEN Configura os pinos RB0, RB1, RB2, RB3 e RB4 como canais de entrada analógicos AN12, AN10, AN8, AN9 e AN11, respectivamente NOPUT Temporizador Power-up desligado PUT Temporizador Power-up ligado NOLTP1OSC TIMER1 configurado para operação em alta potência Curso Linguagem C para microcontroladores PIC - 53 LPT1OSC TIMER1 configurado para operação em baixa potência NOMCLR Master Clear desabilitado, pino 1 configurado como entrada (RE3) MCLR Master Clear habilitado NOPROTECT Proteção de código desabilitada PROTECT Proteção de código habilitada NOBROWNOUT Reset por queda de tensão desabilitado BROWNOUT Reset por queda de tensão habilitado BROWNOUT_NOSL Reset por queda de tensão habilitado durante a operação e desabilitado durante o modo SLEEP BROWNOUT_SW Reset por queda de tensão controlado via software BORV20 Reset por queda de tensão abaixo de 2,0V BORV27 Reset por queda de tensão abaixo de 2,7V BORV42 Reset por queda de tensão abaixo de 4,2V BORV45 Reset por queda de tensão abaixo de 4,5V NOLVP Programação em baixa tensão desabilitada LVP Programação em baixa tensão habilitada. NOCPD Proteção da EEPROM habilitada CPD Proteção da EEPROM desabilitada NOIESO Mudança do oscilador interno/externo desabilitada IESO Mudança do oscilador interno/externo habilitada NOFCMEN Desabilita o monitoramento do sinal de clock FCMEN Habilita o monitoramento do sinal de clock _________________________________________________________________________ 54 – Carlos Eduardo Sandrini Luz NOSTVREN Desabilita o reset por Stack Full/Underflow STVREN Habilita o reset por Stack Full/Underflow NOXINST Set de instruções estendido e modo de endereçamento indexado desabilitado XINST Set de instruções estendido e modo de endereçamento indexado habilitado NOCPB Código no bloco boot não protegido CPB Código no bloco boot (000000-007FFFh) protegido NOCPD Código na EEPROM não protegido CPD Código na EEPROM protegido NOWRT Proteção da memória de programa desabilitada WRT Proteção da memória de programa habilitada NOWRTB Proteção de escrita no bloco boot não habilitada WRTB Proteção de escrita no bloco boot (000000-007FFFh) habilitada NOWRTC Proteção de escrita no registrador de configuração não habilitada WRTC Proteção de escrita no registrador de configuração (300000-30000FFh) habilitada NOWRTD Proteção de escrita na EEPROM não habilitada WRTD Proteção de escrita na EEPROM habilitada NOEBTR Proteção contra comando de leitura da tabela executado por outro bloco desabilitada EBTR Proteção contra comando de leitura da tabela executado por outro bloco Curso Linguagem C para microcontroladores PIC - 55 NOEBTRB Proteção contra comando de leitura do bloco boot executado por outro bloco desabilitada EBTRB Proteção contra comando de leitura do bloco boot executado por outro bloco NODEBUG Depuração pelo ICD desabilitada DEBUG Depuração pelo ICD habilitada Pode-se visualizar todos os bits de controle disponíveis para um microcontrolador específico o menu View e pressionando o botão Config Bits (figura 4.21). Fig. 4.21 – Acesso aos bits de controle disponíveis Na janela que será aberta, escolha o microcontrolador desejado para visualizar todos bits de controle disponíveis e as suas descrições, conforme mostra a figura 4.22 a seguir. _________________________________________________________________________ 56 – Carlos Eduardo Sandrini Luz Fig. 4.22 – Bits de controle e descrição Curso Linguagem C para microcontroladores PIC - 57 Capítulo 05 Entradas e saídas (I/O) 5.1 - Ciclo de Máquina A entrada de clock para o microcontrolador, seja ela interna ou externa, é dividida internamente por 4, gerando, assim, 4 fases (Q1, Q2, Q3 e Q4). Internamente, o contador de programa (program counter – PC) é incrementado na fase Q1 onde a instrução é localizada na memória de programa e carregada no registro de instrução na fase Q4, então a instrução é decodificada e executada durante os ciclos Q2, Q3 e Q4. Fig. 5.1 – Ciclos de máquina Conforme podemos ver na figura 5.1, cada ciclo de máquina executa duas funções ao mesmo tempo, ou seja, no mesmo tempo em que uma instrução é executada, a próxima instrução é localizada e carregada no registro de instrução. A essa tecnologia é dado o nome de PIPELINE e que resulta no aumento da velocidade de processamento. Sendo assim, para obtermos a frequência para o cálculo do ciclo de máquina, é necessário dividir o sinal de entrada de clock interno ou externo por 4. Por exemplo: Supondo que contamos com um cristal de 8MHz como fonte de clock para o microcontrolador, então teremos: Frequência de operação: 𝐹𝑟𝑒𝑞 = 8𝑀𝐻𝑧 4 = 2𝑀𝐻𝑧 _________________________________________________________________________ 58 – Carlos Eduardo Sandrini Luz Ciclo de máquina: 𝐶𝑖𝑐𝑙𝑜 = 1 𝐹𝑟𝑒𝑞 = 1 2𝑀𝐻𝑧 = 0,5𝑢𝑠 5.2 - Portas de entrada/saída (I/O) No PIC18F4520, cinco portas estão disponíveis, nomeadas como A, B, C, D e E, sendo que alguns pinos dessas portas podem ter outras funções. De modo geral, quando o pino é utilizado para outra função, este não poderá ser utilizado com pino de I/O. Cada porta tem 3 registradores para sua correta operação: - Registrador TRISx, que é o responsável pelo direcionamento (entrada ou saída) das portas, onde se um bit estiver em 0, o pino referente será um pino de saída e se o bit estiver em 1, o pino referente será um pino de entrada; - Registrador PORTx, responsável por escrever ou ler o nível dos pinos associados à porta; - Registrador LATx, responsável por armazenar o valor do último comando de escrita. Obs.: x representa uma das portas disponíveis para o microcontrolador. 5.2.1 - Registrador TRISx O registrador TRISx, como já vimos, é o responsável pelo direcionamento no sentido do fluxo de dados de uma determinada porta. Esse registrador possui 8 bits, sendo cada bit correspondente a um determinado pino de I/O. Podemos identificar os registradores de acesso como TRISA, TRISB, TRISC, TRISD e TRISE. O compilador CCS, por padrão, faz automaticamente o direcionamento dos pinos dos registradores TRISx através das funções de saída ou de entrada, porém o programador pode desabilitar esta forma de configuração e fazer, via programação, o direcionamento dos pinos.
Compartilhar