Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________

Índice
Linguagem C...................................................................................................... Programação de Microcontroladores em linguagem C...................................... Princípio de programação - Álgebra Booleana.......................................................................................... - Operações...................................................................................................... - Representação Gráfica das Portas Lógicas.................................................... Introdução à Linguagem C - Variáveis........................................................................................................ - Tipos de Dados.............................................................................................. - Qualificadores............................................................................................... - Declaração de variáveis................................................................................. - Operadores matemáticos - Aritméticos................................................................................................. - Relacionais................................................................................................. - Operadores Lógicos bit-a-bit...................................................................... - Operadores Lógicos relacionais................................................................. - Declarações de controle - Decisão – Comando IF............................................................................... - Decisão – Comando IF-ELSE.................................................................... - Decisão – SWITCH-CASE........................................................................ - Laço FOR...................................................................................................... - Laço WHILE................................................................................................. - Laço DO-WHILE.......................................................................................... - Ponteiros........................................................................................................ - Matrizes......................................................................................................... O Ambiente MikroC........................................................................................... - Criando um novo projeto............................................................................... - Primeiro Projeto............................................................................................ - Gravando o projeto........................................................................................ Acionamento de Botões...................................................................................... Estudo dos Timers e Interrupções - Timer 0.......................................................................................................... 1 26 9 9 10 11 11 12 12 13 14 15 16 18 24 7 7 8 8 6 6 6 7 5 5 5 3 3

Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ - Timer 1.......................................................................................................... - Timer 2.......................................................................................................... Funções............................................................................................................... Debug no MikroC............................................................................................... Display de Cristal Líquido (LCD)...................................................................... Conversão A/D................................................................................................... Comunicação Serial (USART)........................................................................... EEPRON Interna................................................................................................ PWM................................................................................................................... 30 33 38 39 42 46 48 53 55

2

Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________

Linguagem C
É uma linguagem de programação de propósito geral, estruturada, imperativa, procedural de alto e baixo nível, criada em 1972 por Dennis Ritchie no AT&T Bell Labs, para desenvolver o sistema operacional UNIX (que foi originalmente escrito em Assembly). Desde então, espalhou-se por muitos outros sistemas e tornou-se uma das linguagens de programação mais usadas influenciando muitas outras linguagens, especialmente o C++, que foi desenvolvida como uma extensão para C. Fonte: WIKIPEDIA

Programação de Microcontroladores em linguagem C
Atualmente, a maioria dos microcontroladores existentes nos mercado contam com compiladores em C para o desenvolvimento de software, pois a linguagem C permite a construção de programas e aplicações muito mais complexas do que o Assembly. O compilador C tem a capacidade de “traduzir” com alto grau de inteligência e velocidade o código em C para o código de máquina, portanto podemos dizer que a linguagem C possui grande eficiência. Essa eficiência da linguagem C faz com que o programador preocupe-se mais com a programação em si e o compilador assume responsabilidades como localização da memória, operações matemáticas e lógicas, verificação de bancos de memórias e outros..

3

Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________

Princípio de Programação Álgebra Booleana
Na matemática e na ciência da computação, as álgebras booleanas são estruturas algébricas que “captam a essência” das operações lógicas E, OU e NÃO (NAD, OR e NOT), bem como das operações da teoria de conjuntos soma, produto e complemento. Álgebra Booleana deriva do nome de George Boole, matemático inglês que foi o primeiro a definí-las como parte de um sistema de código em meados do século XIX. Foram aplicadas pela primeira vez em eletrônica por Claude Shannon no século XX. Os operadores de álgebra booleana são frequentemente escritos com E, OU ou NÃO (mais comuns são os equivalentes em inglês, AND, OR ou NOT). Na descrição de circuitos podem ser utilizados NAND (NOT AND), NOR (NOT OR) e XOR (OR exclusivo). Operações: OR X 0 0 1 1 Y 0 1 0 1 S 0 1 1 1 X 0 0 1 1 AND Y 0 1 0 1 S 0 0 0 1 NOT X 0 1 S 1 0 X 0 0 1 1 XOR Y 0 1 0 1 S 1 0 0 1

Representação Gráfica das Portas Lógicas:

4

Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ CONT.:

5

17549435082e-38 à (+-) 6.80564774407e38 (+-) 1. etc.17549435082e-38 à (+-) 6. do. sempre começando com letras e não devem ter nome de palavras reservadas pelo compilador como. por exemplo.80564774407e38 (+-) 1. int. 6 . for. Tipos de Dados: Dado: -char -int -float e double -void Qualificadores: Qualificador -signed -unsigned -short -long Significado Sinalizado Não sinalizado Inteiro menor que o padrão Inteiro maior que o padrão Representa: Caracteres Números inteiros Números decimais (ponto flutuante) Valores nulos Tipo signed char (unsigned) char (signed) short (int) unsigned short (int) (signed) int unsigned int (signed) long (int) unsigned long (int) float double long double Tamanho 8 bits 8 bits 8 bits 8 bits 16 bits 16 bits 32 bits 32 bits 32 bits 32 bits 32 bits Valores -128 à 127 0 à 255 -128 à 127 0 à 255 -32768 à 32767 0 à 65535 -2147483648 à 2147483647 0 à 4294967295 (+-) 1.80564774407e38 * Palavras entre parenteses são opcionais.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Introdução à Linguagem C Variáveis: As variáveis podem conter letras e números.17549435082e-38 à (+-) 6.

Para atribuir valores às variáveis: conta = 100. short x1.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Declaração de Variáveis: Um variável é declarada da seguinte forma: <qualificador> + <tipo de dado> + <nome da variável> + <valor>. int conta. Exemplos: unsigned int x = 12345. (atribui-se o valor 100 à variável conta) x1 = 15. (atribui-se o valor 15 à variável x1) Operadores Matemáticos: Aritméticos: Operador Descrição + * / % ++ -Soma dos argumentos Subtração dos argumentos Multiplicação dos argumentos Divisão dos argumentos Exemplo a+b a-b a*b a/b Resto da divisão (só pode ser utilizado com valores a % b inteiros) Soma 1 ao argumento Subtrai 1 ao argumento a++ a-- 7 . onde o valor pode ou não ser inicializado.

Operador Descrição == != > < >= <= Compara se igual a Compara se diferente de Compara se maior que Compara se menor que Compara se maior ou igual a Compara se menor ou igual a Exemplo a == 5 a != 5 a>5 a<5 a >= 5 a <= 5 Operadores lógicos bit-a-bit: Operador Descrição & | ^ ~ >> << E (AND) OU (OR) OU EXCLUSIVO (XOR) Complemento (NOT) Deslocamento à direita Deslocamento à esquerda Operadores lógicos relacionais: Operador Descrição && || ! Comparação lógica E (AND) Comparação lógica OU (OR) Comparação lógica Complemento (NOT) 8 .Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Relacionais: São utilizados para comparação entre argumentos e retornam uma resposta verdadeira ou falsa. todo valor igual a 0 será considerado falso e todo valor diferente de 0 (qualquer valor) será considerado verdadeiro. Como em linguagem C não existe uma variável booleana para um resultado verdadeiro ou falso.

conta1++. a condição IF é utilizada da mesma forma acima. Exemplos: if (conta>50) conta = 0. o comando2 será executado. } Decisão – Comando IF-ELSE: Neste caso. Caso a expressão seja verdadeira.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Declarações de controle: Decisão – Comando IF: O comando IF é utilizado para avaliar uma determinada condição e determinar se ela é verdadeira. o comando será executado. comando2. caso seja falsa. Sua forma é: if (exp) comando1. else comando2. sendo que agora. sendo que agora. } 9 . caso seja. Se o resultado da condição referente a expressão (exp) for verdadeiro. if (exp) { comando1. o comando1 será executado. se a condição da expressão for falsa a condição ELSE será executada. } Para o caso acima. o programa segue sem executar o comando. executa os bloco contido dentro desta condição. caso contrário. Exemplo: if (conta>0) { conta = 0. serão executados os comando1 e comando2. se a condição da expressão for verdadeira. a mesma explicação anterior se encaixa. conta1++. Sua forma geral é: if (exp) comando. if (conta>50) { conta = 0.

. . agora se o valor for diferente de qualquer caso (case). case 15: conta2++. . } Neste caso... o comando1 será executado. a variável será testada e se o valor dela for igual a valor1. se o valor for igual a 15. else if(exp3) comando3. Exemplo: switch(conta) { case 10 : conta1++. case 20: conta1++. . caso o valor de conta seja igual a 20. break.. para isso podemos utilizar o SWITCH-CASE. case valor2: comando2. default: conta3++. break... . default: comandoN.. Segue sua forma: switch(variável) { case valor1: comando1.. break.... o comandoN será executado. conta2++ break.. o valor de conta2 será incrementado.. o comando2 será executado e assim por diante.... tanto conta1 quanto conta2 10 . break.. o comando IF pode ficar meio confuso ou sem muita eficiência. conta1 será incrementado. else if (exp2)comando2.. } Neste caso.. Decisão SWITCH-CASE: Quando existem muitos valores para testar de uma só variável... como a forma abaixo: if (exp1) comando1.. se o valor de conta for igual a 10.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ else conta++. . se for igual ao valor2. É possível também encadear diversos comando IF. .

} onde: inicialização: essa seção conterá uma inicialização para a variável. int a = 0.condição(término). } Exemplo: int x.conta++) a = a + conta. o valor de conta3 será incrementado.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ serão incrementados. for(inicialização. os comandos serão repetidos enquanto a expressão for verdadeira. 11 . incremento: aqui pode conter uma ou mais variáveis para incremento da variável.incremento) comando: ou.incremento) { comando1. sua forma é: while (exp) { comando. comando2. condição: responsável por contar a condição de finalização do laço. Laço WHILE: Neste laço. para todos outros valores diferentes. for (conta=0. Laço FOR: Este é um dos comandos de laço (loop ou repetição) disponíveis na linguagem C. a sua forma é: for(inicialização.conta<=10.condição(término). Exemplo: int conta. while(x<=10) x++.

} while(y!=1). O comando será executado pelo menos uma vez antes de verificar a condição da expressão. o ponteiro é um apontador para uma outra variável. 12 . int y. } while(exp). Exemplo: int *idade. do { x++. A sintaxe para a declaração de uma variável ponteiro é: TIPO *NOME onde TIPO é um tipo de dados válido e NOME é o nome da variável.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Laço DO-WHILE: Este laço é uma variação do comando WHILE. Sua forma é: do { comando. Exemplo: int x. Ponteiros: Podemos dizer que um ponteiro é uma variável onde será armazenado o endereço de outra variável. ou seja. sendo que neste caso o comando será executado antes de testa se a condição é verdadeira.

Você pode inicializar os elementos de uma matriz na sua declaração usando a sintaxe: int notas[5] = {60. //esta matriz pode armazenar até 30 valores do tipo float.68}. Todos os dados colocados na matriz devem ser deste tipo.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Exibindo uma string usando um ponteiro: Uma string é uma matriz de caracteres. o primeiro elemento é nota[0] e o último elemento é nota[29]. Obs. E QUANTIDADE é a quantidade máxima de itens a ser armazenados. onde TIPO é o tipo dos dados que serão armazenados na matriz. mostrada no exemplo acima. Este nome identificará a matriz no código do programa.70. float nota[30].50. página 48. } Obs. 13 . NOME é o nome a ser dado a matriz. do { Usart_Write(*txt). para nossa matriz nota. //esta matriz pode armazenar até 50 valores do tipo int. //incrementa o ponteiro delay_ms(100). O primeiro elemento da matriz é indexado como item zero e o último é indexado como QUANTIDADE menos 1. Podemos usar um ponteiro para exibí-la assim: unsigned char *txt = "Exibindo uma string usando um ponteiro.: Ver exemplo serial3. //envia um caracter pela serial *txt++.". Assim. Os valores armazenados na matriz são chamados de "elementos da matriz". Matrizes: Uma matriz é uma estrutura de dados que pode armazenar vários valores do mesmo tipo. } while (*txt != '\0').: Ver exemplo na página 49. Exemplos: int nr_de_livros[50]. A sintaxe para declarar uma matriz é: TIPO NOME[QUANTIDADE].35.

Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ O Ambiente MikroC O compilador MikroC foi desenvolvido pela Mikroelektronika e é com ele que vamos desenvolver nossos projetos. 14 . Abaixo está a tela inicial do compilador.

15 . -Em Clock. deverá conter o caminho da pasta onde o projeto será salvo.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Criando um novo projeto: O mikroC organiza as aplicações dentro de projetos. -Em Device. -Em Project Path. Para criar um projeto basta clicar menu “Project” e em seguida escolha a opção “New Project”. -Description é opcional e pode-se relatar algo sobre o projeto. deve-se escolher o dispositivo a ser utilizado no projeto. -Em Device Flags. A compilação do arquivo fonte somente poderá ser realizada se fizer parte de um projeto. informa-se a freqüência do cristal que será utilizado na montagem do circuito. A seguinte tela será apresentada: -Em Project Name. deve-se informar o nome do projeto. as informação são em relação à configuração dos fusíveis. onde nele é possível ter vários arquivos fonte.

: Tudo que vem precedido de // é chamado comentário e não é interpretado pelo compilador. -Device : P16F877A -Clock : 004.000000 -Device Flags: Default Circuito: Estrutura básica de um programa em C utilizando o compilador mikroC: void main() { //Este é o bloco principal do programa e é o único que a linguagem C precisa para funcionar. } obs.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Primeiro Projeto Definindo o projeto: -Project Name : PiscaLed -Project Path : \MikroC\Proj1\ -Description : ... Também pode-se fazer comentário assim: /* Isto é um comentário */ 16 ..

delay_ms(1000). A compilação se dá pressionando-se “ctrl + F9” ou clicando no menu Project e escolher a opção Build. TRISD = 0. } } Depois de escrevermos o código.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Código do Projeto: void main() { PORTD = 0. while(1) { PORTD = ~PORTD. devemos compilar o projeto para que possamos gravar no microcontrolador. //Configura os pinos da porta D como saída //Começo do loop (infinito) //Troca situação dos pinos na porta D //Tempo de atraso de 1 segundo 17 . conforme abaixo.

as informações abaixo devem ser mostradas na parte de baixo do programa.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Estando o projeto sem erros. para gravar o programa no microcontrolador. o programa ICPROG como segue a figura abaixo: 18 . Gravando o Projeto Utilizaremos.

então.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Antes de gravarmos o programa. diretamente. Para isso. precisamos configurar o ICPROG para o correto funcionamento com a placa CUSCOPIC. Clica-se em 'OK' e o programa ICPROG estará pronto. escolher o dispositivo a ser gravado na janela destacada em vermelho. clica-se em Configuração e escolhe-se a opção 'Hardware' ou. Então. Abrindo o programa: Vamos. escolhe-se. em 'Programador:' a opção 'TAIT Serial Programmer'. conforme abaixo: 19 . pressiona-se a tecla F3. conforme acima e deve-se também em 'Comunicação' habilitar a opção 'Iverter MCLR'. A tela de 'Configurações de Hardware' aparecerá.

O programa ICPROG terá a aparência parecida com a figura abaixo: 20 . Clica-se em 'Arquivo' e escolhe-se a opção 'Abrir': Na janela que se abre a seguir.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Agora abriremos o programa referente ao nosso projeto. deveremos encontrar o arquivo do nosso projeto. que neste caso é o arquivo 'PiscaLed.hex'.

Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Identificação dos botões: -Ler Tudo: Usado para a leitura do conteúdo gravado no microcontrolador. Gravando o programa: Para gravar o programa no microcontrolador. 21 . então o botão 'Limpar Tudo'. confirmamos a pergunta clicando em 'Sim'. pressionaremos. -Verificar: Usado para fazer uma comparação do conteúdo gravado no microcontrolador com o programa aberto. para certificarmos que o microcontrolador estará pronto para o nosso programa e logo após. -Programar Tudo: Usado para gravarmos o programa no microcontrolador. Na janela que é mostrada. -Limpar Tudo: Usado para limparmos o conteúdo gravado no microcontrolador. pressiona-se 'Programar Tudo'.

nosso programa já está no microcontrolador. } } //Configura o pino 0 da porta D com saída //Faz com que o pino 0 da Porta D tenha nível lógico 0 //Tempo de atraso de 500ms //Faz com que o pino 1 da porta D tenha nível lógico 1 //Tempo de atraso de 500ms -O projeto abaixo tem a mesma função.F0 = 0. Led = 1. Projetos de fixação: -Este projeto faz piscar o led conectado ao pino 0 da porta D void main() { TRISD.F0 como Led void main() { DirLed = 0. while (1) { Led = 0. delay_ms(500). a seguinte mensagem aparecerá: Pronto. se tudo estiver correto.F0 como DirLed #define Led PORTD.F0 //Identifica a variável TRISD. só que utiliza a diretiva #define para identificação. delay_ms(500).F0 = 0. while (1) { PORTD. } } //Configura o pino 0 da porta D com saída //Faz com que o pino 0 da Porta D tenha nível lógico 0 //Tempo de atraso de 500ms //Faz com que o pino 1 da porta D tenha nível lógico 1 //Tempo de atraso de 500ms 22 .Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Após a gravação. delay_ms(500).F0 = 1.F0 //Identifica a variável PORTD. conforme abaixo: #define DirLed TRISD. PORTD. delay_ms(500).

como variáveis. atraso de 300ms. Exercício proposto: -Fazer um programa onde todos os LEDS serão acesos em seqüência. podemos atribuir valor e tratá-los exatamente como uma variável qualquer. outro atraso de 300ms e assim por diante até o LED8. TMR0 e outros são tratados. exemplo: acende LED1.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ obs.: Os registradores especiais. TRISD. 23 . INTCON. pelo compilador. TRISA. PORTA. em seguida fazer com que todos apaguem também começando do LED1 e terminando no LED8. acende LED2. PORTD. portanto.

.000000 -Device Flags: Default Circuito: 24 .Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Acionamento de Botões Definindo o projeto: -Project Name : Botao -Project Path : \MikroC\Proj2\ -Description : . -Device : P16F877A -Clock : 004...

Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Código do Projeto: #define botao PORTD.F0 #define led PORTD. //Coloca em 0 o pino 1 da porta D. PORTD = 0x00. acendendo o LED delay_ms(1000). //Configura o pino 0 da porta D como entrada e o restante como saída PORTD = 0x00. //Coloca em 1 o pino 1 da porta D.F1 void main() { TRISD = 0x01. apagando o LED } } } 25 . } } Projeto de fixação: #define botao PORTD. então acende o led conectado ao //pino 1 da porta D.F0 #define led PORTD. //Zera toda a porta D while(1) //Loop principal { if (botao == 1) //Compara o valor do pino 0 ao valor 1 (nível lógico alto) led = 1.F1 void main() { TRISD = 0x01. //Atraso de 1 segundo led = 0. //Sendo o valor igual a 1. //Configura o pino 0 da porta D como entrada e o restante como saída //Zera toda a porta D while(1) //Loop principal { if (botao == 1) //Compara o valor do pino 0 ao valor 1 (nível lógico alto) { //Sendo o valor igual a 1. executa os comandos do bloco led = 1.

Ele possui um prescaler de até 1:256 e tem 8 bits. TOCS = 0: Incremento a cada ciclo de máquina. devendo ser limpo quando do tratamento da interrupção INTCON Nome Bit GIE 7 PEIE 6 TOIE 5 INTE 4 26 RBIE 3 T0IF 2 INTF 1 RBIF 0 . Deste modo. TOSE = 0: Incremento na borda de subida. Para o controle do Timer 0. PSA = 1: Prescale aplicado ao WDT. vamos utilizar os registros especiais OPTION_REG e INTCON. TOSE = 1: Incremento na borda de descida. ou seja.GIE (interrupção geral).T0IF será setado. toda vez que houver um estouro do TMR0. PS2 0 0 0 0 1 1 1 1 PS1 0 0 1 1 0 0 1 1 PS0 0 1 0 1 0 1 0 1 TMRO 1:2 1:4 1:8 1:16 1:32 1:64 1:128 1:256 WDT 1:1 1:2 1:4 1:8 1:16 1:32 1:64 1:128 Para utilizarmos a interrupção do TMR0. devemos setar o registro INTCON. o flag INTCON. utilizando o oscilador. PSA = 0: Prescale aplicado ao TMR0. para um prescaler de 1:1.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Estudo dos Timers e interrupções TIMER 0 O Timer 0 é um contador interno e pode contar estímulos externos ou contar internamente.T0IE e também o registro INTCON. como segue: OPTION_REG Nome /RBPU INTEDG Bit 7 6 TOCS 5 TOSE 4 PSA 3 PS2 2 PS1 1 PS0 0 TOCS = 1: Incremento a cada transição no pino RA4/T0CKI. haverá um overflow (estouro) a cada 256 contagens (0 à 255) .

o incremento se dará a cada 1us.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Contando um tempo com o Timer 0: Vamos supor que queremos contar um tempo com o timer 0 de 100us e o prescaler seja de 1:1. O estouro do Timer0 ocorre quando o TMR0 chega à contagem 256. Inserindo no código os valores de contagem: No MikroC. portanto. no nosso caso. Resolução: Então: 1 segundo = 1000000us ou 1 segundo = 10000 x 100us. Basta. Então para um tempo de 100us. ou seja. o programa entra na função 'interrupt' e nela serão tratadas as interrupções ocorridas. então tanto o timer0 como o WDT estarão com prescaler de 1:1. seta os registros GIE e T0IE // Valor inicial para o Timer0 // Seta T0IE e limpa T0IF 27 . estamos fazendo com que o TMR0 incremente seu valor em 1 a cada ciclo de máquina. while(1) {} } Projeto: Façamos um LED piscar a cada 1 segundo utilizando o Timer0. só temos a opção 1:1 quando aplicamos o prescaler ao WDT. Neste caso. queremos que o TMR0 seja incrementado 100 vezes. para um cristal de 4MHz. } void main() { OPTION_REG = 0x80. INTCON = 0x20. TMR0 = 156. então inicializarmos o TMR0 com o valor de 256 – 100 = 156. // Atribui prescaler de 1:1 ao to TMR0 // Valor inicial para o Timer0 // Habilita a interrupção do TMR0. mas o que queremos é 100us. haverá um estouro a cada 256us. INTCON = 0xA0. Quando fazemos o prescaler igual a 1:1. toda vez que ocorre uma interrupção. void interrupt() { { TMR0 = 156.

F0 = ~PORTD. LED apagado //contador para acerto do tempo (ver 'unsigned int' na pág.005s unsigned cnt. } void main() { OPTION_REG = 0x80. // Atribui prescaler de 1:32 ao TMR0 // Valor Inicial para o TMR0 // Habilita a interrupção do TMRO 28 . cnt = 0.F0. }//~ // Incrementa o valor de cnt a cada interrupção // Valor Inicial para o TMR0 // Seta T0IE e limpa T0IF // Atribui prescaler de 1:1 ao to TMR0 // Valor inicial para o Timer0 // Habilita a interrupção do TMR0. //Inverte a situação do pino 0 da porta D. TMR0 = 99. TMR0 = 156. while(1) { if (cnt >= 10000) // Executa o bloco abaixo SE a variável cnt for maior ou igual a 10000 { PORTD. 4) // Incrementa o valor de cnt a cada interrupção // Valor inicial para o Timer0 // Seta T0IE e limpa T0IF void main() { OPTION_REG = 0x84. TMR0 = 99.F0 = 0.F0 = 0. } } } Ajustando alguns valores: Seguindo o exemplo acima. PORTD. seta os registros GIE e T0IE // Faz pino 0 da porta D como saída // Limpa o pino 0 da porta D. então ficaria assim: Valor Inicial para o TMR0 = 256 – 157 = 99. void interrupt() { cnt++. INTCON = 0x20. //Zera cnt para um novo ciclo. INTCON = 0xA0. TMR0 = 156. void interrupt() { cnt++. Calculando 157 x 32 = 5024 x 200 = 1004800 us <=> 1. INTCON = 0xA0.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ unsigned int cnt. cnt = 0. INTCON = 0x20. vamos ajustar os valores para um prescaler de 1:32. TRISD.

} } while(1). cnt = 0. do { if (cnt == 200) { PORTD. PORTD. cnt = 0.F0.F0 = 0.F0 = 0.F0 = ~PORTD.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ TRISD. } // Inverte os valores do pino 0 da porta D // Inicializa cnt novamente // Inicializa cnt 29 .

Registradores associados: Nome INTCON PIR1 PIE1 TMR1L TMR1H T1CON Bit 7 GIE PSPIF PSPIE Bit 6 PEIE ADIF ADIE Bit 5 TOIE RCIF RCIE Bit 4 INTE RXIF RXIE Bit 3 RBIE SSPIF SSPIE Bit 2 T0IF Bit 1 INTF Bit 0 RBIF CCP1IF TMR2IF TMR1IF CCP1IE TMR2IE TMR1IE Contador 8 bits – Parte menos significativa Contador 8 bits – Parte mais significativa T1CKPS1 T1CKPS2 T1OSCEN /T1SYNC TM1CS TMR1ON Registrador T1CON T1CKPS0 e T1CKPS1. Desta forma.Desabilita oscilador externo. mas agora. com 16 bits. RC0 opera como entrada para sinal externo para contagem (T1CKI). /T1SYNC 1 . podemos concluir que um ciclo de contagem do Timer 1 se incia em 0 e termina em 65535 (equivalente aos 16 bits do contador com prescaler de 1:1). sendo que ele também pode operar como contador ou temporizador. O pino RC0 e RC1 são configurados como entrada e não poderão ser utilizados como I/O. T1CKPS1 T1CKPS0 Prescaler 0 0 1 1 0 1 0 1 1:1 1:2 1:4 1:8 T1OSCEN 1 . são utilizados para selecionar 1 dos 4 fatores de prescaler. 0 .Sincronismo ligado. 30 .Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ TIMER 1 O Timer 1 tem suas características muito parecidas com as do Timer 0.Sincronismo desligado.Habilita oscilador externo. RC1 opera como I/O. 0 .

535ms. conseguiremos no máximo 65. Registrador PIR1 Neste registrador são sinalizados os flgs das interrupções e estouro dos Timer1 e Timer2. então: Tempo = (65636 – 0) x 1us x 8 Tempo = 524. será: – (65536 – valor do contador) x (1/(FOSC/4)) x prescaler No caso. então teremos: Tempo = (65536 – TMR1) x (1/(FOSC/4) x prescaler 100ms = (65536 – TMR1) x 1us x 2 31 .28ms Tempo máximo com prescaler 1:1: Tempo = (65636 – 0) x 1us x 1 Tempo = 65. utilizando o maior prescaler 1:8 e clock interno pelo ciclo de máquina.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ TMR1CS 1 . o microcontrolador está trabalhando com um cristal externo de 4MHz.535ms Projeto: Configurar o timer 1 para fornecer um tempo de 100ms e com isso fazer todos os LED's da porta D piscarem a cada 1s. então teremos que utilizar um prescaler de 1:2. então o tempo total do timer 1. Resolução: Como com o prescaler 1:1. Registrador PIE1 Registrador onde são habilitadas as interrupções. Calculando o tempo total de estouro do Timer 1: Na placa em questão. 0 .Clock externo via RC0/T1CKI.Clock interno através dos ciclos de máquina. o valor do contador será 0 (queremos o tempo total).

TMR1H = 0x3C.TMR1IE = 1. PIR1. } // Limpa o flag TMR1IF // Inicializa registro do Timer 1 // Inicializa PORTD // PORTD é saída // Ajuste do Timer1 // Limpa o flag TMR1IF // Inicializa o registro do Timer1 // Habilita a interrupção do Timer1 // inicializa cnt // habilita GIE. } } while (1). do { if (cnt == 10) { PORTD = ~PORTD. TMR1L = 0xB0. cnt = 0. PIE1. T1CON = 0x11.TMR1IF = 0. PIR1. void interrupt() { cnt++ .Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ TMR1 = 15536 = 0x3CB0 Código do projeto: unsigned short cnt. TMR1L = 0xB0. TRISD = 0. cnt = 0. TMR1H = 0x3C.TMR1IF = 0. INTCON = 0xC0. PEIE // se cnt é 10 (10 x 100ms = 1000ms) // Troca posição da porta D // zera cnt 32 . } void main() { PORTD = 0x00.

a diferença deste timer é que ele não conta de 0 à 255(8 bits). Quando isto ocorre. Então sempre que o registrador TMR2 tiver o mesmo valor que PR2. voltando a zero. Registradores associados: Nome INTCON PIR1 PIE1 TMR2 T2CON PR2 Bit 7 GIE PSPIF PSPIE Bit 6 PEIE ADIF ADIE Bit 5 TOIE RCIF RCIE Bit 4 INTE RXIF RXIE Bit 3 RBIE SSPIF SSPIE Bit 2 T0IF CCP1IF CCP1IE Bit 1 INTF TMR2IF TMR2IE Bit 0 RBIF TMR1IF TMR1IE Contador 8 bits TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0 Limite de contagem para o timer 2 Registrador T2CON: Seleção do postcaler do timer 2 TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 POTSCALER 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 33 1:1 1:2 1:3 1:4 1:5 1:6 1:7 1:8 1:9 1:10 1:11 1:12 1:13 1:14 1:15 1:16 . Quem impõe o limite de contagem é o valor do registrador PR2. o timer é resetado.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Timer 2 O timer 2 também é um contador de 8 bits. sendo relacionado somente ao clock interno. uma interrupção será gerada. um outro contador que chamamos de postcaler é incrementado e quando houver o término do da contagem do postcaler.

aproximadamente 0.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ TMR2ON 1 . } } // incrementa cnt // limpa flag TMR2IF 34 .97 s.: As duas últimas opções são realmente iguais. Resolução: Neste caso.28ms Projeto 1: Configurar o timer para piscar os leds da porta D a cada 1 segundo. TMR2 = 0.Timer 2 desativado. PIR1.TMR2IF = 0. Seleção do prescaler: T2CKPS1 T2CKPS0 PRESCALER 0 0 1 1 0 1 0 1 1:1 1:4 1:16 1:16 Obs.28ms. void interrupt() { if (PIR1.Timer 2 ativado. para que possamos fazer uma contagem de 1 segundo. 0 . podemos utilizar os valores acima sendo que teremos um estouro do timer a cada 65. Código do projeto: unsigned short cnt.TMR2IF) { cnt++ . Assim.2 ms. Calculando o tempo total de estouro do Timer 2: Tempo = prescaler x postcaler x PR2 x (1/(FOSC/4)) Tempo = 16 x 16 x 255 x 1us Tempo = 65. deveremos multiplicar o valor por 15 que resultará em 979.

28ms utilizando prescaler e postcaler 1:16. então para 50ms temos: PR2 = 195. INTCON = 0xC0.31 <=> 195 35 . pois ele já tem com default esse // valor).Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ void main() { cnt = 0. // habilita interrupção // habilita GIE. PORTD = 0xFF. PEIE // loop infinito // se cnt = 15 // troca posição na PORTD // zera cnt while (1) { if (cnt == 15) { PORTD = ~PORTD. PR2 = 0xFF. cnt = 0.TMR2IE = 1. // inicializa cnt // Inicializa PORTD // PORTD é saída // Ajustes do Timer2 // Inicializa registro do Timer2 // Inicializa PR2 com o valor 255 (não é necessário // para este caso. TMR2 = 0. } } } Projeto 2: Configurar o timer2 para uma interrupção a cada 50ms e fazer piscar os Leds da porta D a cada 1 segundo. Resolução: O valor máximo de estouro para o timer2 é de 65. T2CON = 0xFF. TRISD = 0. PIE1.

} } // incrementa cnt // limpa flag TMR2IF // inicializa cnt // Inicializa PORTD // PORTD é saída // Ajustes do Timer2 // Inicializa registro do Timer2 // Inicializa PR2.TMR2IF) { cnt++ . PORTD = 0xFF. INTCON = 0xC0. PIE1. } } } O importante é que o valor do PR2 – TMR2 seja de 195. TRISD = 0. TMR2 = 0. } } void main() { cnt = 0. while (1) { if (cnt == 20) { PORTD = ~PORTD. então podemos fazer: Código: unsigned short cnt. cnt = 0. PIR1. PIR1. TMR2 = 55.TMR2IF = 0. void interrupt() { if (PIR1.TMR2IF = 0. // habilita interrupção // habilita GIE. void interrupt() { if (PIR1. PEIE // loop infinito // se cnt = 15 // troca posição na PORTD // zera cnt // incrementa cnt // limpa flag TMR2IF 36 .TMR2IF) { cnt++ . PR2 = 195. T2CON = 0xFF. TMR2 = 0.TMR2IE = 1.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Código do projeto: unsigned short cnt. PR2 = 195. PR2 = 200.

while (1) { if (cnt == 20) { PORTD = ~PORTD. TMR2 = 55.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ void main() { cnt = 0. TRISD = 0. cnt = 0. PIE1. INTCON = 0xC0.TMR2IE = 1. PEIE // loop infinito // se cnt = 15 // troca posição na PORTD // zera cnt 37 . } } } // inicializa cnt // Inicializa PORTD // PORTD é saída // Ajustes do Timer2 // Inicializa registro do Timer2 // Inicializa PR2. // habilita interrupção // habilita GIE. PORTD = 0xFF. T2CON = 0xFF. PR2 = 200.

int b) { return a + b. } Void main ( ) { Int c. só que esta função é chamada pelo próprio compilador diratemente. Como declarar a função Tipo + Nome da Função (parâmetro) Bloco de Execução Ex: int. Nos exemplos anteriores. PORTD = 0x00. While (1 ) { PORTD = c.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Funções A linguagem C nos permite “montar” blocos de comandos para que possamos executá-los sem a necessidade de repeti-los no bloco principal. TRISD = 0x00. } } 38 . int b) Return a e b Chamando a função: Int adicao (int a. 3) . Esses blocos são chamados Funções e são parecidos com as chamadas de sub-rotinas em assembly. c = adicao (2. usamos uma função para chamar e tratarmos as interrupções.adição (int a.

a janela abaixo será mostrada Em “Select variable from List”. 39 .Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Debug no MikroC Clicando no menu “Run” e escolhendo-se a opção “Start Debugger”. seleciona-se Portd e clica-se em “Add”.

“b” e “c” Para iniciar a simulação (Debugger) deve-se clicar no botão conforme a figura abaixo ou pode-se iniciar a simulação simplesmente pressionando-se a tecla “F9” 40 .Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Repete-se a operação para as variáveis “a”.

Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ A tecla “F7” faz a simulação passo a passo e “F6” inicia o modo “Run” -Run/Pause Debugger (F6) -Stop Debugger (Ctrl = F12) -Step over (F8) -Step Out (Ctrl + F8) -Run to cursor (F4) -Step Into (F7) 41 .

0 .escrita Em – habilita p/ dado ou escrita em 1 ou transição 1 -> 0.escrita Seleção R/W.desabita Endereços dos caracteres p/um LCD de 2 linhas e 16 colunas 80 C0 81 C1 82 C2 83 C3 84 C4 85 C5 86 C6 87 C7 88 C8 89 C9 8A CA 8B CB 8C CC 8D CD 8E CE 8F CF 42 . 1 – leitura. 0 . 0 .Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Display de Cristal Líquido (LCD) Pinagem do LCD Pino 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Barramento de Dados Descrição Gnd +5V Ajuste de contraste Seleção RS: 1 .dado.

char cal. LCD_Custon_Chr_CP: Escreve um caracter na posição corrente do cursor Sintaxe: LCD_Custon_Chr_CP (char character) Exemplo: LCD_Custon_Chr_CP (“c”). char db2. 4). LCD_ Custon_CMD: Envia um comando p/o LCD Sintaxe: LCD_Custon_CMD (char out_char).db1.”r”). char em).1. db2 e db3serão conectados Ctel-port => porta onde os controles r5. 3. char+ctel-port.”Hello”). $Portb. R. 43 . char character) Exemplo: LCD_Custon_Chr (2. LCD_Custon_Config: Inicializa e configura especificação. char db3.2. char res. LCD_Custon_Out_CP: Escreve um texto no LCD na posição corrente do cursor Sintaxe: LCD_Custon_Out_CP (char text) Exemplo: LCD_Custon_Out_CP (“Aqui”). char db2. w e em do LCD serão conectados Exemplo: LCD_Custom_Config(&Portd. char d30. char rw. 3. Sintaxe: a linguagem do microcontrolador conforme LCD_Custon_Config. char db1.port. Onde: out_char = comando conforme tabela de comandos disponíveis: Exemplo: LCD_Custon_CMD (LCD-Clear). (char=data. char cal. 3.0. LCD_Custon_Chr: Escreve um caracter numa linha e numa coluna específica no LCD Sintaxe: LCD_Custon_Chr (char row. 3. Escreve um texto no LCD na linha e coluna específica LCD_Custon_Out: Sintaxe: LCD_Custon_Out (char row.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Biblioteca LCD no MikroC para o modo de 4 bits. Onde: data port => porta ondeos dados db0. char text) Onde: row = linha Col = coluna Exemplo: LCD_Custom_Out (1.

linha Move o cursor p/3a.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Comandos Disponíveis Comando LCD_First_Row LCD_Second_Row LCD_Third_Row LCD_Fourth_Row LCD_Clear LCD_Return_Home LCD_Cursor_Off LCD_Underline_On LCD_Blink_Cursor_On LCD_Move_Cursor_Left LCD_Blink_Cursor_Right LCD_Turn_On LCD_Turn_Off LCD_Shift_Left LCD_Shift_Right Propósito Move o cursor p/1a.linha Move o cursor p/2a.linha Move o cursor p/4a.linha Limpa o display Move cursor para a primeira coluna da primeira linha Desliga o cursor Liga o “Underline “ no cursor Liga o modo piscante do cursor Move o cursor p/a esquerda sem mover o texto Move o cursor p/a direita sem mover o texto Liga o visor do LCD Desliga o visor do LCD sem perder os dados Move o texto p/a esquerda Move o texto p/a direita 44 .

6.i++) { Lcd_Custom_Cmd(LCD_MOVE_CURSOR_RIGHT). Delay_ms(500). Lcd_Custom_Cmd(LCD_TURN_ON). } Lcd_Custom_Cmd(LCD_TURN_OFF). // PORTB is output Lcd_Custom_Config(&PORTB. TRISB = 0. text). Lcd_Custom_Cmd(LCD_UNDERLINE_ON). // Print text at LCD while(1) { Lcd_Custom_Cmd(LCD_RETURN_HOME).5.4.2.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Projeto LCD Escrever o texto “LCD Display Test” na primeira linha do display de LCD Resolução . Delay_ms(100). 1. } } 45 . } for(i=0.&PORTB.0). for(i=0.i<=15. void main() { unsigned i.1.i<=15. // Initialize LCD on PORTB Lcd_Custom_Cmd(Lcd_CURSOR_OFF).7. // Turn off cursor Lcd_Custom_Out(1. Delay_ms(100).i++) { Lcd_Custom_Cmd(LCD_MOVE_CURSOR_LEFT).Código do Projeto: char *text = "LCD Display Test".

//lê o canal Ado do PIC e armazena o //valor na variavel ad. ou seja. de 0 à 1023.Biblioteca ADC no MikroC No MikroC utiliza-se a função abaixo para leitura do conversor AD do PIC ADC_Read(channel): Faz a leitura da conversão AD no canal especificado Sintaxe: ADC_Read (unsigned short channel) Onde channel = canal do provedor AD que desejamos ler Exemplo: Int ad ad= ADC_Ready (0). conforme a tabela ADCON1 à seguir: ADCON1 PCFG <3 0> 0000 0001 0010 0011 0100 0101 0111 1000 1001 1010 1011 1100 1101 1110 1111 AN7 A A D A D D D A D D D D D D D AN6 A A D A D D D A D D D D D D D AN5 A A D A D D D A A A A D D D D AN4 A A A A D D D A A A A A D A A AN3 A VREF+ A VREF+ A VREF+ D VREF+ A VREF+ VREF+ VREF+ VREF+ D VREF+ 46 AN2 A A A A D D D VREFA A VREFVREFVREFD VREFAN1 A A A A A A D A A A A A A D D AN0 A A A A A A D A A A A A A A A VREF+ VDD AN3 VDD AN3 VDD AN3 AN3 VDD AN3 AN3 AN3 AN3 VDD AN3 VREF VSS VSS VSS VSS VSS VSS AN2 VSS VSS AN2 AN2 AN2 VSS AN2 . Esta função retorna um valor sem sinal de 10 bits. Resolução: Primeiramente é necessário configurar o registrador ADCON1. Nele podemos definir o modo de trabalho dos pinos de A/D. Projeto ADC: Fazer uma leitura do canal do PICe mostrar os 8 bits menos siginificativos nos LCD’s conectados à porta D.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Conversão A/D .

void main() { ADCON1 = 0x0E. } // Print text at LCD 47 .4. // Send lower 8 bits to PORTD } while(1). char txt[7]. // PORTA is input TRISD = 0x00. // Configure analog inputs and Vref TRISA = 0xFF.5. // Get results of AD conversion IntToStr(ad. // Initialize LCD on PORTB Lcd_Custom_Cmd(Lcd_CURSOR_OFF).Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Queremos. } while(1). utilizar a conversão no canal 0 (RA0). // Pins RB7.2. 1. void main() { ADCON1 = 0x0E.0). então. } Projeto ADC 2: Mostrar o valor da conversão no LCD Código: unsigned int ad. Código: unsigned int ad. // Get results of AD conversion PORTD = ad.&PORTB. // Turn off cursor do { ad = Adc_Read(0).7.txt). 5. RB6 are outputs do { ad = Adc_Read(0). Lcd_Custom_Out(1. então atribuímos o ADCON1 com o valor 1110 ou 14 ou ainda OxOE. // PORTA is input Lcd_Custom_Config(&PORTB. Lcd_Custom_Out(1.6. txt). // Configure analog inputs and Vref TRISA = 0xFF. "AD = ").1.

onde var = variável. Exemplo: Usart_Write('A'). Usart_Data_Ready: Verifica se existe algum byte no buffer de recepção serial. Sintaxe: var = Usart_Data_Ready( ). Exemplo: if (Usart_Data_Ready()) //se existir algum byte no buffer. } Usart_Read: Lê o valor armazenado no buffer de recepção serial.. Exemplo: if (Usart_Data_Ready()) //se existir algum byte no buffer. executa a expressão abaixo: { receive = Usart_Read(). inicializa a serial com taxa de 9600 bps. } Usart_Write: transmite um byte pela serial.. //armazena o byte recebido na variável //receive. Sintaxe: recepção = Usart_read( ).expressão. 48 . retornando 1 se existir e 0 se não existir nenhum byte.. ou Usart_Write (61)..Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Comunicação Serial (USART) USART= Universal Synchronous Asynchronous Receiver Transmitter Biblioteca USART no MIKROC Usart_init: Inicializa o modo de comunicação serial informando o Band-Rate (Taxa de Comunicação) utilizado para a comunicação Sintaxe: Usart_init (BaudRate) Exemplo: Usart_init (9600)...... Sintaxe: Usart_Write (byte chr). // escreve o caracter “A” na serial. executa a expressão abaixo: { .

1)) { . além de acender o LED1 se o caracter for “a”e apagar o led se o caracter for “b”. while (1) { if (Button(&PORTD.comando.. unsigned short pin.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Projeto Serial: 1-) Enviar o caracter “A” pela serial..: Faça uma experíência modificando para baixo o tempo de 100ms. no parity bit.0.100...0. Exemplo: if (Button(&PORTD. o estado do pino mudará para nível lógico 1 e o que está entre chaves será executado. Usart_Write('A').. o comando //abaixo será executado.) Usart_Init(9600). } Para o exemplo acima. unsigned short time. Resolução: Neste caso. Utilizamos..1)) //Se o botão conectado ao pino 0 da Porta D. conclui-se que se o botão conectado ao pino 0 da porta D. agora.1.. uma maneira diferente de verificar o acionamento de um botão que é através da biblioteca UTIL e o comando BUTTON. 49 . Projeto Serial 2: 2-) Receber um caracter do PC e enviá-lo novamente pela serial. //Envia o caracter “A” pela serial. } } Obs. baud rate 9600. por um tempo de 1 ms. conforme segue: Sintaxe: unsigned short Button(unsigned short *port. Código: void main() { // Initializa o módulo USART (8 bit. o caracter “A” será enviado para a serial. unsigned short active_state). vamos atuar sobre o botão conectado ao pino 0 da porta D e a cada atuação.

) Usart_Init(9600). M 0 I 1 C 2 R 3 O 4 C 5 O 6 N 7 T 8 R 9 O 10 L 11 A 12 D 13 O 14 R 15 \0 16 // Se algum dado for recebido // Lê o dado recebido // Envia o dado pela serial novamente //Se o caracter for 'a'. no parity bit. portanto podemos enviar assim: Usart_Write('M'). não existe uma maneira de enviarmos uma string. if (i=='b') PORTD. PORTD = 0x00. Usart_Write('I'). void main() { TRISD = 0x00. // Initializa USART (8 bit... Usart_Write('C'). . do { if (Usart_Data_Ready()) { i = Usart_Read(). } } while (1). } Projeto Serial 3: 3-) Enviar a palavra “MICROCONTROLADOR” pela serial. Resolução: No MikroC.F0 = 0. o caracter “I” será colocado ou estará apontando para aa posição 1 e assim por diante até o final. podemos dizer que cada caracter será “colocado” numa posição do ponteiro. if (i=='a') PORTD. sendo que a última posição será ocupada por um valor nulo e essa será a finalização do ponteiro. somente podemos enviar 1 caracter por vez. baud rate 9600.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Código: unsigned short i. ou seja.F0 = 1.. o caracter “M” será colocado ou estará apontando para a posição 0. Ou podemos utilizar uma maneira mais usual que é a utilização de ponteiros que será mostrada no código abaixo: No caso de ponteiros. Usart_Write(i).. apaga o LED 1 50 .. acende o LED 1 //Se o caracter for 'b'..

PORTD = 0x00. no parity bit. } while (*txt != '\0'). } Projeto Serial 4: 4-) Receber do PC a string “LD1” e acender o LED1 e se a string for “DL1”. if ((rec[0] == 'D') && (rec[1] == 'L') && (rec[2] == '1')) PORTD. //envia um caracter pela serial //incrementa o ponteiro //Verifica a finalização do ponteiro 51 .F0 = 0. short i. do { Usart_Write(*txt). lembrando que é necessário sempre inicializarmos com 0 o posicionamento. Código: char rec[4]. } void main() { TRISD = 0x00. void main() { // Initializa USART (8 bit. baud rate 9600. a variável i será a responsável pelo posicionamento da matriz. No caso. *txt++. apagar o LED1. delay_ms(100). Resolução: Neste caso utilizaremos uma matriz com 4 posições ou 4 endereços (rec[4]) onde serão armazenados os valores recebidos pela serial.) Usart_Init(9600).Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Código: unsigned char *txt = "MICROCONTROLADOR".. void trata_serial() { if ((rec[0] == 'L') && (rec[1] == 'D') && (rec[2] == '1')) // Faz a comparação dos valores // armazenados na Matriz 'rec' PORTD.F0 = 1.

i<=3.) Usart_Init(9600). //Incrementa o valor da posição da matriz if (rec[i-1] == 0x0D) { //Verifica se o valor armazenado na Matriz é // 0x0D (Código hexa para o ASCII <enter>) trata_serial(). i=0. // Sendo 0x0D. no parity bit.. baud rate 9600. while(1) { if (Usart_Data_Ready()) //Se existir um caracter no buffer da serial { rec[i] = Usart_Read(). i=0. vai para a função trata_serial //for(i=0.i++) // 'Limpa' a Matriz // rec[i] = '\0'. //O caracter será lido e colocado na matriz 'rec' i++.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ // Initializa USART (8 bit. // Reinicializa o posicionamento da matriz } } } } 52 .

2. Código: void main() { Lcd_Custom_Config(&PORTB. // escreve o valor 100 no endereço 0 da memória EEPRON. //Escreve na primeira linha do LCD while(1) { if (button(&PORTD. após ler o valor e escrever no LCD.100.1. // Desliga o cursor EEPROM_Write(0.0)."Leitura EEPROM").5.1.&PORTB. // Initializa o LCD na PORTB Lcd_Custom_Cmd(Lcd_CURSOR_OFF). 100). // Escreve o código 0x61 ('caracter 'a') na EEPROM do PIC Lcd_Custom_Out(1.1)) //Se o botão no pino 0 da porta D for acionado { Lcd_Custom_Chr(2. byte dado) Exemplo: EEPRON_Write (0. Projeto EEPRON: 1-) Escrever o valor 61 ('caracter “a”) no endereço 0 da memória EEPRON.4. EEPROM_Read(0)). 1. //Lê a posição 0 e carrega o valor na variável tmp EEPRON_Write: Escreve um byte na memória EEPRON Sintaxe: EEPRON_Write (byte adress.7. OBS: O PIC 16F877A tem 256 bytes de memória EEPRON Exemplo: tmp = EEPRON_Read(0).6.0x61). // Faz a leitura no endereço 0 // da EEPROM do PIC e // escreve o conteúdo na // linha 2 do LCD } } } 53 .0.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ EEPRON Interna Biblioteca EEPRON EEPRON_Read: Lê um byte da memória EEPRON Sintaxe: Variável = EEPRON_Read (byte adress).

// Initializa LCD na PORTB Lcd_Custom_Cmd(Lcd_CURSOR_OFF). void main() { Usart_Init(9600). escrever no endereço 10 da memória EEPRON.1. ler este valor da memória. EEPROM_Read(10)).4."Leitura EEPROM"). escrever no LCD e envia-lo à serial. // Escreve o conteúdo da variável i na Serial EEPROM_Write(10. // Escreve o conteúdo da variável i na EEPROM } if (button(&PORTD.1)) //Se o botão no pino 0 da porta D for acionado { Lcd_Custom_Chr(2.5.7.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Projeto EEPRON 2: 2-) Receber da serial um caracter.&PORTB.1.i). Lcd_Custom_Config(&PORTB.2.100. } } } 54 . 1.0. //Escreve na segunda linha //do LCD o valor armazenado //no endereço 10 da EEPROM. //Escreve na primeira linha do LCD while(1) { if (Usart_Data_Ready()) // Se existir um caracter no buffer da serial { i = Usart_Read(). // Desliga o cursor Lcd_Custom_Out(1.0). Código: unsigned short i.6. // Faz a leitura do buffer e armazena na variável i Usart_Write(i).

Por exemplo. onde 255 representa 100 % de Duty Cycle . // inicializa o módulo PWM com frequência de 5KHz. metade do tempo a onda se mantém em nível alto e a outra metade do tempo a onda se mantém em nível baixo.(Pulse Width Modulation) A modulação PWM (modulação por largura de pulso) consiste basicamente na aplicação de uma onda quadrada de amplitude igual à VCC e freqüência alta substituindo a tensão contínua. Biblioteca PWM no MikroC PWM_init: Inicializa o módulo PWM informando a freqüência de operação. 55 . uma modulação de amplitude 5V e Duty Cycle de 50 %. Portanto para um Duty Cycle de 50 %.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ PWM . Exemplo: PWM_Change_Duty (192). //configura o Duty-Cycle p/ 75 %. A relação entre o tempo em que a onda fica em nível alto e o período total é conhecido como Duty Cycle que é normalmente expresso em percentual. PWM_Change_Duty: Altera o valor do Duty-Cycle. Sintaxe: PWM_Start( ).5 V que é a tensão média para este caso. Sintaxe: PWM_init (Unsigned long Freq) Exemplo: PWM_init(5000). portanto de 0 à 255. PWM_Start: Inicializa a geração do PWM. A tensão média varia em função do tempo em que a onda fica em nível alto (VCC) e do tempo em que a onda fica em nível básico (0V). Sintaxe: PWM_Change_Duty (Unsigned Char Duty) Duty é uma valor do tipo char. Tem o mesmo efeito de uma tensão contínua de 2.

Pwm_Start(). ligado ao CCP1 (RC2). Pwm_Init(5000). Código: void main() { unsigned i.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ PWM_Stop: Interrompe a geração do PWM. } } 56 . if (i>=100) i = 0. //Modifica o Duty_cycle i++. i = 0. utilizando PWM e variando o Duty-Cycle de 0 a 100 %. Projeto PWM: Controlar o brilho de um Led. //Indica ao módulo PWM o funcionamento com frequencia de 5KHz //Inicializa o Modo PWM while(1){ Pwm_Change_Duty(i). delay_ms(50).

0). // converte a variável inteira 'ad' na variável texto txt // (matriz) Lcd_Custom_Out(1.6. 1. // Faz PORTA como entrada Pwm_Init(10000). Pwm_Change_Duty(ad/4). "Duty = "). // Configura as entradas analógicas e referência TRISA = 0xFF. Código: unsigned int ad.1. void main() { ADCON1 = 0x0E.4. // Modifica o Duty_cycle ad = ((ad /4) * 100) / 255.&PORTB.5. // Escreve na linha 1 do LCD Lcd_Custom_Out(1. //Faz a leitura da conversão AD e armazena na variável 'ad'.Curso básico de linguagem C para microcontroladores PIC ________________________________________________________________________________ Projeto PWM 2: Controlar o brilho do Led utilizando PWM e variando o Duty-Cycle de acordo com a leitura do A/D e mostrar no LCD o valor do Duty. char txt[7]. // Desliga o cursor while(1) { ad = ADC_Read(0). // Initializa LCD na PORTB Lcd_Custom_Cmd(Lcd_CURSOR_OFF). 7.txt).2. //Indica ao módulo PWM o funcionamento com frequencia de 10KHz Pwm_Start(). txt). // Escreve o valor de Duty no LCD } } 57 . IntToStr(ad. //Inicializa o modo PWM Lcd_Custom_Config(&PORTB.7.

Sign up to vote on this title
UsefulNot useful