Sie sind auf Seite 1von 100

www.mecatronicadegaragem.blogspot.

com

ndice
Introduo -------------------------------------------------------------------------- Linguagem C --------------------------------------------------------------------- Microcontrolador ---------------------------------------------------------------Estrutura Interna do 18F452 -----------------------------------------------------Funo de cada pino do 18F452 ------------------------------------------------Mapa de Registradores Especiais ----------------------------------------------Princpio de Programao --------------------------------------------------------Introduo Linguagem C -------------------------------------------------------- Representao numrica --------------------------------------------------------- Tipos de dados -------------------------------------------------------------------- Varivel local e global ----------------------------------------------------------- Operadores matemticos --------------------------------------------------------- Controle de Fluxo ----------------------------------------------------------------- Deciso IF -------------------------------------------------------------------------- Deciso IF-ELSE ------------------------------------------------------------------- Deciso SWITCH-CASE --------------------------------------------------------- Loop FOR --------------------------------------------------------------------------- Loop WHILE ----------------------------------------------------------------------- Loop DO-WHILE ------------------------------------------------------------------ Ponteiros e Matrizes --------------------------------------------------------------- Introduo ao MikroC ------------------------------------------------------------- Ambiente MikroC ------------------------------------------------------------------ Criando um Projeto ---------------------------------------------------------------- Device Flags (bits de configurao) --------------------------------------------- Primeiro Projeto -------------------------------------------------------------------- Programa 1 Configurao das portas ------------------------------------------ Gravando o Primeiro Projeto ----------------------------------------------------- Usando o Debug no MikroC ------------------------------------------------------ Programa 2 Uso do Define ------------------------------------------------------ Programa 3 Acionamento de Botes ------------------------------------------- Programa 4 Utilizao do IF-ELSE -------------------------------------------- Programa 5 Utilizao do IF_ELSE -------------------------------------------- Programa 6 Utilizao do IF-ELSE-IF ----------------------------------------- Programa 7 Funo Button ------------------------------------------------------- Programa 8 Eliminando Problema do Debounce ----------------------------- Declarao de Funes ------------------------------------------------------------- Display LCD ------------------------------------------------------------------------- Comandos do LCD ------------------------------------------------------------------ Configurao Modo 4 e Modo 8 Bits --------------------------------------------- Programa 9 Transmisso de mensagem para LCD ------------------------- Programa 10 Transmisso de mensagens para LCD -------------------------- Configuraes do LCD em 4 Bits e 8 Bits --------------------------------------- Mdulo PWM ------------------------------------------------------------------------ Programa 11 - Utilizao do CCP1 ----------------------------------------------- Programa 12 - Utilizao do CCP2 ----------------------------------------------- Programa 13 Utilizando os Mdulos CCP1 e CCP2 ------------------------1 3 3 4 5 6 8 10 11 11 12 13 14 14 15 15 17 18 18 19 20 21 22 23 24 29 30 32 35 39 40 41 42 43 44 45 46 48 49 50 51 52 53 54 55 55 56

www.mecatronicadegaragem.blogspot.com

- Programa 14 Ajustando os Mdulos usando botes -------------------------- Conversor A/D ----------------------------------------------------------------------- Programa 15 Leitura do Canal AN0 (0 a 1023) ------------------------------- Programa 16 Leitura do canal AN0 (0 a 5V) ---------------------------------- Programa 17 Leitura do Canal A/D com ponto flutuante -------------------- Programa 18 Controle PWM usando conversor A/D ------------------------- Comunicao Serial ----------------------------------------------------------------- Programa 19 Transmisso de dado Serial -------------------------------------- Programa 20 Transmisso/Recepo Serial ------------------------------------ Programa 21 Transmisso/Recepo de Dados-------------------------------- Programa 22 - Uso de Ponteiros na Transmisso de Dados -------------------- Programa 23 Transmisso de Dados -------------------------------------------- Programa 24 Leitura de Temperatura e Transmisso Serial ----------------- Programa 25 Leitura de Temperatura, Comparao e Acionamentos ------ Programa 26 Configurao do TIMER0 em 8 bits Temporizador ------- Programa 27 Configurao do TIMER0 em 16 bits Temporizador ----- Programa 28 Configurao do TIMER0 em 8 bits Contador ------------- Programa 29 Memria EEPROM do PIC -------------------------------------- Introduo a Interrupo ------------------------------------------------------------ Registrador RCON ------------------------------------------------------------------ Registrador INTCON ---------------------------------------------------------------- Registrador INTCON2 ---------------------------------------------------------------- Registrador INTCON3 ---------------------------------------------------------------- Registrador PIE1 ----------------------------------------------------------------------- Registrador PIE2 ----------------------------------------------------------------------- Registrador PIR1 ----------------------------------------------------------------------- Registrador PIR2 ----------------------------------------------------------------------- Registrador IPR1 ----------------------------------------------------------------------- Registrador IPR2 ----------------------------------------------------------------------- Estrutura de Programa utilizando Alta e Baixa Prioridade ----------------------- Programa 30 Tratamento de Interrupo INT0 ---------------------------------- Programa 31 Tratamento de Interrupo INT0 e INT1 ------------------------ Programa 32 Tratamento de Interrupo INT0 e INT1 com Prioridade -----

57 58 63 64 65 66 67 67 68 69 70 71 73 74 79 80 81 82 84 85 86 87 88 89 90 91 92 93 94 94 95 97 99

www.mecatronicadegaragem.blogspot.com

Introduo:
Linguagem C Linguagem C foi desenvolvida por Brian Kernighan e Dennis M. Ritchie na dcada de 70 no AT&T Bell Labs. Em pouco tempo, esta linguagem teve grande utilizao em Universidades espalhadas pelo Mundo, tornando-se praticamente oficial em cursos de engenharias. uma linguagem estruturada, eficiente, rpida e to poderosa quanto a Linguagem Assembly. A cada ano vem aumentando o nmero de programadores de Microcontroladores que acabam migrando da Linguagem Assembly para o C. Os programas em C acabam ficando muito mais eficientes e mais rpidos de serem escritos pois os Compiladores de Programas em Linguagem C para Microcontroladores possuem vrias bibliotecas de funes prontas como Comunicao Serial, ADC, EEPRON, I2C, PWM, LCD, etc. Existe no mercado vrios compiladores para desenvolvimento de programas na Linguagem C como Hi-Tech, CCS, PICmicro C, etc. Adotamos para nosso treinamento o compilador MikroC da Microelektronika por ser bastante poderosa e fcil de trabalhar (permite Editar, Simular e Compilar programas das famlias 12, 16 e 18 da Microchip) alm de tambm possuir uma vasta biblioteca de controle de perifricos dos Microcontroladores. Alm disso, a verso estudante gratuito para desenvolvimento de programas de at 2Kwords, o que torna bastante atraente tambm para uso educacional. Pode-se fazer download em www.mikroe.com. Contudo, uma das grandes vantagens de se programar em C que o programador no precisa se preocupar com o acesso a bancos, localizao de memria e perifricos dos Microcontroladores pois o Compilador responsvel por gerenciar esses controles. Toda essa eficincia da Linguagem C proporciona ao programador preocupar-se apenas com o programa em si e o compilador traduz da Linguagem C para a Linguagem de mquina (.HEX) que a linguagem que os Microcontroladores conseguem entender.

www.mecatronicadegaragem.blogspot.com

Microcontrolador Hoje existe uma grande quantidade de Microcontroladores utilizados em projetos de equipamentos eletroeletrnicos. O programador poder escolher entre Intel, Motorola, Atmel, Microchip, etc. A Uptex decidiu pela Microchip pois a mesma encontra-se entre os mais utilizados mundialmente alm de tambm oferecer muitos de seus compiladores gratuitamente. Existe tambm uma vasta literatura orientando profissionais e estudantes quanto s aplicaes e projetos. Isto tudo pode ser verificado no site da Microchip em (Aplication Notes). Aplicas com Dislays LCD (Display de Cristal Lquido), Displays e matrizes de leds, Comunicao Serial, USB, Conversores Analgico/Digital e Controle PWM so alguns exemplos de utilizao em equipamentos suportados por microcontroladores. s verificarmos os equipamentos hoje microcontrolados e pensarmos na evoluo que existe e tudo ainda que possa a vir a existir. Vejamos alguns exemplos de equipamentos: celulares, mquinas de lavar/secar roupas, sistemas de alarme e controle de acesso, brinquedos, iluminao residencial, etc. Existem muitas aplicaes tambm na rea automobilstica, aeroespacial, mdica, agricultura e muitas mais. Agora com voc programador que tm a habilidade de verificar a necessidade e proporcionar ento a funcionalidade de determinado aparelho/sistema atravs de um sistema microcontrolado. O Microcontrolador que iremos trabalhar ser o 18F452 da Microchip. A grande vantagem que possui memria Flash, possibilitando assim escrever/apagar com grande rapidez. Abaixo temos principais caractersticas do 18F452: - 40 pinos podendo ter at 34 I/O (Input/Output digital); - 8 canais A/D de 10 Bits; - 02 Mdulos CCP capture, compare e PWM; - Memria de Programa Flash 32K - Memria RAM 1536 bytes; - Memria EEPROM 256 bytes; - velocidade de processamento at 10MIPS (milhes de instrues por segundo); - Mdulo MSSP (Master Synchronous Serial Port); - Mdulo USART - Possibilita at 100.000 ciclos de escrita/leitura na memria de programa; - Possibilita 1.000.000 de ciclos de escrita/leitura na EEPROM; - Reteno dos dados na memria por at 40 anos; - Possibilita habilitao do Watchdog Timer; - Possibilita interrupo externa atravs de pinos do Microcontrolador; - 4 Temporizadores/Contadores.

www.mecatronicadegaragem.blogspot.com

Estrutura Interna do PIC 18F452

www.mecatronicadegaragem.blogspot.com

Funo de cada pino do 18F452

O PIC 18F452 possui cinco PORTs: PORTA, PORTB, PORTC, PORTD e PORTE. Cada PORT possui pinos com acesso aos perifricos como Conversor Analgico/Digital, Interrupes, I2C, UART, Mdulo CCP, SPI, ou podem ser utilizados como I/O de uso geral. Pino 1 2 3 4 5 6 7 8 9 10 Funo /MCLR / VPP RA0 / AN0 Tipo In-In I/O e input A/D RA1 / AN1 I/O e input A/D RA2 / AN2/ VrefI/O e input A/D RA3/AN3/ Vref+ I/O e input A/D RA4 / T0CKI I/O e Input TMR0 RA5/AN4/SS/LVDIN I/O e Inputs RE0 / RD / AN5 RE1 / WR / AN6 RE2 / CS / AN7 I/O I/O I/O Fonte Fonte Input I/O e Inputs I/O Out e In Funcionalidade Reset externo e programao ICSP I/O digital e entrada do AD0 I/O digital e entrada do AD1 I/O digital, entrada do AD2 e entrada baixa de referncia do A/D I/O digital, entrada do AD3 e entrada de referncia alta do A/D I/O digital e entrada do TMR0 I/O digital, entrada do AD4, entrada do SPI e Detector de LV I/O digital, Leitura da Porta Paralela e entrada do AD5 I/O digital, Escrita da Porta Paralela e entrada do AD6 I/O digital, Seleo da Porta Paralela e entrada do AD7 Positivo da Fonte de Alimentao Negativo da Fonte de Alimentao Entrada do Cristal e entrada do Clock externo I/O digital, Sada do Cristal e sada do Clock externo I/O digital, sada do 2 oscilador e entrada do contador externo Timer1/Timer3

11, 32 VCC 12, 31 GND 13 OSC1 / CLK1 14 15 Osc2 / CLK1 / RA6 RC0/T10S0/T1Ck1

www.mecatronicadegaragem.blogspot.com

16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 33 34 35 36 37 38 39 40

RC1/T10S1/CCP2 RC2 / CCP1 Rc3 / SCK / SCL RD0 / PSP0 RD1 / PSP1 RD2 / PSP2 RD3 / PSP3 RC4 / SDI / SDA RC5 / SD0 RC6 / TX / CK RC7 / RX / DT RD4 / PSP4 RD5 / PSP5 RD6 / PSP6 RD7 / PSP7 RB0 / INT0 RB1 / INT1 RB2 / INT2 RB3 / CCP2 RB4 RB5 / PGM RB6 / PGC RB7 / PGD

I/O In e Out I/O e Out I/O, I/O e I/O I/O e I/O I/O e I/O I/O e I/O I/O e I/O I/O in I/O I/O e out I/O out I/O I/O in I/O I/O e I/O I/O e I/O I/O e I/O I/O e I/O I/O e in I/O e in I/O e in I/O e I/O I/O e in I/O in e in I/O in I/O I/O in I/O

I/O digital, entrada do 2 oscilador e sada do Mdulo CCP2 I/O digital e sada do Mdulo CCP1 I/O digital, in e out do Clock serial para modo SPI e in/out do Clock serial para modo I2C I/O digital e Porta de Comunicao Paralela I/O digital e Porta de Comunicao Paralela I/O digital e Porta de Comunicao Paralela I/O digital e Porta de Comunicao Paralela I/O digital, entrada de Dados SPI e in/out de dados do modo I2C I/O digital e sada de dados SPI I/O digital, Transmisso UART e Clock de sincronismo UART I/O digital, Recepo UART e Dados do UART I/O digital e Porta de Comunicao Paralela I/O digital e Porta de Comunicao Paralela I/O digital e Porta de Comunicao Paralela I/O digital e Porta de Comunicao Paralela I/O digital e entrada de Interrupo Externa 0 I/O digital e entrada de Interrupo Externa 1 I/O digital e entrada de Interrupo Externa 2 I/O digital Mdulo CCP2 I/O digital e entrada de Interrupo por Mudana de Estado I/O digital, Interrupo por Mudana de Estado e Habilita ICSP baixa tenso I/O digital, Interrupo por Mudana de Estado e ICSP in-circuit Debuger I/O digital, Interrupo por Mudana de Estado e ICSP in-circuit Debuger

www.mecatronicadegaragem.blogspot.com

Nos Microcontroladores PIC temos os GPR (General Porpose Registers) que so os registradores de usos gerais que nada mais so do que variveis criadas pelo programador dados volteis. Temos tambm os SFR(Special Funcion Registers) que so os Registradores de uso especfico que na verdade contm o SETUP do Microcontrolador configura como iro trabalhar determinados perifricos como PWM, Conversores A/D, USART, etc. O Microcontrolador 18F452 possui memria RAM de 1536 bytes sendo dividido em 16 bancos de 256 bytes de memria cada um.

Mapa de Registradores Especiais SFRs

www.mecatronicadegaragem.blogspot.com

Temos ento Portas: PORTA PORTE e cada pino de cada porta pode ser configurado como entrada ou sada. No entanto, para podermos configurar como ir trabalhar cada pino de cada porta, temos que fazer uso do SFR TRIS. O Registrador TRISA responsvel pela configurao do PORTA, o TRISB pelo PORTB, o TRISC pelo PORTC, o TRISD pelo PORTD e o TRISE pelo PORTE. muito simples, se colocarmos 0 no bit do TRIS estamos definindo determinado pino como sada e colocando-se 1 no bit do TRIS estamos definindo o pino do PORT como entrada. Vejamos um exemplo: TRISB=0b00001100; Neste caso temos: RB0=sada RB1=sada RB2=entrada RB3=entrada RB4 RB7 = sada Outro exemplo: TRISD=0b11111111; Neste caso temos todo o PORTD configurado como entrada Outro exemplo: TRISC=0b00000000; Neste caso temos todo o PORTC configurado como sada Os outros Registros Especiais iremos entender conforme andamento do curso.

www.mecatronicadegaragem.blogspot.com

Princpio de Programao: A lgebra de Boole e seus operadores so muito utilizados em sistemas digitais e tambm na programao em Linguagens como o Assembly e tambm a Linguagem C. Temos ento as operaes E ou AND, OU ou OR e No ou NOT e tambm NAND, NOR ou XOR ( OR EXCLUSIVO). OR A 0 0 1 1 B 0 1 0 1 S 0 1 1 1 S 0 0 0 1

AND A B 0 0 0 1 1 0 1 1 NOT A S 0 1 1 0 NOR A B 0 0 0 1 1 0 1 1 NAND A B 0 0 0 1 1 0 1 1 XOR A B 0 0 0 1 1 0 1 1

S 1 1 1 0 S 1 0 0 0

S 0 1 1 0

10

www.mecatronicadegaragem.blogspot.com

Introduo Linguagem C Estrutura Bsica de um programa: Programas em C so baseados em uma ou mais funes que sero executadas, no entanto, a funo Main() a primeira a ser executada. /* ------------------------------------------------abaixo temos um exemplo de estrutura Bsica de um programa em Linguagem C ----------------------------------------------------- */ void main() { Trisb=0x00; Portb=0xFF; } // esta a primeira funo que ser executada // inicializa a funo // aqui entram os comandos que sero executados // finaliza a funo

Observaes: Toda funo deve iniciar abrindo chave e finalizar fechando-se a chave. Toda instruo deve ser finalizada com ponto e vrgula (obrigatoriamente) Logo aps /* so inseridos os comentrios para mltiplas linhas e deve-se Colocar */ para fechar o bloco de comentrios. Utilizamos // para comentrios em apenas uma linha. Representao Numrica: Decimal: Contador=125; Binrio: Portb=0b11010011; Hexadecimal: Varivel1=0xA4; Octal: Teste=075; String: Unsigned char *texto=Uptex Tecnologia Caracter: Usart_write(&);

11

www.mecatronicadegaragem.blogspot.com

Tipos de Dados: Dado: int char float e double void Tipo Void Char Int Short Long Float Double Modificadores: Tipo Char signed char unsigned char Short int signed short int unsigned short int Int signed unsigned int Short signed short unsigned short long int signed long int unsigned long int Tipo: Nmeros inteiros Caracteres Nmeros decimais (ponto flutuante) valores nulos Tamanho bits Zero 8 16 16 32 32 64 Tamanho - bits 8 8 8 8 8 8 16 16 16 16 16 16 32 32 32 Valor Mnimo Sem valor -128 -32768 -32768 -231 -3,4 x 1038 -1,8 x 10308 Valor Mnimo -128 -128 0 -128 -128 0 -32768 -32768 0 -32768 -32768 0 -231 -231 0 Valor Mximo Sem valor 127 32767 32767 231-1 3,4 x 1038 1,8 x 10308 Valor Mximo 127 127 255 127 127 255 32767 32767 65535 32767 32767 65535 231-1 231-1 232-1

12

www.mecatronicadegaragem.blogspot.com

Declarao de variveis: Podemos declarar da seguinte maneira: <qualificador> + <tipo> + <nome da varivel> + <valor>; Obs: valor pode ou no necessariamente ser inicializado. Exemplos: int contador; short var1; unsigned int contagem = 30500; Observe agora como atribuir valores s variveis: Contador = 10; Var1 = 25; Varivel local: Esta declarada dentro da funo e s pode ser utilizada pela funo portanto, uma varivel temporria. Exemplo: void subrotina_soma () { unsigned Int valor1, valor2; valor1=A; valor2=B; return(valor1+valor2); } Varivel Global: Esta declarada fora da funo e s pode ser utilizada por qualquer funo em qualquer momento. Todas as funes tm acesso s variveis globais. Exemplo: unsigned int valor1, valor 2 void subrotina_soma () { valor1=A; valor2=B; return(valor1+valor2); } // atribui o valor 10 varivel contador // atribui o valor 25 varivel Var1

13

www.mecatronicadegaragem.blogspot.com

Operadores Matemticos: Aritmticos: Operador + * / % ++ -Descrio Soma dos argumentos Subtrao dos argumentos Multiplicao dos argumentos Diviso dos argumentos Resto da diviso Soma 1 ao argumento (a=a+1) Subtrai 1 ao argumento (a=a-1) Exemplo a+b ab a*b a/b a%b a++ a--

Relacionais: Operador > < >= <= == != Lgicos: Operador && || ! Descrio Lgica E (AND) Lgica OU (OR) Complemento (NOT) Descrio Maior que Menor que Maior ou igual que Menor ou igual que Igual Diferente

Operadores bit a bit: Operador & | ^ ~ >> << Descrio Lgica E (AND) Lgica ou (OR) Lgica OU-Exclusivo Complemento (NOT) Deslocamento direita Deslocamento esquerda

14

www.mecatronicadegaragem.blogspot.com

Controle de Fluxo: Deciso IF: Sintaxe: if (expresso) comando; A expresso avaliada e se for verdadeiro executa o comando. Podemos ter tambm mais que um comando: Sintaxe if (expresso) { comando1; comando2; comandoN; } Exemplo: If (conta == 5) { a=a++; portc=0xFF; } Deciso IF-ELSE: Sintaxe: if (expresso) comando1; else comando2; Neste caso, temos duas possibilidades. Se comando for verdadeiro, comando1 executado, caso seja falso, comando2 ser executado. Podemos ter tambm vrios comandos: if (expresso) { comando1; comando2; comando3; } else { comando4; comando5; }

15

www.mecatronicadegaragem.blogspot.com

Exemplo: if (a>22) { Valor1=x; y=contador+10; } else { Valor2=x; Y=contador-5; } Podemos ainda ter superposio de comandos if-else podendo assim ter uma escolha entre vrias possibilidades. if (expresso1) { comando1; } else if (expresso2) { comando2; comando3; } else { comando4; comando5; } Exemplo: if (contador==12) { Dzia++; X++; } else if (contador<12) { Dzia=0; y--; } else if (contador>12) { Dzia = 0; Z++; }

16

www.mecatronicadegaragem.blogspot.com

Deciso SWITCH - CASE: switch (varivel) { case valor1: comando1; comando2; break; case valor2: comando3; comando4; comando5; break; default: comando6; } //opcional

Exemplo: void main( ) { int contagem=4; int valor=5; switch (contagem) { case 2: valor++; break; case 5: valor--; break; case 10: valor=0; break; default: valor=5; } }

17

www.mecatronicadegaragem.blogspot.com

Loop FOR: Este um comando de lao (loop ou repetio). Sintaxe: for (inicializao; condio (trmino); incremento) comando; Podemos tambm ter um bloco de comandos: for (inicializao; condio (trmino); incremento) { comando1; comando2; comandoN; } Exemplo: void main () { int contador; int a = 0; for (contador=0; contador<=10; contador++) a=a+contador; }

Loop While: Neste caso, o loop repetido enquanto a expresso for verdadeira. Sintaxe: while (expresso) { comando1; comando2; } feita a avaliao no incio do loop e, enquanto verdadeira, os comandos sero executados. Ao trmino do ltimo comando, volta a ser testada a expresso e caso seja falsa, o loop finalizado.

18

www.mecatronicadegaragem.blogspot.com

Exemplo: void main( ) { int a=15; While (a>10) { a--; delay_ms(100); } } Loop DO - WHILE: Neste caso, diferente do loop anterior (while), o do - while executa pelo menos uma vez o bloco de comando antes de fazer a avaliao se continua a executar os comandos ou sai do loop. Sintaxe: do { comando1; comando2; } while (expresso); Exemplo: void main( ) { int a=0; do { a++; delay_ms(100); } while (a<100); }

19

www.mecatronicadegaragem.blogspot.com

Ponteiros: Podemos afirmar que um ponteiro na verdade uma varivel onde ser armazenado o endereo de outra varivel, ou seja, o ponteiro um apontador para outra varivel. Sintaxe: tipo *nome tipo um tipo de dado e nome o nome da varivel. Exemplo: int *idade; Uso de ponteiros ser utilizado quando estudarmos comunicao serial. Aguarde!

Matrizes: uma estrutura de dados que pode armazenar vrios valores de mesmo tipo. Sintaxe: Tipo Nome [quantidade]; Tipo o tipo de dado a ser colocado na matriz. Obs: todos os dados devem ser do mesmo tipo. Nome identifica a matriz. Quantidade o nmero de itens que sero armazenados na matriz. Exemplo: int notas_sala[28]; esta matriz pode armazenar 28 valores do tipo int. float velocidade[50]; esta matriz pode armazenar 50 valores do tipo float. Primeiro elemento velocidade[0] e ltimo elemento velocidade[49]. Podemos tambm inicializar os elementos de uma matriz. Sintaxe: int notas_classe={25,57,68,95,50}

20

www.mecatronicadegaragem.blogspot.com

Introduo ao MikroC: O MikroC um compilador desenvolvido e tambm comercializado pela empresa MikroElektroniKa. composto de um IDE (Sistema Integrado de Desenvolvimento) abrangendo toda a linha dos PICs das famlias 12,14,16 e 18 da Microchip. Este Software pode ser baixado no site www.mikroe.com e sua verso free possui limite de 2K words. Caso ultrapasse este valor, necessrio adquirir a verso full junto ao fabricante. Neste compilador encontramos uma vasta biblioteca de Funes: - ADC Library - CAN Library - CANSPI Library - EEPRON Library - Ethernet Library - SPI Ethernet Library - I2C Library - LCD Library - One Wire Library - PWM Library - PS2 Library - RS485 Library - SPI Library - UART Library - USB Library Bibliotecas ANSI C Stardard Demais Bibliotecas - Trigonometry Library - Time Library

21

www.mecatronicadegaragem.blogspot.com

Ambiente MikroC: Abaixo segue a tela inicial do compilador MikroC onde iremos desenvolver nossos projetos.

22

www.mecatronicadegaragem.blogspot.com

Criando um Projeto: Para iniciar o desenvolvimento necessitamos inicialmente criar um projeto pois o compilador trabalha com esta concepo. Para isso, basta clicar em <Project> e em seguida <New Project>. Teremos ento a tela abaixo aberta:

Project Name coloca-se o nome do projeto. Project Path coloca-se a pasta onde ser gravado o projeto. Description opcional; onde pode ser feita uma descrio sobre o que faz o projeto. Device escolhido o microcontrolador utilizado pelo projeto. Clock informado qual a freqncia que o microcontrolador ir trabalhar.

23

www.mecatronicadegaragem.blogspot.com

Device Flags: (fusveis ou bits de configurao) o local onde podemos configurar vrias funes atravs de bits de configurao. Funes estas que podem ser tipo de oscilador, habilitar WatchDog, Cdigo de proteo, etc. Clock: PIC 18F452

Resistor RS pode ser necessrio para melhor funcionamento do cristal. O PIC 18F452 pode funcionar com os seguintes tipos de clock: LP XT HS HS + PLL RC RCIO EC ECIO cristal de baixa freqncia cristal ou ressonador cristal ou ressonado de alta freqncia Cristal ou ressonador com PLL habilitado Resistor e capacitor externo Resistor e capacitor externo e liberao de 1 pino de I/O Clock externo Clock externo e liberao de 1 pino de I/O

Valores de capacitores que devem ser acoplado ao cristal:

24

www.mecatronicadegaragem.blogspot.com

Modo: RC externo com liberao do pino com ciclo de mquina Configurao RC

Clock externo com liberao de pino de I/O

25

www.mecatronicadegaragem.blogspot.com

Clock externo com liberao de um pino com clock ciclo de mquina Configurao EC

Clock externo com liberao de pino de I/O Configurao ECIO

Modo: HS + PLL

Neste caso, teremos a freqncia do Cristal multiplicado por 4. Por exemplo, para um cristal de 10MHz teremos a freqncia de trabalho em 40MHz.

26

www.mecatronicadegaragem.blogspot.com

PWRTEN (system clock switch bit) o temporizador de Power-Up que faz o microcontrolador aguardar certo tempo assim que o chip energizado. Este tempo de 72ms deixando assim o microcontrolador inoperante, tempo ideal para que o circuito oscilador estabilize sua freqncia. BROW-OUT detector um interessante circuito para resetar o Microcontrolador caso ocorra uma queda de tenso no mesmo. Restabelecido a tenso, o programa reiniciado. Podemos escolher os seguintes limites de tenso: 2,0V, 2,7V, 4,2V ou 4,5V.

BOREN Este bit responsvel por habilitar/desabilitar o Brown-out. WDTEN Watchdog Timer Enable Aqui temos um recurso bastante interessante. Um temporizador de 8 bits que no pode estourar pois caso isso ocorra o programa ser resetado. Imagina que por algum motivo o programa trava ou entra em algum loop infinito. A funo do watchdog no deixar o programa travado. Watchdog postscale select bit O tempo padro de estouro do watchdog 18ms, porm, podemos modificar este tempo modificando o fator de diviso: 1:1, 1:2, 1:4, 1:8, 1:16, 1:32, 1:64 e 1:128. LVP (low voltage programming) Temos aqui uma opo de poder gravar o Microcontrolador com 5V. O usual colocar tenso de 13,5V no pino MCLR. Portanto, possvel deixar o MCLR em 5V e fazer a gravao mas, o pino RA5 no poder mais ser utilizado como I/O. CCP2MX Este bit tem a funo de Multiplexar o mdulo CCP2. Para CCP2MX=0 usaremos pino RC1 para CCP2 Para CCP2MX=1 usaremos pino RB3 para CCP2 STVREN (Stack Full / Underflow Reset Enable Bit) O Microcontrolador 18F452 possui 31 endereos de pilha. Este bit serve para habilitar o chip para ser resetado caso a limite da pilha seja ultrapassado. BKBUG (Debug) Este bit habilita o modo Debugger do PIC. Com isso pode-se emular o programa desenvolvido na placa de testes. No entanto, esta funo ativa faz com os pinos RB6 e RB7 deixam de funcionar como I/O.

27

www.mecatronicadegaragem.blogspot.com

Code Protect 0x0200 a 0x1FFF Habilitando este bit, a regio de memria de 0x0200 a 0x1FFF fica protegida contra leitura. Code Protect 0x2000 a 0x3FFF Habilitando este bit, esta regio de memria fica protegida contra leitura. Code Protect 0x4000 a 0x5FFF Habilitando este bit, esta regio de memria fica protegida contra leitura. Code Protect 0x6000 a 0x7FFF Habilitando este bit, esta regio de memria fica protegida contra leitura. Data EE Read Protect Este bit protege os 256 bits de memria EEPROM contra leitura. Code Protect Boot Este bit habilitado, protege a regio de memria de boot(memria de programa 0x0000 0x0FF0). Table Write Protect Cada bit habilitado protege um range contra escrita por tabela. - 0x0200 0x1FFF - 0x2000 0x3FFF - 0x4000 0x5FFF - 0x6000 0x7FFF Data Write Protect Este bit habilitado protege contra escrita os 256 bytes da EEPROM Table Write Protect Boot Este bit habilitado protege a rea de boot contra escrita por tabela. Config Write Protect Este bit habilitado protege a rea de boot contra escrita. Table Read Protect Cada bit habilitado protege um range contra leitura por tabela. - 0x0200 0x1FFF - 0x2000 0x3FFF - 0x4000 0x5FFF - 0x6000 0x7FFF

28

www.mecatronicadegaragem.blogspot.com

Primeiro Projeto: Inicialmente deve-se criar um projeto onde : Project Name: Pisca-Pisca Project Path: C:/Pasta_aluno Description: Programa circuito oscilador pisca-led RD0 Device: P18F452 Clock: 004.000000 Device Flags: _XT_OSC, _PWRT_ON, _WDT_OFF, _LVP_OFF, _CP_OFF

Circuito:

29

www.mecatronicadegaragem.blogspot.com

Devemos ento escrever o cdigo e compilar o projeto para assim poder gravar o programa no Microcontrolador.

/********************************************************************** Uptex Tecnologia & Treinamento Ltda Curso de Microcontroladores PIC Linguagem C Compilador MikroC Programa 1 Objetivo: Configurao das Portas e acesso das mesmas usando funes de tempo *********************************************************************/ void main ( ) { trisd = 0; //configura todo o portd como sada portd = 0; // todo o portd colocado em nvel zero while(1) //loop infinito { portd.f0=1; //ativa sada RD0 delay_ms(5000); //aguarda 5 segundos portd.f0=0; //desativa sada RD0 delay_1sec( ); //aguarda 1 segundo } }

30

www.mecatronicadegaragem.blogspot.com

Uma vez escrito o programa, para compilar basta pressionar CTRL + F9 ou, clicar em Menu Project e em seguida a opo Build, conforme figura abaixo:

No apresentando nenhum erro, na tela de mensagens dever aparecer o seguinte mensagem na cor verde: SUCCESS ( Release Build) Esta mensagem garante que o programa foi compilado e que foi gerado o cdigo de mquina para ser gravado no Microcontrolador (arquivo.HEX).

31

www.mecatronicadegaragem.blogspot.com

Gravando o Projeto: O Programa ICPROG ser utilizado para gravar o programa no Microcontrolador. Primeira coisa a se fazer selecionar o Chip PIC18F452

Porm, precisamos ainda configurar o ICPROG para o correto funcionamento com a placa CUSCOPIC. Para isso, clica-se em Configurao, opo Hardware e selecione o programador (TAIT SERIAL PROGRAMMER), Interface Direct I/O e em comunicao deve-se Inverter o MCLR.

32

www.mecatronicadegaragem.blogspot.com

Identificao dos botes:

- Ler Tudo: Usado para leitura do contedo gravado no Microcontrolador; - Programar Tudo: Usado para gravarmos o programa no Microcontrolador; - Limpar Tudo: Usado para limparmos o contedo gravado no Microcontrolador; - Verificar: Usado para fazer uma comparao do contedo gravado no Microcontrolador com o programa aberto.

Gravando o Programa: Para gravar o programa no Microcontrolador , necessrio inicialmente limpar o contedo do mesmo. Pressionamos o boto LIMPAR TUDO para certificarmos que no tem nada gravado no PIC. Ento, clica-se em abrir e carrega o programa no ICPROG e em seguida pressionamos o boto Programar Tudo.

33

www.mecatronicadegaragem.blogspot.com

Aparece ainda a seguinte mensagem e confirmamos:

Aps o trmino da gravao, se tudo deu certo aparecer seguinte mensagem:

OK! O programa j est gravado no PIC. Agora s testar.

34

www.mecatronicadegaragem.blogspot.com

Exerccios: - Fazer um programa onde os leds devem ser acesos na seguncia RD0 a RD7 no intervalo de 500ms. Quando todos estiverem acesos segue apagando do RD7 a RD0 com intervalo agora de 250ms at apagar todos e reinicia o processo.

- Desenvolver um programa que gere uma onda quadrada em RD5 na freqncia de 1KHz. Verifique o sinal utilizando o osciloscpio. - Desenvolver um circuito oscilador que gere uma onda sendo Ton de 70%. O tempo total do ciclo ser de 100 mili-segundos.

35

www.mecatronicadegaragem.blogspot.com

Usando Debug no MikroC: Ao clicar no Menu RUN e selecionado START DEBUGGER, a janela abaixo ser apresentada:

Em Select Variable from list, seleciona-se o registrador que deseja visualizar e clica-se em Add.

36

www.mecatronicadegaragem.blogspot.com

37

www.mecatronicadegaragem.blogspot.com

Para dar incio simulao, (Debugger), deve-se clicar no boto conforme figura abaixo ou, se desejar, pressionando a tecla F9.

Temos tambm as teclas: F7 = faz simulao passo a passo; F6 = inicia modo Run.

- Run/Pause Debugger - Stop Debugger - Step Over - Step Out - Run to Cursor - Step Into

(F6); (Ctrl + F12); (F8); (Ctrl + F8); (F4); (F7).

38

www.mecatronicadegaragem.blogspot.com

/********************************************************************** Uptex Tecnologia & Treinamento Ltda Curso de Microcontroladores PIC Linguagem C Compilador MikroC Programa 2 Objetivo: Apresentar o uso da diretiva define *********************************************************************/ #define led1 portd.f1 // define o label led1 para o pino RD1 #define led2 portd,f2 // define o label led2 para o pino RD2 void main ( ) { trisd = 0; portd = 0;

// configura todo o portd como sada // todo o portd colocado em nvel baixo

while(1) //loop infinito { led1=1; delay_ms(5000); led1=0; delay_1sec( ); led2=1; delay_ms(5000); led2=0; delay_ms(5000); } }

//ativa sada RD1 //aguarda 5 segundos //desativa sada RD1 //aguarda 1 segundo // ativa sada RD2 // aguarda 5 segundos // desativa sada RD2

39

www.mecatronicadegaragem.blogspot.com

Acionamento de Botes: Abaixo temos o Hardware do nosso KIT de desenvolvimento:

/********************************************************************** Uptex Tecnologia & Treinamento Ltda Curso de Microcontroladores PIC Linguagem C Compilador MikroC Programa 3 Objetivo: Fazer leitura de um boto e utilizao do IF-ELSE *********************************************************************/ void main ( ) { trisd = 0b00000001; // configura RD0 entrada restante como sada portd = 0; // todos os pinos de sada do portd = nvel baixo while(1) //loop infinito { if (portd.f0==0) //testa de RD0 est em nvel baixo portd=0; // se sim todo portd em nvel baixo else portd.f7=1; //se RD0=1 ento RD7 ativado } }

40

www.mecatronicadegaragem.blogspot.com

/********************************************************************** Uptex Tecnologia & Treinamento Ltda Curso de Microcontroladores PIC Linguagem C Compilador MikroC Programa 4 Objetivo: Fazer leitura de um boto e utilizao do IF-ELSE *********************************************************************/ void main ( ) { trisc = 0; // configura todo o portc como sada trisd = 0b00000001; // configura RD0 entrada restante como sada portd = 0; // todos os pinos de sada do portd = nvel baixo portc = 0 // todos os pinos de sada do portc = nvel baixo while(1) //loop infinito { if (portd.f0==0) //RD0 est pressionado? portc=0xFF; // se sim todo portc em nvel alto else { portc=0; portd.f2=1; delay_ms(1000); portd.f2=0; delay_ms(1000); } } }

41

www.mecatronicadegaragem.blogspot.com

/********************************************************************** Uptex Tecnologia & Treinamento Ltda Curso de Microcontroladores PIC Linguagem C Compilador MikroC Programa 5 Objetivo: Fazer leitura de um boto e utilizao do IF-ELSE *********************************************************************/ void main() { trisc=0; // define todo o portc como sada trisd=0b00000001; // define RD0 como entrada e restante dos pinos como sada portd=0; // coloca portd em 0 portc=0; // coloca portc em 0 while(1) { if (portd.f0==0) // RD0 esta presionado? //se est, faz o que est entre chaves abaixo { portc=0xff; delay_1sec(); portc=0; delay_1sec(); }

else

// se for = 1 - boto pressionado // ento faz o que est entre chaves abaixo

{ portc=0; portd.f2=1; delay_ms(1000); portd.f2=0; delay_ms(1000); } } }

42

www.mecatronicadegaragem.blogspot.com

/********************************************************************** Uptex Tecnologia & Treinamento Ltda Curso de Microcontroladores PIC Linguagem C Compilador MikroC Programa 6 Objetivo: Fazer leitura de vrios botes e verificar a utilizao do IF-ELSE-IF *********************************************************************/ void main() { trisc=0; // define todo o portc como sada trisd=0b11111111; // define todos os pinos do portd como entrada portc=0; // coloca portc em 0 while(1) { if (portd.f0==1) portc.f0=1; else if (portd.f1==1) portc.f1=1; else if (portd.f2==1) portc.f2=1; else if (portd.f3==1) portc.f3=1; else if (portd.f4==1) portc.f4=1; else if (portd.f5==1) portc.f5=1; else if (portd.f6==1) portc.f6=1; else if (portd.f7==1) portc.f7=1; } }

// RD0 esta presionado? se nao, pula para testar RD1 // se pressionado, entao aciona RC0 // RD1 esta presionado? se nao, pula para testar RD2 // se pressionado, entao aciona RC1 // RD2 esta presionado? se nao, pula para testar RD3 // se pressionado, entao aciona RC2 // RD3 esta presionado? se nao, pula para testar RD4 // se pressionado, entao aciona RC3 // RD4 esta presionado? se nao, pula para testar RD5 // se pressionado, entao aciona RC4 // RD5 esta presionado? se nao, pula para testar RD6 // se pressionado, entao aciona RC5 // RD6 esta presionado? se nao, pula para testar RD7 // se pressionado, entao aciona RC6 // RD7 esta presionado? se nao, volta ao loop para testar //chaves // se pressionado, entao aciona RC7

43

www.mecatronicadegaragem.blogspot.com

Funo Button: Button(&portX, pinoX, tempoX, Estado_Tecla) Onde: &portX = port da tecla (porta, portb, portc, portd ou porte); pinoX = o pino onde est conectado a tecla (varia de 0 7); tempoX = tempo de Debounce em milisegundos; Estado_Tecla = Valor do nvel lgico quando a tecla pressionada. /********************************************************************** Uptex Tecnologia & Treinamento Ltda Curso de Microcontroladores PIC Linguagem C Compilador MikroC Programa 7 Objetivo: Solucionar o problema de Debounce do programa anterior e tambm, aguardar soltar o boto. *********************************************************************/ void main() { trisc=0; trisd=0b00000001; portc=0;

// define todo o portc como sada // define RD0 como entrada e restante como sada // coloca portc em 0

while(1) { if (button(&portd, 0, 20, 1)) // &port identifica o port, 0 identifica o pino, // 20ms o tempo e 1 nvel para tecla acionada { portc.f0=~portc.f0; // se pressionado, ento aciona RC0 while(portd.f0==1); { } } } } // aguarda soltar o boto

44

www.mecatronicadegaragem.blogspot.com

/********************************************************************** Uptex Tecnologia & Treinamento Ltda Curso de Microcontroladores PIC Linguagem C Compilador MikroC Programa 8 Objetivo: Testar vrias chaves sem ter problema de rudo (Debounce). *********************************************************************/ void main() { trisc=0; trisd=0xFF; portc=0;

// define todo o portc como sada // define todo o portd como entrada // coloca portc em 0

while(1) { if (button(&portd, 0, 20, 1)) // &port identifica o port, 0 identifica o pino, // 20ms o tempo e 1 nvel para tecla acionada portc.f0=1; // se pressionado aciona RC0 else if (button(&portd, 1, 20, 1)) portc.f1=1; else if (button(&portd, 2, 20, 1)) portc.f2=1; else if (button(&portd, 3, 20, 1)) portc.f3=1; else if (button(&portd, 4, 20, 1)) portc.f4=1; delay_ms(200); } } Exerccio: 1) Imagine que vamos montar um circuito que controle atravs de 4 chaves (ligar/desligar) a iluminao de uma casa. Esse controle ficar no quarto do casal, ao lado da cama, podendo com praticidade controlar/monitorar a iluminao da casa. Ento teremos as chaves em RD0, RD1, RD2 e RD3 e as sadas para acionar os rels em RD4, RD5, RD6 e RD7. Pressionado RD1 acende iluminao da sala e pressionado RD1 novamente apaga. Idem para RD2 (cozinha), RD3 (quarto 1) e RD4 (quarto 2).

45

www.mecatronicadegaragem.blogspot.com

Funes: As Funes em Linguagem C so como as Subrotinas em Assembly. So muito usadas pois, permite executar um bloco de comandos sem a necessidade de repeti-lo no bloco principal. Como declarar uma Funo: Tipo + Nome da Funo (parmetro) Bloco de execuo Exemplo: int soma(int a, int b) { return a + b; } void main ( ) { int c; trisd=0x00; portd=0x00; c=soma(2,3); while(1) { portd=c; } }

46

www.mecatronicadegaragem.blogspot.com

Outro exemplo: void tempo_diverso( ) ; nenhuma int cont1 ; void main ( ) { trisd=0 ; portd=0 ; while(1) { cont1=60; portd.f0=1; tempo_diverso ( ) ; portd.f0=0; cont1=120; tempo_diverso( ); } } // prottipo de funo. No podemos utilizar //funo antes de declar-la

//delay de 1 minuto

//delay de 2 minutos

void tempo_diverso ( ) //delay para n minutos { int cont; for (cont=0; cont<cont1; cont++) { delay_ms(1000) ; } }

47

www.mecatronicadegaragem.blogspot.com

Display de Cristal Lquido LCD Esta um dos recursos mais interessantes quando utilizamos Microcontroladores. Isto porque podemos implementar projetos muito interessantes onde pode-se desenvolver uma IHM (Interface Homem Mquina) agregando valor muito interessante ao projeto. Utilizaremos um Display alfanumrico 16x2 (dezesseis caracteres e duas linhas). O interessante que o display j possui internamente outro microcontrolador que gerencia as funes do mesmo. Isto facilita bastante o desenvolvimento do projeto pois, o programador se preocupa apenas em enviar os dados e a localizao onde quer que os mesmos apaream no display. Descrio da pinagem do display: Pino Descrio 1 GND (Terra) 2 VCC (+5V) 3 Ajuste de contraste 4 Seleo RS=1 Dado RS=0 Instruo 5 Seleo - RW=1 Leitura RW=0 Escrita 6 Seleo - Enable Chip Select 1 ou 1 p/ 0 habilita e em 0 desabilita 7 B0 - Barramento de Dados 8 B1 - Barramento de Dados 9 B2 - Barramento de Dados 10 B3 - Barramento de Dados 11 B4 - Barramento de Dados 12 B5 - Barramento de Dados 13 B6 - Barramento de Dados 14 B7 - Barramento de Dados 15 Anodo para Display com recurso de BackLight 16 Catodo para Display com recurso de BackLight Endereo dos caracteres para display 16 x 2 (16 colunas x 2 linhas): 80 C0 81 C1 82 C2 83 C3 84 C4 85 C5 86 C6 87 C7 88 C8 89 C9 8A 8B 8C 8D 8E 8F CA CB CC CD CE CF

48

www.mecatronicadegaragem.blogspot.com

Comandos disponveis:

49

www.mecatronicadegaragem.blogspot.com

No MikroC podemos utilizar um LCD em dois modos: - Modo 4 bits - Modo 8 bits Quando utilizamos o Modo 8 bits, utilizamos um port para envio de dados e, para os sinais de controle utilizamos alguns pinos de outro port. Por exemplo: RD0 a RD7 para dados e RB7, RB6 e RB5 para sinais E, R/W e R/S. Quando utilizamos o Modo 4 bits, podemos utilizar somente um port para dados e controle ou utilizar dois ports, um para dados e outro para controle. No KIT CUSCOPIC utilizaremos o Modo 4 bits usando o portb para envio de dados e tambm sinais de controle. Temos ento: R/S = RB1, EN = RB0, R/W=RB2, dados = RB4, RB5, RB6 e RB7

O Comando lcd_config ( ) inicializa o lcd e tambm configura os respectivos pinos de dados/controle na qual o mdulo lcd ir trabalhar. Sintaxe: lcd_config(&portX, R/S, EN, R/W, pin_dado, pin_dado, pin_dado, pin_dado) Onde: &portX=port utilizado A,B,C,D ou E; R/S = pino utilizado para controle R/S; EN = pino utilizado para controle R/S; R/W = pino utilizado para controle R/W; pin_dados = pinos utilizados para envio de dados Para nosso KIT teremos ento: lcd_config(&portb,1,0,2,7,6,5,4);

50

www.mecatronicadegaragem.blogspot.com

Muito bem, vamos ento praticar envio de uma mensagem ao modulo: /********************************************************************** Uptex Tecnologia & Treinamento Ltda Curso de Microcontroladores PIC Linguagem C Compilador MikroC Programa 9 Objetivo: inicializar o mdulo e apresentar uma mensagem no mesmo *********************************************************************/ char *text="LCD Display Test"; void main() { unsigned i; trisb=0; lcd_config(&portb,1,0,2,7,6,5,4); lcd_Cmd(Lcd_Cursor_off); lcd_out(1, 1, text); while(1){ lcd_cmd(lcd_return_home); lcd_cmd(lcd_underline_on); for(i=0;i<=15;i++){ lcd_cmd(Lcd_move_cursor_right); delay_ms(100); } for(i=0;i<=15;i++){ lcd_cmd(Lcd_move_cursor_left); delay_ms(100); } lcd_Cmd(Lcd_turn_off); delay_ms(500); lcd_Cmd(Lcd_turn_on); } }

51

www.mecatronicadegaragem.blogspot.com

Outro exemplo: /********************************************************************** Uptex Tecnologia & Treinamento Ltda Curso de Microcontroladores PIC Linguagem C Compilador MikroC Programa 10 Objetivo: inicializar o mdulo e apresentar uma mensagem no mesmo *********************************************************************/ void main(){ while(1){ trisb=0; lcd_config(&portb,1,0,2,7,6,5,4); lcd_cmd(Lcd_Cursor_off); lcd_cmd(lcd_clear); Lcd_out(1, 1,"Uptex Tecnologia"); Lcd_out(2, 1,"& Treinamentos"); delay_ms (3000); lcd_cmd(lcd_clear); delay_ms (500); Lcd_out(1, 1,"cursos Rapidos"); Lcd_out(2, 1,"com qualidade"); delay_ms (2000); lcd_cmd(lcd_clear); delay_ms (500); Lcd_out(1, 1,"Av. Benjamim"); Lcd_out(2, 1,"Constant, 1429"); delay_ms (2000); lcd_cmd(lcd_clear); delay_ms (500); Lcd_out(1, 1,"Visite o site"); Lcd_out(2, 1," uptex.com.br "); delay_ms (2000); lcd_cmd(lcd_clear); delay_ms (500); } } Exerccio: - Para o exerccio da pgina 45 (controle de iluminao residencial), implemente o projeto apresentando no mdulo LCD uma tela de apresentao da sua Empresa assim que o equipamento ligado e, conforme ativado/desativado a iluminao dos ambientes, o resultado apresentado no visor podendo assim, o usurio monitorar pelo LCD o funcionamento do sistema.

52

www.mecatronicadegaragem.blogspot.com

Podemos, no entanto, ter um Hardware diferente do nosso KIT. Por exemplo, utilizar o Modo 8 Bits onde temos todo o portd para enviar os dados e o algumas sadas do porte para enviar os sinais de controle. Neste caso, teremos que utilizar o seguinte comando: lcd8_config(&port_control, &port_data, RS,EM,RW,D7,D6,D5,D4,D3,D2,D1,D0); Onde: &port_control: port utilizado para sinais de controle (3 bits); &port_data: port utilizado para sinais de dados (8 bits); RS: pino do PIC que est ligado ao sinal RS responsvel pelo controle (inst/dado); EN: pino do PIC que est ligado ao Enable do LCD Habilita LCD RW: pino do PIC que est ligado ao sinal RW do LCD responsvel pelo leitura/escrita; D7 D0: pinos do PIC que esto ligados no LCD port_data. Exemplo de configurao onde controle est no porte e dados no porte lcd8_config(&porte, &portb, 2,1,0,7,6,5,4,3,2,1,0) Temos ento: RE2 = RS RE1 = EN RE0 = RW RB7 RB0 = dados Para escrever uma mensagem Modo 8 Bits muito simples: lcd8_out(linha,coluna,informao); Exemplo: Escrever Uptex na primeira linha e Tecnologia na segunda linha: lcd8_out(1,5,Uptex); lcd8_out(2,1,Tecnologia); possvel tambm que o Hardware utilize 2 ports em 4 bits onde, um dos ports ser responsvel pelos sinais de controle (4 bits) e outro port responsvel pelos dados. Por exemplo: porte sinais de controle e portb dados. O comando utilizado ser: lcd_custom_config(&port_data, D7,D6,D5,D4, &port_control, RS, RW, EN); Exemplo : Lcd_custom_config(&portb,4,5,6,7, &porte, 1,2,3) ;

53

www.mecatronicadegaragem.blogspot.com

Mdulo PWM (Pulse Width Modulation) Modulao por largura de pulso Encontramos uso do mesmo em Inversores de freqncia, controle de servo motores, Fontes chaveadas, controle de potncia e velocidade de motores, etc.

Conforme figura acima, uma onda pulsante, com amplitude 5V acionada/desacionada no tempo. A tenso mdia varia em funo do tempo em que o sinal fica no nvel alto (5V) e do tempo em que a onda fica no nvel baixo (0V). Para a figura acima, como 50% do tempo a onda fica em 5V e 50% em 0V; obtemos neste caso uma tenso mdia de 2,5V. A relao entre o tempo em que a onda fica em nvel alto e o perodo total chamado de Duty-cycle ou ciclo de trabalho. Portanto, para um duty-cycle de 50% temos metade do tempo com a onda em VCC e a outra metade em 0V. Isso implica em uma tenso mdia de 2,5V, o que significa que se colocarmos uma fonte contnua com 2,5V produz o mesmo efeito que a fonte pulsante de 5V com duty-cycle de 50%. O PIC 18F452 possui 2 mdulos CCP CCP1 e CCP2 (Capture/Compare/PWM) Os Comandos abaixo so para o Mdulo CCP1: - pwm_init(X) Onde X o valor da freqncia em Hz; - pwm_change_duty(Y) Onde Y valor tipo char entre 0 e 255 Valor 0 e 255 determina a porcentagem em que est operando o Mdulo. Exemplo: para duty-cycle de 50% basta colocar valor de Y=127. - pwm_start( ) Inicia o Mdulo; -pwm_stop( ) Finaliza o mdulo PWM

54

www.mecatronicadegaragem.blogspot.com

Para o Mdulo CCP2 temos os seguintes comandos: pwm2_init(X); pwm2_change_duty(Y); pwm2_start( ); pwm2_stop( ) ; Exemplos: Utilizando o osciloscpio, verifique os sinais das sadas PWM /********************************************************************** Uptex Tecnologia & Treinamento Ltda Curso de Microcontroladores PIC Linguagem C Compilador MikroC Programa 11 Objetivo: verificar funcionamento do Mdulo CCP1 *********************************************************************/ //programa que configura CCP1 em 1KHz e duty cycle de 50%. void main(){ pwm_init(1000); pwm_change_duty(127); pwm_start(); while(1); }

/********************************************************************** Uptex Tecnologia & Treinamento Ltda Curso de Microcontroladores PIC Linguagem C Compilador MikroC Programa 12 Objetivo: verificar funcionamento do Mdulo CCP2 *********************************************************************/ //programa que configura Mdulo CCP2 em 3KHz e duty cicle 10% void main(){ pwm2_init(3000); pwm2_change_duty(25); pwm2_start(); while(1); }

55

www.mecatronicadegaragem.blogspot.com

/********************************************************************** Uptex Tecnologia & Treinamento Ltda Curso de Microcontroladores PIC Linguagem C Compilador MikroC Programa 13 Objetivo: verificar funcionamento simultneo dos Mdulos CCP1 e CCP2 *********************************************************************/ void main() { pwm2_init(250); pwm2_change_duty(254); pwm2_start(); pwm1_init(250); pwm1_change_duty(10); pwm1_start(); while(1); }

Exerccio : Modifique os valores dos duty-cycle e verifique com o osciloscpio o resultado.

56

www.mecatronicadegaragem.blogspot.com

/********************************************************************** Uptex Tecnologia & Treinamento Ltda Curso de Microcontroladores PIC Linguagem C Compilador MikroC Programa 14 Objetivo: atravs de botes, modificar o duty-cycle dos Mdulos CCP1 e CCP2 *********************************************************************/ unsigned short int var1=127; unsigned short int var2=30;

void seta() { pwm1_init(1000); pwm1_change_duty(var1); pwm1_start(); pwm2_init(1000); pwm2_change_duty(var2); pwm2_start(); } void main() { seta(); while(1) { if (button(&portd, 0,20,1)) { var1++ ; delay_ms(100); seta(); } if (button(&portd, 1,20,1)) { var1--; delay_ms(100); seta(); } if (button(&portd, 2,20,1)) {

57

www.mecatronicadegaragem.blogspot.com

var2++ ; delay_ms(100); seta(); } if (button(&portd, 3,20,1)) { var2--; delay_ms(100); seta(); } } }

Conversor A/D Analgico/Digital Este um dos perifricos mais importantes do Microcontrolador, pois atravs dele podemos fazer leitura de grandezas fsicas como temperatura, presso, humidade, etc. O PIC 18F452 possui 8 canais com resoluo de 10 bits ou seja, para um sinal de 5V teremos poderemos fazer leitura de 4,8876mV. As 8 entradas so multiplexadas ou seja, na verdade temos apenas 1 conversor de 10 bits e 8 entradas disponveis para serem selecionadas pelo MUX e obter a converso. Na figura abaixo temos o circuito interno do conversor A/D no PIC:

58

www.mecatronicadegaragem.blogspot.com

Estas entradas esto disponveis nos seguintes pinos: RA0 Entrada Analgica 0 = AN0 RA1 Entrada Analgica 1 = AN1 RA2 Entrada Analgica 2 = AN2 RA3 Entrada Analgica 3 = AN3 RA4 Entrada Analgica 4 = AN4 RA5 Entrada Analgica 5 = AN5 RA6 Entrada Analgica 6 = AN6 RA7 Entrada Analgica 7 = AN7 Os Registradores que configuram como ir trabalhar o Conversor A/D so: - ADCON0 - ADCON1 Como os registradores so de 8 bits e a resoluo do A/D de 10 bits, teremos ento 2 registradores para receberem os dados da converso: - ADRESH - ADRESL Com isso, poderemos fazer a justificativa direita ou justificativa esquerda. Isso funciona da seguinte maneira: Caso seja configurado para justificativa direita, os 8 bits menos significativos ficaro no registrador ADRESL e os 2 bits mais significativos ficaro em ADRESH. Caso seja configurado para justificativa esquerda, os 8 bits mais significativos ficaro no Registrador ADRESH e os 2 bits menos significativos estaro em ADRESL. Agora, o bit responsvel por esta seleo o ADFM ADFM=0 - justificativa ser esquerda ADFM=1 - justificativa ser direita O bit ADFM est presente no Registrador ADCON1 que ser visto em seguida.

59

www.mecatronicadegaragem.blogspot.com

Registrador ADCON0:

GO/Done: Bit que informa sobre a converso: 0 conversor est em processo 1 conversor no est em processo ADON: 0 - Conversor A/D est desligado 1 - Conversor A/D est ligado OBS: O conversor A/D necessita de 1,6s para poder realizar a converso e, com isso, necessrio certa ateno na hora de configurar os bits ADCS2, ADCS1 e ADCS0 pois precisamos verificar o cristal utilizado. Operation ADCS2:ADCS1:ADCS0 Freqncia Mxima 2 TOSC 000 1,25 MHz 4 TOSC 100 2,5 MHz 8 TOSC 001 5,00 MHz 16 TOSC 101 10,00 MHz 32 TOSC 010 20,00 MHz 64 TOSC 110 40,00 MHz RC 011 -------------60

www.mecatronicadegaragem.blogspot.com

Registrador ADCON1:

61

www.mecatronicadegaragem.blogspot.com

Exerccio: a) Dado a tabela acima para configurar os Registradores, qual o valor que deve ser o valor colocado em ADCON0 e ADCON1 para habilitarmos todos os pinos como entradas analgicas? b) Idem ao anterior para configurar todos os pinos como I/O de uso geral. c) Para ADCON1=0b00001110, descreva como est configurado cada pino do porta.

Como nosso Mdulo A/D de 10 bits, teremos ento 1024 respostas. Geralmente usa-se AN3 e AN2 em VCC e GND como referncia. Importante ressaltar que jamais poderemos aplicar uma referncia externa superior a tenso de alimentao do PIC. Abaixo temos a frmula usada para a converso: Resposta = (Vin Vref-) * 1023 / (Vref+ - Veref-) Onde: Resposta o valor compreendido entre 0 e 1023 Vref+ e Vref- so os valores mximos e mnimos da tenso de referncia Vin a tenso de entrada aplicada 1023 uma constante que na verdade o valor mximo que podemos ter como resposta Exerccios: a) Sendo Vref+ = 4V e Vref- = 1V, calcule a resposta sendo a tenso aplicada de 3,5V. b) Para as mesmas tenses de referncia do exerccio anterior, calcule a tenso aplicada no canal A/D para Resposta=712. c) Para Vref+=5V e Vref-=0V, calcule o valor da resposta para Vin=2,5V. d) Para exerccio anterior, caso resposta seja 757, qual deve ser valor da tenso aplicado em Vin?

Funo utilizada no MikroC para trabalhar com o Conversor A/D: Adc_read(channel) Onde channel varia de 0 a 7 correspondendo ao canal a ser feita a leitura. Exemplo: Temperatura = Adc_read(3); // temperatura recebe o valor do sinal enviado do //sensor ligado na entrada RA3 62

www.mecatronicadegaragem.blogspot.com

Vejamos um exemplo:

/********************************************************************** Uptex Tecnologia & Treinamento Ltda Curso de Microcontroladores PIC Linguagem C Compilador MikroC Programa 15 Objetivo: apresentar a leitura da tenso medida atravs do potencimetro acoplado em AN0 e mostrar no LCD - valor 0 a 1023. *********************************************************************/ // programa que mostra o valor lido no canal 0 - valor este entre 0 e 1023. char texto[16]; int leitura_canal; void main() { trisc=0; trisd=255; // configura portd como entrada trisb=0; // configura portb como sada trisa.f0=1; // configura RA0 como entrada adcon1= 0b00001110; // configura RA0 como entrada analgica e demais //pinos como I/O digital. lcd_config(&portb,1,0,2,7,6,5,4); lcd_cmd(lcd_cursor_off); lcd_out(1,1, "canal AN0: "); delay_ms(20); do { leitura_canal=adc_read(0); wordtostr(leitura_canal,texto); lcd_out(2,1, texto); } while(1); }

63

www.mecatronicadegaragem.blogspot.com

/********************************************************************** Uptex Tecnologia & Treinamento Ltda Curso de Microcontroladores PIC Linguagem C Compilador MikroC Programa 16 Objetivo: apresentar a leitura da tenso medida atravs do potencimetro acoplado em AN0 e mostrar no LCD a tenso correspondente - valor 0 a 5V *********************************************************************/ // programa que mostra apenas o valor de 0 a 5 volts int leitura_canal; char texto[16]; void main() { trisc=0; trisd=255; // configura portd como entrada trisb=0; // configura portb como sada trisa.f0=1; // configura RA0 como entrada adcon1= 0b00001110; // configura RA0 como entrada analgica e demais //pinos como I/O digital. lcd_config(&portb,1,0,2,7,6,5,4); lcd_cmd(lcd_cursor_off); lcd_out(1,1, "canal AN0: "); delay_ms(20); do { leitura_canal=adc_read(0); // leitura_canal=(leitura_canal*5)/1023; //mostra 0 a 5v leitura_canal=(leitura_canal)/0.2048 ; //mostra 0 a 5000mv wordtostr(leitura_canal,texto); lcd_out(2,1, texto); // lcd_out(2,11,"Volts"); lcd_out(2,7,"mili Volts"); } while(1); }

64

www.mecatronicadegaragem.blogspot.com

/********************************************************************** Uptex Tecnologia & Treinamento Ltda Curso de Microcontroladores PIC Linguagem C Compilador MikroC Programa 17 Objetivo: apresentar a leitura da tenso medida atravs do potencimetro acoplado em AN0 e mostrar no LCD a tenso correspondente - valor 0 a 5V com ponto flutuante. *********************************************************************/ // programa que mostra apenas o valor de 0 a 5 volts com ponto flutuante int leitura_canal; char texto[16]; int leitura_ch0; float valor = 0; void main() { trisc=0; trisd=255; // configura portd como entrada trisb=0; // configura portb como sada trisa.f0=1; // configura RA0 como entrada adcon1= 0b00001110; // configura RA0 como entrada analgica e demais pinos //como I/O digital. lcd_config(&portb,1,0,2,7,6,5,4); lcd_cmd(lcd_cursor_off); lcd_out(1,1, "canal Ch0: "); delay_ms(20); do { lcd_cmd(lcd_clear); lcd_out(1,1, "canal Ch0: "); delay_ms(20); leitura_ch0=adc_read(0); valor= leitura_ch0 * 0.0048 ; //mostra 0 a 5000mv floattostr(valor,texto); delay_us(10); lcd_out(2,1, texto); lcd_out(2,13,"Volt"); delay_ms(1000); } while(1); }

65

www.mecatronicadegaragem.blogspot.com

/********************************************************************** Uptex Tecnologia & Treinamento Ltda Curso de Microcontroladores PIC Linguagem C Compilador MikroC Programa 18 Objetivo: apresentar no LCD o controle feito do PWM utilizando o conversor A/D. *********************************************************************/ // controlar o canal PWM atravs da entrada analgica AN0 - potencimetro void main () { unsigned int valor=0; char texto[7]; adcon1=0b00001110; //configura RA0 como entrada e demais como I/O digital trisa.f0=1; //configura RA0 como entrada lcd_config(&portb,1,0,2,7,6,5,4); lcd_cmd(lcd_cursor_off); pwm_init(10000); pwm_start(); do { valor=adc_read(0); pwm_change_duty(valor/4); valor=((valor/4)*100)/255; delay_10us; inttostr(valor,texto); lcd_out(1,1, "Duty= "); Lcd_out(1,7, texto); lcd_chr(1,15, '%'); } while(1); }

66

www.mecatronicadegaragem.blogspot.com

Comunicao Serial: O PIC 18F452 possui um USART (Universal Synchronous Asynchronous Receiver Transmitter) que tm a funo de transmitir/receber dados entre o Microcontrolador e outro microcontrolador ou equipamentos em geral como PLCs, PCs, etc. Podemos configur-lo para as seguintes taxas(bps): 110, 220, 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, etc. Os pinos RC6/TX e RC7/RX so responsveis pela comunicao e tambm existe a necessidade de se alocar os sinais no padro RS232 e para isso utilizamos o circuito integrado MAX232 pois o pic trabalha apenas em 5V. As Funes abaixo so responsveis pelo tratamento da Comunicao Serial no MikroC: Usart_init(taxa); inializa o mdulo de comunicao do pic e configura a taxa de transmisso. Usart_write(x) comando para enviar o dado. Usart_read( ) comando para fazer leitura do dado no Buffer Serial. Usart_ready( ) funo para saber se Buffer est vazio ou se chegou algum dado. Exemplo: /********************************************************************** Uptex Tecnologia & Treinamento Ltda Curso de Microcontroladores PIC Linguagem C Compilador MikroC Programa 19 Objetivo: apresentar o funcionamento da Transmisso de dados via serial (RS232). *********************************************************************/ // transmite caracteres via serial para usart terminar do MikroC ou ComDebug2 void main() { usart_init(9600); while(1) { if (button(&portd,0,100,1)) {

67

www.mecatronicadegaragem.blogspot.com

usart_write('U'); delay_ms(1000); usart_write('p'); delay_ms(1000); usart_write('t'); delay_ms(1000); usart_write('e'); delay_ms(1000); usart_write('x'); } } }

/********************************************************************** Uptex Tecnologia & Treinamento Ltda Curso de Microcontroladores PIC Linguagem C Compilador MikroC Programa 20 Objetivo: apresentar o funcionamento da Transmisso e Recepo de dados via serial (RS232). *********************************************************************/ // transmite/recebe caracteres via serial para usart terminar do MikroC ou ComDebug2 unsigned short dado; void main() { trisc=0x00; portc=0; trisd=0xff; usart_init(9600); do { if (usart_data_ready()) { dado=usart_read(); delay_ms(2000); usart_write(dado); if (dado=='L') portc.f0=1; if (dado=='D') portc.f0=0; } } while(1); }

68

www.mecatronicadegaragem.blogspot.com

/********************************************************************** Uptex Tecnologia & Treinamento Ltda Curso de Microcontroladores PIC Linguagem C Compilador MikroC Programa 21 Objetivo: apresentar o funcionamento da Transmisso e Recepo de dados via serial. *********************************************************************/ // transmite/recebe caracteres via serial para usart terminar do MikroC ou ComDebug2 char dados[4]; short i; void compara_dados() { if((dados[0]=='S') && (dados[1]=='1') && (dados[2]=='1')) portc.f1=1; if((dados[0]=='S') && (dados[1]=='1') && (dados[2]=='0')) portc.f1=0; } void main() { trisc=0; portc=0; usart_init(9600); i=0; // inicializa usart (8bits, baud rate 9600, no parity bit...

while(1) { if (usart_data_ready()) { dados[i]=usart_read(); i++; if(dados[i-1]==0x0D) // verifica se chegou o comando ENTER { compara_dados(); for(i=0;i<=3;i++) dados[i]='\0'; i=0; } } } }

69

www.mecatronicadegaragem.blogspot.com

/********************************************************************** Uptex Tecnologia & Treinamento Ltda Curso de Microcontroladores PIC Linguagem C Compilador MikroC Programa 22 Objetivo: apresentar o funcionamento da Transmisso de dados fazendo uso de ponteiros *********************************************************************/ unsigned char *p1="Uptex Tecnologia"; void main() { usart_init(9600); do { usart_write(*p1); // envia um caracter pela porta serial *p1++; // incrementa o ponteiro delay_ms(200); // mudar tempo para verificar resultado na transmisso dos dados } while (*p1!='\0'); // verifica se ponteiro enviou o ltimo caracter }

70

www.mecatronicadegaragem.blogspot.com

/********************************************************************** Uptex Tecnologia & Treinamento Ltda Curso de Microcontroladores PIC Linguagem C Compilador MikroC Programa 23 Objetivo: apresentar o funcionamento da Transmisso de dados utilizando LCD, PIC e PC *********************************************************************/ char texto [16]; void main () { unsigned char dado; trisb=0; trisd=0; portd=0; usart_init(9600); Lcd_Config(&portb,1,0,2,7,6,5,4); LCD_Cmd(lcd_cursor_off); Lcd_Cmd(Lcd_clear); Lcd_out(1,1, "Comunicao: "); Lcd_out(2,1, "PC / PIC / LCD"); delay_ms(10000); do { if (usart_data_ready()) // se chegou algum byte no buufer, entao: { dado=usart_read(); usart_write(dado); } switch(dado) { case 'a': portd.f0=1; Lcd_out(1,1, "Dado Enviado: "); Lcd_chr(1,15, 'a');

71

www.mecatronicadegaragem.blogspot.com

Lcd_out(2,1, "Saida RD0 ON break; case 'b': portd.f1=1;

");

Lcd_out(1,1, "Dado Enviado: "); Lcd_chr(1,15, 'b'); Lcd_out(2,1, "Saida RD1 ON "); break; case 'c': portd.f2=1; Lcd_out(1,1, "Dado Enviado: "); Lcd_chr(1,15, 'c'); Lcd_out(2,1, "Saida RD2 ON "); break; case 'd': portd=0; Lcd_out(1,1, "Dado Enviado: "); Lcd_chr(1,15, 'd'); Lcd_out(2,1, "Todas Saidas OFF"); break;

} } while(1); }

72

www.mecatronicadegaragem.blogspot.com

/********************************************************************** Uptex Tecnologia & Treinamento Ltda Curso de Microcontroladores PIC Linguagem C Compilador MikroC Programa 24 Objetivo: Faz leitura da temperatura e transmite via serial para PC *********************************************************************/ /* programa que mostra no display a temperatura ambiente e transmite a cada 10 segundos para o PC via canal serial */ int leitura_canal; char texto[16]; void main() { trisc=0; trisd=255; // configura portd como entrada trisb=0; // configura portb como sada trisa.f1=1; // configura RA1 como entrada adcon1= 0b00000100; // configura RA0, RA1 e RA3 como entrada analgica e //demais pinos como I/O digital. lcd_config(&portb,1,0,2,7,6,5,4); lcd_cmd(lcd_cursor_off); lcd_out(1,1, "Temperatura: "); delay_ms(20); usart_init(9600); do { delay_ms(10000); leitura_canal=adc_read(1); leitura_canal=(leitura_canal)/2.048 ; //mostra temperatura 28mv = 28 graus inttostr(leitura_canal,texto); usart_write(leitura_canal); lcd_out(2,1, texto); lcd_out(2,7,"oC"); } while(1); }

73

www.mecatronicadegaragem.blogspot.com

/********************************************************************** Uptex Tecnologia & Treinamento Ltda Curso de Microcontroladores PIC Linguagem C Compilador MikroC Programa 25 Objetivo: Faz leitura da temperatura , compara com SetPoint e aciona alarme *********************************************************************/ /* programa que mostra no display a temperatura ambiente e se temperatura for maior que 40 graus, dever acionar todo o portd (alarme) e transmitir via serial ao PC a string ALARME */ unsigned char *i= "ALARME" ; int leitura_canal; char texto[16]; void main() { trisd=0; // configura portd como entrada trisb=0; // configura portb como sada trisa.f1=1; // configura RA1 como entrada adcon1= 0b00000100; // configura RA0, RA1 e RA3 como entrada analgica e //demais pinos como I/O digital. lcd_config(&portb,1,0,2,7,6,5,4); lcd_cmd(lcd_cursor_off); lcd_out(1,1, "Temperatura: "); delay_ms(20); usart_init(9600); while(1) { leitura_canal=adc_read(1); leitura_canal=(leitura_canal)/2.048 ; //mostra temperatura 28mv = 28 graus inttostr(leitura_canal,texto); lcd_out(2,1, texto); lcd_out(2,7,"oC"); if (leitura_canal>40) { portd=255; do { usart_write(*i); *i++; delay_ms(100); } while(*i!='\0'); delay_ms(10000); portd=0; } } }

74

www.mecatronicadegaragem.blogspot.com

Conhecendo os Timers/Counters: O PIC18F452 possui internamente 4 Timers/Counters (Temporizadores/Contadores) de grande utilizao para desenvolvimento de rotinas de tempos ou contagem de eventos. Podemos por exemplo usar o timer/contador para gerar uma informao para o PIC a cada 1 segundo fazer aquisio de dado da temperatura de uma amostra ou contar o nmero de voltas que um motor est realizando. O Timer0 pode ser configurado para trabalhar em 8 ou 16 bits fazendo contagem (0 a 255 ou 0 a 65535). Possui ainda um Prescaler que nada mais do que um divisor programvel possibilitando aumentar o tempo ou reduzir a freqncia de operao. O Timer1 um timer de 16 bits, funcionando igual ao Timer0, porm pode-se acoplar um cristal externo para gerar os pulsos de clock (RC0 e RC1). Tambm possui um Prescaler dedicado. O Timer2 um timer de 8 bits mas com funcionamento diferente. O estouro do Timer2 ocorre quando igualar o valor do Timer2 com o valor do Registrador PR2. Quando isso ocorre, uma nova contagem realizada. Este timer possui ainda o Postscale que trabalha contando o nmero de estouro (igualdade entre timer2 e PR2). Aps realizar N comparaes que ir ocorrer o estouro do Timer2. O Timer3 um temporizador/contador de 16 bits possuindo tambm um Prescaler dedicado. Timer0: O Registrador T0CON responsvel pela configurao deste timer. Abaixo temos o Registro e a funo de cada bit. T0CON TMR0ON T08BIT T0CS T0SE PSA T0PS2 T0PS1 T0PS0

Os 3 primeiros bits so responsveis pela seleo do Prescaler T0PS2 0 0 0 0 1 1 1 1 T0PS1 0 0 1 1 0 0 1 1 T0PS0 0 1 0 1 0 1 0 1 Prescaler 1:2 1:4 1:8 1:16 1:32 1:64 1:128 1:256

PSA: Bit de seleo do Prescaler 0 = prescaler ser utilizado 1 = Prescaler no ser utilizado. Neste caso, a tabela acima no tem valor, ou seja, conseguimos ento Prescaler 1:1 a cada pulso o timer0 ser incrementado.

75

www.mecatronicadegaragem.blogspot.com

T0SE: Bit que faz a seleo da borda 0 = sensvel a borda de subida em T0CKI 1 = sensvel a borda de descida em T0CKI T0CS: Bit que seleciona como ser o clock do Timer0 0 = Cristal interno incremeta o timer 1 = Pulso externo aplicado no pino T0CKI incrementa o timer T08BIT: Bit que seleciona o modo de operao 0 = 16 Bits 1 = 8 Bits TMR0ON: Bit que ativa/desativa o Timer0 0 = Timer0 desabilitado 1 = Timer0 habilitado Existe tambm 2 Registradores que trabalham juto com o Timer0. So eles: TMR0L: Responsvel pela contagem da parte baixa (0 a 255). TMR0H: Responsvel pela contagem da parte alta (0 a 65535). Se Timer0 estiver Trabalhando no Modo 8 bits utiliza apenas o TMR0L e se estiver em 16 bits utiliza os 2 Registradores TMR0L e TMR0H. Calculando o Tempo no Timer0: Tempo = ciclo de mquina * prescaler * (modo 8 ou 16 bits valor_inicial) Onde: Tempo = Tempo que ir demorar para ocorrer o estouro do Timer0; Ciclo de mquina = 1/(Fosc/4) Fosc = freqncia do cristal

Modo 8 ou 16 bits = Modo escolhido 256 ou 65536 Valor_inicial = valor que ser colocado nos Registradores TMR0L e TMR0H

Vamos fazer um exemplo: Queremos em nosso projeto utilizar o Timer0 para a piscar um led ficando aceso 1 segundo e apagado por 1 segundo identificando atravs deste Led que o equipamento est ativado, operando normalmente. Utilizaremos ento cristal de 4MHz e Prescaler de 1:64

76

www.mecatronicadegaragem.blogspot.com

Tempo = ciclo de mquina * Prescaler * X Onde X o valor a ser colocado nos Registradores e dependendo deste valor utilizaremos modo 8 bits (valores at 256) ou 16 bits (valores at 65536). 1s = 1s * 64 * X X = 1s / (64 * 1s) X = 15625 Como valor maior que 256 teremos que usar Modo 16 bits Com isso, fazemos a seguinte conta: 65536 15625 = 49911 Este valor 49911 deve ser convertido de decimal para hexadecimal = C2F7 Ento, TMR0H = C2 e TMR0L = F7 Exerccio: a) Seguindo a idia do exemplo anterior, mude o tempo on/off do Led para 10s e modifique o Prescaler para 256. Encontre os valores que devem ser carregados em TMR0L e TMR0H. Como dever ficar configurado o Registrador T0CON para o exerccio anterior? Calcular o tempo de estouro do Timer0 onde T0CON = 0B10000010 e TMR0H=0x9E e TMR0L=0x58

b) c)

Registrador INTCON: Para configurar as interrupes que o microcontrolador poder atuar, precisamos conhecer os bits deste registrador. GIE/GIEH PEIE/GIEL TMR0IE INT0IE RBIE TMR0IF INT0IF RBIF

GIE/GIEH: Bit chave geral das interrupes e tambm chave que habilita as interrupes para atuar em alta prioridade. 0 = nenhuma interrupo ser tratada. 1 = liga chave geral para tratamento das interrupes.

77

www.mecatronicadegaragem.blogspot.com

PEIE/GIEL: Bit que habilita interrupes de baixa prioridade 0 = desativado baixa prioridade. 1 = ativado alta prioridade. TMR0IE: Bit que habilita tratamento de interrupo por estouro no TMR0. 0 = desabilita 1 = habilita INT0IE: Bit que habilita interrupo pela entrada INT0 0 = desabilita 1 = habilita RBIE: Bit que habilita interrupo pelo entrada RB0 0 = desabilita 1 = habilita TMR0F: Bit que sinaliza (Flag) ocorrncia da interrupo por estouro no TMR0 0 = no ocorreu Overflow 1 = ocorreu Overflow INT0F: Bit que sinaliza (Flag) ocorrncia da interrupo por evento na entrada INT0 0 = no ocorreu evento 1 = ocorreu evento RBIF: Bit que sinaliza (Flag) ocorrncia da interrupo por evento na entrada RB0 0 = no ocorreu evento 1 = ocorreu evento Existem outros Registradores responsveis pelo tratamento/configurao de interrupes e sero vistos oportunamente. Por hora, como estamos trabalhando apenas com o Timer0, estaremos usando os Registradores INTCON, T0CON, TMR0H e TMR0L.

78

www.mecatronicadegaragem.blogspot.com

/********************************************************************** Uptex Tecnologia & Treinamento Ltda Curso de Microcontroladores PIC Linguagem C Compilador MikroC Programa 26 Objetivo: Configurar e verificar a interrupo do timer0 em 8 bits - Temporizador *********************************************************************/ //programa que faz uso do Interrupo - Timer0 em 8 bits //aciona RD0 a cada 1 segundo unsigned contagem; void interrupt() { contagem++; // incrementa varivel de contagem TMR0L = 0; INTCON = 0x20; // Seta T0IE, e limpa a flag do estouro do TMR0 = T0IF }//~ void main() { T0CON = 0b11000001; // habilita contagem do TMR0, configura para 8 bits TRISD = 0; // e prescaler 1:4 portd=0; TMR0L = 0; tmr0h = 0; INTCON = 0xA0; // Habilita chave geral para estouro do TMR0 contagem = 0; // Initialize varivel contagem do { if (contagem == 1000) { // para contagem = 1000 teremos 1,02ms x 1000 = 1,02s PORTD.f0 = ~portd.f0; // troca estado do RD0 contagem = 0; // Reseta contagem } } while(1); }

79

www.mecatronicadegaragem.blogspot.com

/********************************************************************** Uptex Tecnologia & Treinamento Ltda Curso de Microcontroladores PIC Linguagem C Compilador MikroC Programa 27 Objetivo: Configurar e verificar a interrupo do timer0 em 16 bits - Temporizador *********************************************************************/ //programa que faz uso do Interrupo - Timer0 em 16 bits //aciona RD0 a cada 2 ou 5 segundos void interrupt() { PORTD.f0 = ~portd.f0; // troca estado do RD0 TMR0L = 0xF3; TMR0H = 0xC2; INTCON = 0x20; // Seta T0IE, e limpa a flag do estouro do TMR0 = T0IF } void main() { T0CON = 0b10000110; // habilita contagem do TMR0, configura para 16 bits TRISD = 0; // e prescaler 1:128 portd=0; // para 5 segundos: x=5/128us=39062 onde valor inicial ser //65532-39062 = 26470 que em hexa=0x6766 TMR0L = 0x66 e //TMRH=67; TMR0L = 0xF3; TMR0H = 0xC2; // para 2 segundos: x=2/128us= 15625 onde valor inicial //ser 65532 - 15625 = 49907 que em hexa=C2F3 //TMR0L=0xF3 e TMRH=C2; INTCON = 0xA0; // Habilita chave geral para estouro do TMR0 do { portd.f4=1; delay_ms(250); portd.f4=0; delay_ms(250); } while(1); }

80

www.mecatronicadegaragem.blogspot.com

/********************************************************************** Uptex Tecnologia & Treinamento Ltda Curso de Microcontroladores PIC Linguagem C Compilador MikroC Programa 28 Objetivo: Configurar e verificar a interrupo do timer0 em 8 bits - Contador *********************************************************************/ int contagem=0; char texto[15]; void main( ) { T0CON=0b11101000; //configura timer0 em 8 bits, sem uso prescaller e 1:1 trisd=0; portd=0; TMR0L=255; //carrega timer0 com 255 (basta 1 pulso para gerar interrupo INTCON.TMR0IF=0; //inicializa flag de estouro do Timer0 em nvel baixo LCD_Config(&portb,1,0,2,7,6,5,4); LCD_Cmd(LCD_Cursor_Off); LCD_Cmd(Lcd_Clear); LCD_Out(1,1, Contador Pulsos); do { if (INTCON.TMR0IF==1) { portd++; contagem++; wordtoStr(contagem,texto); LCD_Out(2,5, texto); TMR0L=255; INTCON.TMR0IF=0; } } while(1); } Obs: Troque o valor do Prescaller para 1:2 e veja resultado. Retorne configurao 1:1 e carregue agora o Registro TMR0L com valor 251 e verifique o que acontece na contagem.

//carrega novamente Timer0 com 255. //limpa a flag do estouro Timer0.

81

www.mecatronicadegaragem.blogspot.com

Memria EEPROM: O 18F452 possui internamente 256 bytes de EEPROM. No mikroC temos as seguintes funes de acesso EEPROM: EEPROM_READ(adress): l uma byte no endereo de memria. Exemplo: Leitura=eeprom_read(0); // faz a leitura do posio 0 da EEPROM e carrega na //varivel leitura. EEPROM_WRITE(adress,data): escreve um byte (data) no endereo (adress). Exemplo: Eeprom_write(0,25); //escreve o valor 25 no endereo 0 da EEPROM.

Obs: preciso ficar atento pois, cada posio de memria no pode ter mais que 8 bits (1 byte).

/********************************************************************** Uptex Tecnologia & Treinamento Ltda Curso de Microcontroladores PIC Linguagem C Compilador MikroC Programa 29 Objetivo: Gravar e fazer leitura na EEPROM do PIC *********************************************************************/ char texto[15]; int leitura_canal, valor; unsigned int i; void main( ) { trisd=0b00001111; portd=0; trisc=0; portc=0; adcon1=0b00001110; //configura RA0 como entrada analgica demais I/O lcd_config(&portb, 1,0,2,7,6,5,4); lcd_cmd(lcd_cursor_off); lcd_cmd(lcd_clear); lcd_out(1,1,"Leitura AN1");

82

www.mecatronicadegaragem.blogspot.com

do { leitura_canal=adc_read(0); leitura_canal=(leitura_canal)/20; wordtostr(leitura_canal,texto); lcd_out(2,1, texto); if(button(&portd,0,50,1)) // RD0 = grava na EEPROM valor do A/D { lcd_cmd(lcd_clear); lcd_out(1,1,"Salvando......."); i=leitura_canal; portc=i; delay_ms(1000); eeprom_write(0,i); portd.f7=1; delay_ms(500); portd.f7=0; portc=0; lcd_cmd(lcd_clear); lcd_out(1,1,"Leitura AN1"); } if(button(&portd,1,50,1)) // RD1 = busca na EEPROM valor gravado { portd.f5=1; lcd_cmd(lcd_clear); lcd_cmd(lcd_clear); lcd_out(1,1,"VALOR na EEPROM"); portd.f5=0; valor=eeprom_read(0); wordtostr(valor,texto); lcd_out(2,5, texto); delay_ms(1000); lcd_cmd(lcd_clear); lcd_out(1,1,"Leitura AN1"); } }while(1); } Exerccio: Desenvolva um programa que faa medio da Temperatura ambiente e se a temperatura ultrapassar 38 graus, este valor deve ser salvo na EEPROM e tambm acionar uma sada (RD7) indicando alarme.

83

www.mecatronicadegaragem.blogspot.com

Introduo s Interrupes: Diferente da famlia 16F, nos microcontroladores da famlia 18F temos o recurso de priorizar as interrupes. Como funciona? simples, definimos interrupes como baixa prioridade e alta prioridade. Se o microcontrolador est tratando uma interrupo de baixa prioridade e ocorre uma interrupo de alta prioridade, ele pra o que est fazendo, vai tratar a interrupo de alta prioridade e, quando terminar, a sim retorna o tratamento da interrupo de baixa prioridade. Na famlia 16F tnhamos um endereo de vetor de interrupo (ex: 0x04), j para o pic 18F452 temos dois vetores de interrupo: 0x08 para alta prioridade; 0x18 para baixa prioridade. Para o 18F452 temos as seguintes interrupes: - Interrupo no estouro do TIMER0; - Interrupo no estouro do TIMER1; - Interrupo no estouro do TIMER2; - Interrupo no estouro do TIMER3; - Interrupo por estimulo externo - INT0 (RB0); - Interrupo por estmulo externo - INT1 (RB1); - Interrupo por estmulo externo - INT2 (RB2); - Interrupo na mudana de Estado nos pinos: RB4, RB5, RB6 e RB7; - Interrupo na Recepo do canal serial; - Interrupo na Transmisso do canal serial; - Interrupo na Converso do A/D; - Interrupo no Mdulo CCP; - Interrupo no trmino de escrita na EEPROM; - Interrupo no Mdulo LVP (detector de baixa tenso). Para configurar/habilitar/verificar estas interrupes, utilizamos os seguintes registradores: - RCON; - INTCON; - INTCON2; - INTCON3; - PIE1; - PIE2; - IPR1; - IPR2; - PIR1; - PIR2. Precisamos, portanto, entender bem o que cada bit dentro de cada registrador faz para podermos definir como ir trabalhar o microcontrolador no controle do projeto.

84

www.mecatronicadegaragem.blogspot.com

RCON: IPEN ----------

----------

/RI

/TO

/PD

/POR

/BOR

IPEN= Habilita o tratamento de interrupes atravs de prioridades. 0 desabilita prioridade. Funcionamento igual famlia 16F. 1 habilita tratamento de interrupes por prioridade. /RI= Flag que sinaliza instruo de Reset 0 ocorreu instruo de reset 1 Funcionamento normal do PIC /TO= Flag que sinaliza estouro do Watch-dog Timer 0 ocorreu estouro do WDT 1 Funcionamento normal do PIC /PD= Flag que sinaliza evento de Power-Down (economia de energia - SLEEP) 0 ocorreu evento 1 Funcionamento normal do PIC /POR= Flag que sinaliza evento de POWER ON RESET Reset ao ligar 0 ocorreu o evento 1 no ocorreu o evento /BOR= Flag que sinaliza Brown-Out Reset 0 ocorreu o evento 1 no ocorreu o evento

85

www.mecatronicadegaragem.blogspot.com

INTCON: GIE/GIEH PEIE/GIEL TMR0IE INT0IE RBIE TMR0IF INT0IF RBIF GIE= Chave geral para habilitar o tratamento de interrupes. 0 Microcontrolador no ir tratar nenhuma interrupo. 1 Microcontrolador ir tratar interrupes. GIEH= Chave geral para habilitar o tratamento de interrupes de alta prioridade. 0 desabilita interrupo de alta prioridade 1 habilita interrupo de alta prioridade. PEIE= Chave individual para habilitar interrupo dos perifricos. 0 desabilita interrupo dos perifricos. 1 habilita interrupo dos perifricos. GIEL= Chave geral para habilitar o tratamento de interrupes de baixa prioridade. 0 desabilita interrupo de baixa prioridade 1 habilita interrupo de baixa prioridade. TMR0IE= Chave individual que ativa interrupo do TIMER0. 0 desabilita. 1 habilita. INT0IE= Chave individual que ativa interrupo do INT0. 0 desabilita. 1 habilita. RBIE= Chave individual que ativa interrupo por mudana de estado (RB4 RB7). 0 desabilita. 1 habilita. TMR0IF= Flag de sinalizao da interrupo do estouro do TIMER0. 0 no ocorreu interrupo por estouro do TIMER0. 1 ocorreu interrupo por estouro do TIMER0. INT0IF= Flag de sinalizao da interrupo da mudana de Estado do INT0. 0 no ocorreu interrupo por mudana de Estado no pino RB0. 1 ocorreu interrupo por mudana de Estado no pino RB0. RBIF= Flag de sinalizao da interrupo da mudana de Estado (RB4 a RB7). 0 no ocorreu interrupo por mudana de Estado nos pinos RB4 RB7. 1 ocorreu interrupo por mudana de Estado nos pinos RB4 RB7.

86

www.mecatronicadegaragem.blogspot.com

INTCON2:
RBPU INTEDG0 INTEDG1 INTEDG2 ---------TMR0IP --------RBIP

RBPU= Chave que define se vai haver ou no resistores de Pull-Up no PORTB. 0 Habilita resistores de pull-up. 1 desabilita resistores de pull-up. INTEDG0= Define a borda que acionar o evento de interrupo no INT0. 0 evento ocorrer na borda de descida. 1 evento ocorrer na borda de subida. INTEDG1= Define a borda que acionar o evento de interrupo no INT1. 0 evento ocorrer na borda de descida. 1 evento ocorrer na borda de subida. INTEDG2= Define a borda que acionar o evento de interrupo no INT2. 0 evento ocorrer na borda de descida. 1 evento ocorrer na borda de subida. TMR0IP= Define a prioridade da interrupo do TIMER0. 0 definida como baixa prioridade. 1 definida como alta prioridade. RBIP= Define a prioridade da interrupo da mudana de Estado (RB4 RB7). 0 definida como baixa prioridade. 1 definida como alta prioridade.

87

www.mecatronicadegaragem.blogspot.com

INTCON3:
INT2IP INT1IP ---------INT2IE INT1IE --------INT2IF INT1IF

INT2IP= Define a prioridade da interrupo externa no INT2. 0 definida como baixa prioridade. 1 definida como alta prioridade. INT1IP= Define a prioridade da interrupo externa no INT1. 0 definida como baixa prioridade. 1 definida como alta prioridade. INT2IE= Chave individual que ativa interrupo do INT2. 0 desabilita. 1 habilita. INT1IE= Chave individual que ativa interrupo do INT1. 0 desabilita. 1 habilita. INT2IF= Flag de sinalizao da interrupo da mudana de Estado do INT2. 0 no ocorreu interrupo por mudana de Estado no pino RB2. 1 ocorreu interrupo por mudana de Estado no pino RB2. INT1IF= Flag de sinalizao da interrupo da mudana de Estado do INT1. 0 no ocorreu interrupo por mudana de Estado no pino RB1. 1 ocorreu interrupo por mudana de Estado no pino RB1.

88

www.mecatronicadegaragem.blogspot.com

PIE1:
PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE

PSPIE= Chave individual que habilita interrupo da Porta Paralela Escrava (R/W); 0 desabilita. 1 habilita. ADIE= Chave individual que habilita interrupo do Conversor A/D. 0 desabilita. 1 habilita. RCIE= Chave individual que habilita interrupo por recebimento de dados na USART. 0 desabilita. 1 habilita. TXIE= Chave individual que habilita interrupo por transmisso de dados na USART. 0 desabilita. 1 habilita. SSPIE= Chave individual que habilita interrupo do Mdulo SSP (Mster Syncronous Serial Port). 0 desabilita. 1 habilita. CCP1IE= Chave individual que habilita interrupo de Captura/Compare no TIMER1. 0 desabilita. 1 habilita. TMR2IE= Chave individual que habilita interrupo por igualdade entre TMR2 e PR2. 0 desabilita. 1 habilita. TMR1IE= Chave individual que habilita interrupo de estouro do TIMER1. 0 desabilita. 1 habilita.

89

www.mecatronicadegaragem.blogspot.com

PIE2:
------------------------EEIE BCLIE LVDIE TMR3IE CCP2IE

EEIE= Chave individual que habilita interrupo de escrita na EEPROM/FLASH. 0 desabilita. 1 habilita. BCLIE= Chave individual que habilita interrupo de coliso de dados. 0 desabilita. 1 habilita. LVDIE= Chave individual que habilita interrupo do Mdulo LVD (baixa tenso). 0 desabilita. 1 habilita. TMR3IE= Chave individual que habilita interrupo por estouro do TIMER3. 0 desabilita. 1 habilita. CCP2IE= Chave individual que habilita interrupo do Mdulo CCP2. 0 desabilita. 1 habilita.

90

www.mecatronicadegaragem.blogspot.com

PIR1:
PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF

PSPIF= Flag de sinalizao da interrupo da Porta Paralela Escrava (R/W); 0 no ocorreu leitura ou escrita. 1 ocorreu leitura ou escrita na porta paralela. ADIF= Flag de sinalizao da interrupo do Conversor A/D. 0 converso no est completa. 1 converso finalizada. RCIF= Flag que sinaliza interrupo por recebimento de dados na USART. 0 buffer est vazio. 1 buffer tem dados recebidos. TXIF= Flag que sinaliza interrupo por transmisso de dados na USART. 0 buffer tem dados para enviar. 1 buffer est vazio. SSPIF= Flag de sinalizao do Mdulo SSP (Mster Syncronous Serial Port). 0 aguardando transmisso/recepo. 1 Transmisso/Recepo est completa. CCP1IF= Flag de sinalizao da interrupo de Captura/Compare no TIMER1. Modo Captura 0 no ocorreu interrupo por captura no TIMER1. 1 ocorreu interrupo por captura no TIMER1. Modo Compara 0 no ocorreu interrupo por comparao no TIMER1. 1 ocorreu interrupo por comparao no TIMER1. TMR2IF= Flag de sinalizao da interrupo por igualdade entre TMR2 e PR2. 0 no ocorreu interrupo por igualdade entre TMR2 e PR2. 1 ocorreu interrupo por igualdade entre TMR2 e PR2. TMR1IF= Flag de sinalizao de estouro do TIMER1. 0 no ocorreu interrupo por estouro do TIMER1. 1 ocorreu interrupo por estouro do TIMER1.

91

www.mecatronicadegaragem.blogspot.com

PIR2:
------------------------EEIF BCLIF LVDIF TMR3IF CCP2IF

EEIF= Flag de sinalizao da interrupo de escrita na EEPROM/FLASH. 0 operao de escrita no est completa ou no foi inicializada. 1 ocorreu o trmino operao de escrita est completa. BCLIF= Flag de sinalizao de coliso de dados. 0 no ocorreu coliso de dados. 1 ocorreu coliso de dados. LVDIF= Flag que sinaliza interrupo do Mdulo LVD (baixa tenso). 0 no ocorreu evento de interrupo. 1 ocorreu evento de interrupo. TMR3IF= Flag que sinaliza interrupo por estouro do TIMER3. 0 no ocorreu evento de interrupo. 1 ocorreu evento de interrupo. CCP2IF= Flag de sinalizao do Mdulo CCP2. Modo Captura 0 no ocorreu interrupo por captura no TIMER1. 1 ocorreu interrupo por captura no TIMER1. Modo Compara 0 no ocorreu interrupo por comparao no TIMER1. 1 ocorreu interrupo por comparao no TIMER1.

92

www.mecatronicadegaragem.blogspot.com

IPR1:
PSPIP ADIP RCIP TXIP SSPIP CCP1IP TMR2IP TMR1IP

PSPIP= Bit que define a prioridade na interrupo da Porta Paralela Escrava (R/W); 0 baixa prioridade. 1 alta prioridade. ADIP= Bit que define a prioridade na interrupo do Conversor A/D. 0 baixa prioridade. 1 alta prioridade. RCIP= Bit que define a prioridade na interrupo por recebimento de dados na USART. 0 baixa prioridade. 1 alta prioridade. TXIP= Bit que define a prioridade na interrupo por transmisso de dados na USART. 0 baixa prioridade. 1 alta prioridade. SSPIP= Bit que define a prioridade na interrupo do Mdulo SSP (Master Syncronous Serial Port). 0 baixa prioridade. 1 alta prioridade. CCP1IP= Bit que define a prioridade na interrupo de Captura/Compare no TIMER1. 0 baixa prioridade. 1 alta prioridade. TMR2IP= Bit que define a prioridade na interrupo por igualdade entre TMR2 e PR2. 0 baixa prioridade. 1 alta prioridade. TMR1IP= Bit que define a prioridade na interrupo de estouro do TIMER1. 0 baixa prioridade. 1 alta prioridade.

93

www.mecatronicadegaragem.blogspot.com

IPR2:
------------------------EEIP BCLIP LVDIP TMR3IP CCP2IP

EEIP= Bit que define a prioridade na interrupo de escrita na EEPROM/FLASH. 0 baixa prioridade. 1 alta prioridade. BCLIP= Bit que define a prioridade na interrupo de coliso de dados. 0 baixa prioridade. 1 alta prioridade. LVDIP= Bit que define a prioridade na interrupo do Mdulo LVD (baixa tenso). 0 baixa prioridade. 1 alta prioridade. TMR3IP= Bit que define a prioridade na interrupo por estouro do TIMER3. 0 baixa prioridade. 1 alta prioridade. CCP2IP= Bit que define a prioridade na interrupo do Mdulo CCP2. 0 baixa prioridade. 1 alta prioridade.

Estrutura de Programa utilizando Interrupes de Alta e Baixa Prioridade: Obs: Quando utilizar alta e baixa prioridade devemos desenvolver o programa conforme segue abaixo: void interrupt ( ) // vetor de interrupo alta prioridade { Comandos; Comandos; // Obs: No esquecer que necessrio limpar a Flag da interrupo. } Void interrupt_low ( ) { Comandos; Comandos; // Obs: No esquecer que necessrio limpar a Flag da interrupo. } Void main ( ) { Comandos; Comandos; }

94

www.mecatronicadegaragem.blogspot.com

Inicialmente vamos verificar funcionamento de Interrupes sem prioridade. Para o exemplo abaixo temos um programa onde algumas sadas do portc so acionadas por determinado tempo, como se fosse um simulador de presena residencial; no entanto, na entrada RB0 estamos com uma entrada de interrupo (INT0) onde teremos um sensores de movimento na garagem. Portanto, caso sensor seja acionado, o programa principal pra onde est e vai tratar a interrupo, neste momento, uma sada acionada por determinado tempo, acionando a luminao da garagem. Terminado este tempo, programa retorna onde parou quando ocorreu a interrupo. Ocorrendo novo evento a situao se repete. /********************************************************************** Uptex Tecnologia & Treinamento Ltda Curso de Microcontroladores PIC Linguagem C Compilador MikroC Programa 30 Objetivo: Verificar tratamento de interrupes INT0 *********************************************************************/ int contador=0; void interrupt() { portd.f7=1; // dispara iluminao da garagem delay_ms(6000); // delay de 6 segundos portd.f7=0; intcon.int0if=0; //apaga a Flag da interrpo INT0 } void main ( ) { intcon2.rbpu=0; trisb.f0=1; trisd=0; trisc=0; portc=0; portd=0; intcon=0b11010000; intcon2.intedg0=0;

//habilita resistores de Pull-Up no portb

// chave geral ligada, chave perifricos ligada // chave que ativa interrupo do TIMER0 ativa //seleciona borda de descida

95

www.mecatronicadegaragem.blogspot.com

do { portc.f0=1; delay_ms(1000); portc.f0=0; delay_ms(1000); portc.f4=1; delay_ms(500); portc.f4=0; portc.f2=1; delay_ms(1500); portc.f2=0; portc.f3=1; delay_ms(500); portc.f3=0; } while(1); } // simulador de presena residencial

Vamos agora melhorar nosso projeto colocando mais um recurso. J temos simulador de presena (portc), controle de iluminao da garagem (Int0) e agora vamos colocar mais uma interrupo (INT1). Nesta entrada (pino RB1) vamos colocar um ou mais sensores de abertura de portas e janelas / sensor de movimento dentro da residncia. (sensores ligados em srie).

96

www.mecatronicadegaragem.blogspot.com

/********************************************************************** Uptex Tecnologia & Treinamento Ltda Curso de Microcontroladores PIC Linguagem C Compilador MikroC Programa 31 Objetivo: Verificar tratamento das interrupes INT1 e INT2 *********************************************************************/ int contador=0; void interrupt() { if (intcon.int0if==1) { portd.f0=1; delay_ms(6000); portd.f0=0; intcon.int0if=0; }

// testa se foi interrupo INT0 (Iluminao da Garagem) // aciona iluminao // delay de 6 segundos // apaga Flag do INT0

if (intcon3.int1if==1) // testa se foi interrupo INT1 (Sistema de Alarme) { portd.f7=1; // dispara a sirene portd.f5=1; // ativa led que sinaliza ocorencia de alarme delay_ms(10000); portd.f7=0; intcon3.int1if=0; } } void main ( ) { intcon2.rbpu=0; trisb.f0=1; trisb.f1=1; trisd=0; trisc=0; portc=0; portd=0; intcon=0b11010000; intcon2.intedg0=0; intcon3.int1ie=1; intcon2.intedg1=0;

//habilita resistores de Pull-Up //RB0 entrada //RB1 entrada

// chave geral, individual e do INT0 ligadas //seleciona borda de descida para INT0 //habilita chave individual para INT1 //seleciona borda de descida para INT1

97

www.mecatronicadegaragem.blogspot.com

do { portc.f0=1; // simulador de presena residencial delay_ms(1000); portc.f0=0; delay_ms(1000); portc.f4=1; delay_ms(500); portc.f4=0; portc.f2=1; delay_ms(1500); portc.f2=0; portc.f3=1; delay_ms(500); portc.f3=0; } while(1); }

Para o programa acima, observe que problema interessante: Ao gerar interrupo pelo acionamento da iluminao da garagem (INT0) e em seguida, enquanto o microcontrolador ainda est tratando esta interrupo e ocorrer outra interrupo - invaso na residncia (INT1) o alarme s ir disparar aps o tratamento da interrupo INT0. Ai est um problema grave, pois teramos que priorizar o alarme sobre a iluminao da garagem. Deparamos neste caso com a grande vantagem e potencialidade da famlia 18F. Como o 18F452 possui dois vetores de interrupo, podemos separar as interrupes entre alta e baixa prioridade. Com isso, caso o Microcontrolador esteja tratando uma interrupo de baixa prioridade e vir a ocorrer a interrupo de alta prioridade, o programa ir parar temporariamente o tratamento da baixa prioridade e ir executar o de alta prioridade. Terminando a alta prioridade, a sim ir retornar para continuar execuo da baixa prioridade e por fim voltar ao programa principal (Simulao de Presena). Vamos ento fazer uma modificao: INT1 colocar sistema de Alarme em Alta Prioridade; INT2 colocar a iluminao da garagem em Baixa Prioridade

98

www.mecatronicadegaragem.blogspot.com

/********************************************************************** Uptex Tecnologia & Treinamento Ltda Curso de Microcontroladores PIC Linguagem C - Compilador MikroC Programa 32 Objetivo: Verificar tratamento das interrupes - INT2 e INT1 com prioridade *********************************************************************/ int contador=0; void interrupt() { portd.f7=1; portd.f5=1; delay_ms(10000); portd.f7=0; intcon3.int1if=0; } void interrupt_low() { portd.f0=1; delay_ms(6000); portd.f0=0; intcon3.int2if=0; } void main ( ) { intcon2.rbpu=0; trisb.f0=1; trisb.f2=1; trisd=0; trisc=0; portc=0; portd=0; // Interrupo de alta prioridade // interrupo INT1 (Sistema de Alarme) // dispara a sirene // ativa led que sinaliza ocorrncia de alarme // apaga Flag do INT1

// Interrupo de baixa prioridade // interrupo INT2 (Iluminao da Garagem) // aciona iluminao // delay de 6 segundos

//habilita resistores de Pull-Up //RB0 entrada //RB2 entrada

rcon.ipen=1; // Habilita interrupo com prioridade intcon.gieh=1; //ativa chave geral de alta prioridade intcon.giel=1; //ativa chave geral de baixa prioridade intcon2.intedg2=0; //seleciona borda de descida para INT2

99

www.mecatronicadegaragem.blogspot.com

intcon3.int1ie=1; // habilita chave individual para INT1 intcon3.int2ie=1; // habilita chave individual para INT2 intcon3.int1ip=1; // habilita INT1 como prioridade alta intcon3.int2ip=0; // habilita INT2 como baixa prioridade do { portc.f0=1; // simulador de presena residencial delay_ms(1000); portc.f0=0; delay_ms(1000); portc.f4=1; delay_ms(500); portc.f4=0; portc.f2=1; delay_ms(1500); portc.f2=0; portc.f3=1; delay_ms(500); portc.f3=0; } while(1); }

Exerccio: Modifique o programa fazendo uso agora da prioridade alta em RB4 a RB7 (4 zonas de alarme), usando o portc para sinalizao de zona disparada (RC0= Zona 1, RC1= Zona 2, RC3 = Zona 3 e RC4 = Zona 4), RD7 para sada para iluminao da garagem (minuteria) e RD0 RD6 para Simulador de Presena. Manter prioridade alta para alarme e baixa para iluminao da garagem.

100

Das könnte Ihnen auch gefallen