Escolar Documentos
Profissional Documentos
Cultura Documentos
________________________________________________________________________________
ndice
Linguagem C......................................................................................................
Princpio de programao
- lgebra Booleana..........................................................................................
- Operaes......................................................................................................
Introduo Linguagem C
- Variveis........................................................................................................
- Tipos de Dados..............................................................................................
- Qualificadores...............................................................................................
- Declarao de variveis.................................................................................
- Operadores matemticos
- Aritmticos.................................................................................................
- Relacionais.................................................................................................
- Declaraes de controle
- Deciso Comando IF...............................................................................
- Deciso SWITCH-CASE........................................................................
10
- Lao FOR......................................................................................................
11
- Lao WHILE.................................................................................................
11
- Lao DO-WHILE..........................................................................................
12
- Ponteiros........................................................................................................
12
- Matrizes.........................................................................................................
13
O Ambiente MikroC...........................................................................................
14
15
- Primeiro Projeto............................................................................................
16
- Gravando o projeto........................................................................................
18
Acionamento de Botes......................................................................................
24
26
30
- Timer 2..........................................................................................................
33
Funes...............................................................................................................
38
Debug no MikroC...............................................................................................
39
42
Converso A/D...................................................................................................
46
48
EEPRON Interna................................................................................................
53
PWM...................................................................................................................
55
Linguagem C
uma linguagem de programao de propsito geral, estruturada, imperativa, procedural de
alto e baixo nvel, criada em 1972 por Dennis Ritchie no AT&T Bell Labs, para desenvolver o
sistema operacional UNIX (que foi originalmente escrito em Assembly). Desde ento, espalhou-se
por muitos outros sistemas e tornou-se uma das linguagens de programao mais usadas
influenciando muitas outras linguagens, especialmente o C++, que foi desenvolvida como uma
extenso para C.
Fonte: WIKIPEDIA
Princpio de Programao
lgebra Booleana
Na matemtica e na cincia da computao, as lgebras booleanas so estruturas algbricas
que captam a essncia das operaes lgicas E, OU e NO (NAD, OR e NOT), bem como das
operaes da teoria de conjuntos soma, produto e complemento.
lgebra Booleana deriva do nome de George Boole, matemtico ingls que foi o primeiro a
defin-las como parte de um sistema de cdigo em meados do sculo XIX. Foram aplicadas pela
primeira vez em eletrnica por Claude Shannon no sculo XX.
Os operadores de lgebra booleana so frequentemente escritos com E, OU ou NO (mais
comuns so os equivalentes em ingls, AND, OR ou NOT). Na descrio de circuitos podem ser
utilizados NAND (NOT AND), NOR (NOT OR) e XOR (OR exclusivo).
Operaes:
OR
AND
NOT
XOR
Introduo Linguagem C
Variveis:
As variveis podem conter letras e nmeros, sempre comeando com letras e no devem ter nome
de palavras reservadas pelo compilador como, por exemplo, for, do, int, etc.
Tipos de Dados:
Dado:
Representa:
-char
Caracteres
-int
Nmeros inteiros
-float e double
-void
Valores nulos
Qualificadores:
Qualificador
Significado
-signed
Sinalizado
-unsigned
No sinalizado
-short
-long
Tipo
Tamanho
Valores
signed char
8 bits
-128 127
(unsigned) char
8 bits
0 255
8 bits
-128 127
8 bits
0 255
(signed) int
16 bits
-32768 32767
unsigned int
16 bits
0 65535
32 bits
-2147483648 2147483647
32 bits
0 4294967295
float
32 bits
double
32 bits
long double
32 bits
Exemplo
a+b
a-b
a*b
a/b
++
Soma 1 ao argumento
a++
--
Subtrai 1 ao argumento
a--
Exemplo
==
Compara se igual a
a == 5
!=
Compara se diferente de
a != 5
>
a>5
<
a<5
>=
a >= 5
<=
a <= 5
E (AND)
OU (OR)
OU EXCLUSIVO (XOR)
Complemento (NOT)
>>
Deslocamento direita
<<
Deslocamento esquerda
||
11
12
13
O Ambiente MikroC
O compilador MikroC foi desenvolvido pela Mikroelektronika e com ele que vamos desenvolver
nossos projetos. Abaixo est a tela inicial do compilador.
14
15
Primeiro Projeto
Definindo o projeto:
-Project Name : PiscaLed
-Project Path : \MikroC\Proj1\
-Description : ....
-Device
: P16F877A
-Clock
: 004.000000
-Device Flags: Default
Circuito:
16
{
PORTD = ~PORTD;
delay_ms(1000);
}
}
Depois de escrevermos o cdigo, devemos compilar o projeto para que possamos gravar no
microcontrolador. A compilao se d pressionando-se ctrl + F9 ou clicando no menu Project e
escolher a opo Build, conforme abaixo.
17
Gravando o Projeto
Utilizaremos, para gravar o programa no microcontrolador, o programa ICPROG como segue a
figura abaixo:
18
19
Na janela que se abre a seguir, deveremos encontrar o arquivo do nosso projeto, que neste caso o
arquivo 'PiscaLed.hex'. O programa ICPROG ter a aparncia parecida com a figura abaixo:
20
21
-O projeto abaixo tem a mesma funo, s que utiliza a diretiva #define para identificao,
conforme abaixo:
#define DirLed TRISD.F0 //Identifica a varivel TRISD.F0 como DirLed
#define Led
PORTD.F0 //Identifica a varivel PORTD.F0 como Led
void main()
{
DirLed = 0;
while (1)
{
Led = 0;
delay_ms(500);
Led = 1;
delay_ms(500);
}
}
22
23
Acionamento de Botes
Definindo o projeto:
-Project Name : Botao
-Project Path : \MikroC\Proj2\
-Description : ....
-Device
: P16F877A
-Clock
: 004.000000
-Device Flags: Default
Circuito:
24
while(1)
//Loop principal
{
if (botao == 1)
//Compara o valor do pino 0 ao valor 1 (nvel lgico alto)
{
//Sendo o valor igual a 1, executa os comandos do bloco
led = 1;
//Coloca em 1 o pino 1 da porta D, acendendo o LED
delay_ms(1000); //Atraso de 1 segundo
led = 0;
//Coloca em 0 o pino 1 da porta D, apagando o LED
}
}
}
25
TOCS
TOSE
PSA
PS2
PS1
PS0
PS1
PS0
TMRO
WDT
1:2
1:1
1:4
1:2
1:8
1:4
1:16
1:8
1:32
1:16
1:64
1:32
1:128
1:64
1:256
1:128
GIE
PEIE
TOIE
INTE
RBIE
T0IF
INTF
RBIF
26
void main() {
OPTION_REG = 0x80;
TMR0 = 156;
INTCON = 0xA0;
while(1) {}
}
Projeto:
Faamos um LED piscar a cada 1 segundo utilizando o Timer0.
Resoluo:
Ento: 1 segundo = 1000000us ou
1 segundo = 10000 x 100us.
27
void interrupt()
{
cnt++;
TMR0 = 156;
INTCON = 0x20;
}
void main() {
OPTION_REG = 0x80;
TMR0 = 156;
INTCON = 0xA0;
TRISD.F0 = 0;
PORTD.F0 = 0;
cnt = 0;
while(1) {
if (cnt >= 10000) // Executa o bloco abaixo SE a varivel cnt for maior ou igual a 10000
{
PORTD.F0 = ~PORTD.F0; //Inverte a situao do pino 0 da porta D.
cnt = 0;
//Zera cnt para um novo ciclo.
}
}
}
Ajustando alguns valores:
Seguindo o exemplo acima, vamos ajustar os valores para um prescaler de 1:32, ento ficaria assim:
Valor Inicial para o TMR0 = 256 157 = 99.
Calculando 157 x 32 = 5024 x 200 = 1004800 us <=> 1,005s
unsigned cnt;
void interrupt() {
cnt++;
TMR0 = 99;
INTCON = 0x20;
}//~
void main() {
OPTION_REG = 0x84;
TMR0 = 99;
INTCON = 0xA0;
// Inicializa cnt
do {
if (cnt == 200) {
PORTD.F0 = ~PORTD.F0;
cnt = 0;
}
} while(1);
}
29
TIMER 1
O Timer 1 tem suas caractersticas muito parecidas com as do Timer 0, sendo que ele tambm pode
operar como contador ou temporizador, mas agora, com 16 bits.
Desta forma, 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).
Registradores associados:
Nome
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
INTCON
GIE
PEIE
TOIE
INTE
RBIE
T0IF
INTF
RBIF
PIR1
PSPIF
ADIF
RCIF
RXIF
SSPIF
PIE1
PSPIE
ADIE
RCIE
RXIE
SSPIE
TMR1L
TMR1H
T1CON
Registrador T1CON
T1CKPS0 e T1CKPS1, so utilizados para selecionar 1 dos 4 fatores de prescaler.
T1CKPS1 T1CKPS0 Prescaler
0
1:1
1:2
1:4
1:8
T1OSCEN
1 - Habilita oscilador externo. O pino RC0 e RC1 so configurados como entrada e no podero
ser utilizados como I/O.
0 - Desabilita oscilador externo. RC0 opera como entrada para sinal externo para contagem
(T1CKI), RC1 opera como I/O.
/T1SYNC
1 - Sincronismo desligado.
0 - Sincronismo ligado.
30
31
// Inicializa PORTD
// PORTD sada
// Ajuste do Timer1
// Limpa o flag TMR1IF
// Inicializa o registro do Timer1
// Habilita a interrupo do Timer1
// inicializa cnt
// habilita GIE, PEIE
// se cnt 10 (10 x 100ms = 1000ms)
// Troca posio da porta D
// zera cnt
32
Timer 2
O timer 2 tambm um contador de 8 bits, sendo relacionado somente ao clock interno, a diferena
deste timer que ele no conta de 0 255(8 bits). Quem impe o limite de contagem o valor do
registrador PR2. Ento sempre que o registrador TMR2 tiver o mesmo valor que PR2, o timer
resetado, voltando a zero. Quando isto ocorre, um outro contador que chamamos de postcaler
incrementado e quando houver o trmino do da contagem do postcaler, uma interrupo ser
gerada.
Registradores associados:
Nome
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
INTCON
GIE
PEIE
TOIE
INTE
RBIE
T0IF
INTF
RBIF
PIR1
PSPIF
ADIF
RCIF
RXIF
SSPIF
CCP1IF
TMR2IF
TMR1IF
PIE1
PSPIE
ADIE
RCIE
RXIE
SSPIE
CCP1IE
TMR2IE
TMR1IE
TMR2
T2CON
Contador 8 bits
-
PR2
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
33
1:1
1:4
1:16
1:16
// incrementa cnt
// limpa flag TMR2IF
34
// inicializa cnt
// Inicializa PORTD
// PORTD sada
// Ajustes do Timer2
// Inicializa registro do Timer2
// Inicializa PR2 com o valor 255 (no necessrio
// para este caso, pois ele j tem com default esse
// valor).
// habilita interrupo
// habilita GIE, PEIE
while (1) {
if (cnt == 15) {
PORTD = ~PORTD;
cnt = 0;
}
}
// loop infinito
// se cnt = 15
// troca posio na PORTD
// zera cnt
}
Projeto 2:
Configurar o timer2 para uma interrupo a cada 50ms e fazer piscar os Leds da porta D a cada 1
segundo.
Resoluo:
O valor mximo de estouro para o timer2 de 65,28ms utilizando prescaler e postcaler 1:16, ento
para 50ms temos:
35
// incrementa cnt
// limpa flag TMR2IF
// inicializa cnt
// Inicializa PORTD
// PORTD sada
// Ajustes do Timer2
// Inicializa registro do Timer2
// Inicializa PR2.
// habilita interrupo
// habilita GIE, PEIE
// loop infinito
// se cnt = 15
// troca posio na PORTD
// zera cnt
}
O importante que o valor do PR2 TMR2 seja de 195, ento podemos fazer:
Cdigo:
unsigned short cnt;
void interrupt() {
if (PIR1.TMR2IF) {
cnt++ ;
PIR1.TMR2IF = 0;
TMR2 = 55;
PR2 = 200;
}
}
// incrementa cnt
// limpa flag TMR2IF
36
// inicializa cnt
// Inicializa PORTD
// PORTD sada
// Ajustes do Timer2
// Inicializa registro do Timer2
// Inicializa PR2.
// habilita interrupo
// habilita GIE, PEIE
// loop infinito
// se cnt = 15
// troca posio na PORTD
// zera cnt
37
Funes
A linguagem C nos permite montar blocos de comandos para que possamos execut-los
sem a necessidade de repeti-los no bloco principal.
Esses blocos so chamados Funes e so parecidos com as chamadas de sub-rotinas em
assembly.
Nos exemplos anteriores, usamos uma funo para chamar e tratarmos as interrupes, s
que esta funo chamada pelo prprio compilador diratemente.
Como declarar a funo
Tipo + Nome da Funo (parmetro)
Bloco de Execuo
Ex: int.adio (int a, int b)
Return a e b
Chamando a funo:
Int adicao (int a, int b)
{
return a + b;
}
Void main ( )
{
Int c;
TRISD = 0x00;
PORTD = 0x00;
c = adicao (2, 3) ;
While (1 ) {
PORTD = c;
}
}
38
39
40
41
Descrio
1
Gnd
+5V
Ajuste de contraste
7
8
9
Barramento de Dados
10
11
12
13
14
81
82
83
84
85
86
87
88
89
8A
8B
8C
8D
8E
8F
C0
C1
C2
C3
C4
C5
C6
C7
C8
C9
CA
CB
CC
CD
CE
CF
42
LCD_Custon_Config, (char=data.port, char db3, char db2, char db2, char db1, char
d30, char+ctel-port, char res, char rw, char em);
Onde: data port => porta ondeos dados db0,db1, db2 e db3sero conectados
Ctel-port => porta onde os controles r5, w e em do LCD sero conectados
Exemplo: LCD_Custom_Config(&Portd, 3,2,1,0, $Portb, R, 3, 4);
LCD_Custon_Out:
Sintaxe:
43
Propsito
LCD_First_Row
LCD_Second_Row
LCD_Third_Row
LCD_Fourth_Row
LCD_Clear
Limpa o display
LCD_Return_Home
LCD_Cursor_Off
Desliga o cursor
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
44
while(1) {
Lcd_Custom_Cmd(LCD_RETURN_HOME);
Lcd_Custom_Cmd(LCD_UNDERLINE_ON);
for(i=0;i<=15;i++) {
Lcd_Custom_Cmd(LCD_MOVE_CURSOR_RIGHT);
Delay_ms(100);
}
for(i=0;i<=15;i++) {
Lcd_Custom_Cmd(LCD_MOVE_CURSOR_LEFT);
Delay_ms(100);
}
Lcd_Custom_Cmd(LCD_TURN_OFF);
Delay_ms(500);
Lcd_Custom_Cmd(LCD_TURN_ON);
}
}
45
Converso A/D
- Biblioteca ADC no MikroC
No MikroC utiliza-se a funo abaixo para leitura do conversor AD do PIC
ADC_Read(channel): Faz a leitura da converso 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), //l o canal Ado do PIC e armazena o
//valor na variavel ad.
Esta funo retorna um valor sem sinal de 10 bits, ou seja, de 0 1023.
Projeto ADC:
Fazer uma leitura do canal do PICe mostrar os 8 bits menos siginificativos nos LCDs conectados
porta D.
Resoluo:
Primeiramente necessrio configurar o registrador ADCON1. Nele podemos definir o modo de
trabalho dos pinos de A/D, 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
AN6
AN5
AN4
AN3
AN2
AN1
AN0
VREF+
A
A
D
A
D
D
D
A
D
D
D
D
D
D
D
A
A
D
A
D
D
D
A
D
D
D
D
D
D
D
A
A
D
A
D
D
D
A
A
A
A
D
D
D
D
A
A
A
A
D
D
D
A
A
A
A
A
D
A
A
A
VREF+
A
VREF+
A
VREF+
D
VREF+
A
VREF+
VREF+
VREF+
VREF+
D
VREF+
A
A
A
A
D
D
D
VREFA
A
VREFVREFVREFD
VREF-
A
A
A
A
A
A
D
A
A
A
A
A
A
D
D
A
A
A
A
A
A
D
A
A
A
A
A
A
A
A
VDD
AN3
VDD
AN3
VDD
AN3
AN3
VDD
AN3
AN3
AN3
AN3
VDD
AN3
46
VREF
VSS
VSS
VSS
VSS
VSS
VSS
AN2
VSS
VSS
AN2
AN2
AN2
VSS
AN2
} while(1);
}
47
48
49
Projeto Serial 3:
3-) Enviar a palavra MICROCONTROLADOR pela serial.
Resoluo:
No MikroC, no existe uma maneira de enviarmos uma string, somente podemos enviar 1 caracter
por vez, portanto podemos enviar assim:
Usart_Write('M');
Usart_Write('I');
Usart_Write('C');
......
Ou podemos utilizar uma maneira mais usual que a utilizao de ponteiros que ser mostrada no
cdigo abaixo:
No caso de ponteiros, podemos dizer que cada caracter ser colocado numa posio do ponteiro,
ou seja, o caracter M ser colocado ou estar apontando para a posio 0, o caracter I ser
colocado ou estar apontando para aa posio 1 e assim por diante at o final, sendo que a ltima
posio ser ocupada por um valor nulo e essa ser a finalizao do ponteiro.
M
\0
10
11
12
13
14
15
16
50
Projeto Serial 4:
4-) Receber do PC a string LD1 e acender o LED1 e se a string for DL1, apagar o LED1.
Resoluo:
Neste caso utilizaremos uma matriz com 4 posies ou 4 endereos (rec[4]) onde sero
armazenados os valores recebidos pela serial, lembrando que necessrio sempre inicializarmos
com 0 o posicionamento. No caso, a varivel i ser a responsvel pelo posicionamento da matriz.
Cdigo:
char rec[4];
short i;
void trata_serial()
{
if ((rec[0] == 'L') && (rec[1] == 'D') && (rec[2] == '1')) // Faz a comparao dos valores
// armazenados na Matriz 'rec'
PORTD.F0 = 1;
if ((rec[0] == 'D') && (rec[1] == 'L') && (rec[2] == '1'))
PORTD.F0 = 0;
}
void main()
{
TRISD = 0x00;
PORTD = 0x00;
51
52
EEPRON Interna
Biblioteca EEPRON
EEPRON_Read: L um byte da memria EEPRON
Sintaxe: Varivel = EEPRON_Read (byte adress),
OBS: O PIC 16F877A tem 256 bytes de memria EEPRON
Exemplo: tmp = EEPRON_Read(0); //L a posio 0 e carrega o valor na varivel tmp
EEPRON_Write: Escreve um byte na memria EEPRON
Sintaxe: EEPRON_Write (byte adress, byte dado)
Exemplo: EEPRON_Write (0, 100); // escreve o valor 100 no endereo 0 da memria EEPRON.
Projeto EEPRON:
1-) Escrever o valor 61 ('caracter a) no endereo 0 da memria EEPRON, aps ler o valor e
escrever no LCD.
Cdigo:
void main()
{
Lcd_Custom_Config(&PORTB,7,6,5,4,&PORTB,1,2,0); // Initializa o LCD na PORTB
Lcd_Custom_Cmd(Lcd_CURSOR_OFF);
// Desliga o cursor
EEPROM_Write(0,0x61);
53
while(1) {
if (Usart_Data_Ready())
// Se existir um caracter no buffer da serial
{
i = Usart_Read();
// Faz a leitura do buffer e armazena na varivel i
Usart_Write(i);
// Escreve o contedo da varivel i na Serial
EEPROM_Write(10,i); // Escreve o contedo da varivel i na EEPROM
}
if (button(&PORTD,0,100,1))
//Se o boto no pino 0 da porta D for acionado
{
Lcd_Custom_Chr(2, 1, EEPROM_Read(10)); //Escreve na segunda linha
//do LCD o valor armazenado
//no endereo 10 da EEPROM.
}
}
}
54
55
Controlar o brilho de um Led, ligado ao CCP1 (RC2), utilizando PWM e variando o Duty-Cycle de
0 a 100 %.
Cdigo:
void main()
{
unsigned i;
i = 0;
Pwm_Init(5000);
Pwm_Start();
while(1){
Pwm_Change_Duty(i); //Modifica o Duty_cycle
i++;
if (i>=100) i = 0;
delay_ms(50);
}
}
56
57