Escolar Documentos
Profissional Documentos
Cultura Documentos
PIC18 XX
PIC18 XX
Microcontrolador
PIC18xx
Dezembro/2007
1.
Introduo
Figura
1.1
representa-se,
como
exemplo,
diagrama de
pinos
do
Note-se que cada pino no tem uma nica funo. Dependendo das necessidades
de cada aplicao, o utilizador poder utilizar cada uma das funes de certo grupo
de pinos. Por exemplo os pinos 26, 27 e 28 podem ser usados como GPIO (General
Purpose Input Output) entrada/sada normal, ou como PGM, PGC ou PGD, para a
programao ICSP (In Circuit Serial Programming) programao sem remoo do
microcontrolador do circuito. Os pinos so especficos de uma determinada funo
integrada em certos modelos pelo que diferem para cada microcontrolador.
1.4 Configurao
Os microcontroladores so configurados por fuses ou bits de configurao.
Estes podem ser configurados no IDE (como no caso do MPLAB), num programador
universal, ou no cdigo (sobrepe o MPLAB, mas no funciona no programador
ALL-11).
De seguida descrevem-se algumas das configuraes mais comuns:
Oscilador
O PIC necessita de uma fonte de sincronismo. Existem muitas formas de a obter.
Existe normalmente um PLL com um divisor. Dividir por PLL significa multiplicar a
frequncia de entrada pelo factor seleccionado.
XT Crystal/Resonator
HS High-Speed Crystal/Resonator
ECPLL External Clock with PLL enabled and FOSC/4 output on RA6
Nos PIC com USB o pino OSC1 sempre usado para entrada de sincronismo
externo para o controlador USB.
Configuraes Gerais
Port A/D Enable:
Master Clear
Brownout
Desactivado
WDT
Desactivado
1.5 Memria
Registos
Um registo um local na memria do PIC, que pode ser lida e escrita, e dependendo
do endereo, pode ter um significado especial no comportamento do programa se for
um SFR (Special Function Register registo de funo especial), ou ser apenas um
pedao de memria de uso geral.
Bancos de Memoria
O banco de memria 0 corresponde ao acesso memria geral e o banco 1
corresponde aos registos.
TRIS
Este registo controla o sentido da porta respectiva. Por exemplo se TRISA = 255 =
11111111, o porto A configurado para entrada, se TRISB = 129 = 10000001, o
7
2.
03h,5
06h
85h
03h,5
;Banco 1
;Coloca 00110 no W
;Coloca W no 85h
;Banco 0
03h,5
00h
85h
03h,5
02h
05h
;Banco 1
;Escreve 0 no W
;Escreve W no 85h/TRISA :definir o porto A para sada
;Banco 0
;Escreve 00000010 no W
;Escreve W no 05h/PORTA :escrever W no porto A
10
//cabealho da funo
//escreve o valor recebido no endereo 30h
void main(){
objecto = 0x56;
guarda(objecto);
}
11
EQU
EQU
EQU
FD8h
F93h
F81h
INICIO
MOVLW
MOVWF
01h
TRISB
CICLO
BTFSS
PORTB,0
GOTO
CICLO
BSF
PORTB,7
MOVLW
00h
MOVWF
TRISB
BSF
PORTB,0
GOTOINICIO
while(true){
set_tris_b(0x01);
while(!input(PIN_B0)){}
set_tris_b(0x00);
output_low(PIN_B0);
output_high(PIN_B7);
}
Exemplo 6: Adio e subtraco
Pretende-se verificar as operaes bsicas da adio e da subtraco, usando
operadores no acumulador
MOVLW
MOVWF
MOVLW
ADDLW
SUBLW
SUBWF
30
08h
25
25
20
08h
;W=30
;08h=30
;W=25
;W=50
;W=30
;W=0
12
#byte f = 0x08
main(){
int8 acumulador = 25;
f = 30;
acumulador += 25;
acumulador -= 20;
acumulador += f;
}
Exemplo 7: Interrupo por Temporizador
Pretende-se usar um temporizador (timer) com interrupo de overflow temporizar 1
segundo.
ORG
GOTO
00h
MAIN
;Vector de Reset
;Evita sobrepor o vector de interrupo com cdigo
ORG
GOTO
08h
LOW_ISR
;Vector de Interrupo
;Evita sobrepor o vector de interrupo prioritrio com
;cdigo, neste caso desnecessrio, pois no usado
ISR
BTFSS
GOTO
MOVLW
MOVWF
BCF
FIM_ISR
RETFIE
INTCON,5
FIM_ISR
0FFh
PORTB
TMR0IF
;Tratamento de interrupo
;Escreve FFh no W
;Escreve o contedo do registo W no porto B
;Limpa a flag para permitir a activao da interrupo
;Fim do tratamento de interrupo
MAIN
BCF
BSF
BSF
IPEN
GIE
TMR0IE
BCF
BSF
BCF
BCF
MOVLW
IORWF
MOVLW
MOVWF
MOVLW
MOVWF
TMR0ON
T08BIT
T0CS
PSA
06h
T0CON,1,1
98h
TMR0H
96h
TMR0L
;Pra o Timer0
;Configura o contador para 16bits
;Configura a fonte para clock interno
;Usa divisor de frequncia
;Divide a frequncia por 128
13
BSF
TMR0ON
;Inicia o Timer0
;....
; Ao fim de 1 segundo o programa ser interrompido e todos os pinos do porto B
estaro a 1, seguindo imediatamente de onde havia sido interrompido. Assume-se
uma frequncia interna de 40MHz
#pragma code INT_VECTOR = 0x08
timer0_isr(){
PORTB=0xFF;
TMR0IF=0;
}
void main(){
IPEN=0;
GIE=1;
TMR0IE=1;
TMR0ON=0
T08BIT=1;
T0CS=0;
PSA=0;
T0CON|=0x06;
TMR0H=0x98;
TMR0L=0x96;
TMR0ON=1;
//
...
}
ou
#int_timer0
timer0_isr(){
output_port_b(0xFF);
}
void main(){
interrupt_active(int_timer0);
setup_timer(RTCC_INTERNAL|RTCC_DIV_2|RTCC_16_BIT);
set_timer0(0x9896);
//
...
}
14
3.
INTCON
bit 7 GIE/GIEH: Global Interrupt Enable bit
Quando IPEN = 0:
1 = Activa todas as interrupes
0 = Desactiva todas as interrupes
Quando IPEN = 1:
1 = Activa todas as interrupes com alta prioridade
0 = Desactiva todas as interrupes com alta prioridade
bit 6 PEIE/GIEL: Peripheral Interrupt Enable bit
Quando IPEN = 0:
1 = Activa todas as interrupes perifricas
0 = Desactiva todas as interrupes perifricas
Quando IPEN = 1:
1 = Activa todas as interrupes perifricas com alta prioridade
0 = Desactiva todas as interrupes perifricas com alta prioridade
bit 5 TMR0IE: TMR0 Overflow Interrupt Enable bit
1 = Activa a interrupo do timer 0
0 = Desactiva a interrupo do timer 0
bit 4 INT0IE: INT0 External Interrupt Enable bit
1 = Activa a interrupo externa 0
0 = Desactiva a interrupo externa 0
bit 3 RBIE: RB Port Change Interrupt Enable bit
1 = Activa a interrupo do porto B
0 = Desactiva a interrupo do porto B
bit 2 TMR0IF: TMR0 Overflow Interrupt Flag bit
1 = O registo TMR0 chegou ao mximo/activou interrupo (para reactivar a
deteco/interrupo, deve manualmente colocar-se a 0, ou a deteco/interrupo
no volta a disparar)
0 = O registo TMR0 no chegou ao mximo/activou interrupo
bit 1 INT0IF: INT0 External Interrupt Flag bit
1 = A interrupo INT0 foi activada (para reactivar a interrupo, deve manualmente
colocar-se a 0, ou a interrupo no volta a activar)
0 = A interrupo INT0 no foi activada
15
16
17
4.
Figura 8: Pipeline
5.
Referncias
http://www.microchip.com
http://www.pic-tools.com
20