Академический Документы
Профессиональный Документы
Культура Документы
INGENIERIA Electrnica
Introduccin a
Programacin de
microcontroladores en
Lenguaje C
www.inacap.cl
Contenido
Programacin en C:
Caractersticas, Instrucciones;
Datos y operaciones en C.
COMPILAODRES PCB, PCW, PCH, PCHW, etc.
Definiciones de datos
Compilacin de un programa en lenguaje C
mediante instrucciones simples
Ejemplos demostrativos
www.inacap.cl
EPROM
11
Program
Memory
1001
00100001
1K x 14
11 1001 00100001
Instruccin
Operando
ANDLW 33d
Instruccin en ensamblador
www.inacap.cl
BTFSS PORTB,3
GOTO PROG
SIGUE10
Comentarios
BTFSC PORTB,2
GOTO SIGUE5
BTFSC VA_RA1
GOTO SIGUE4
BSF VA_RA1
GOTO SIGUE6
SIGUE5 BTFSS VA_RA1
GOTO SIGUE4
BCF VA_RA1
SIGUE6 BSF ANTIRB
MOVLW 0x0F
MOVWF ARB_CTR
; Inhabilita interrupciones
www.inacap.cl
:02000000CE2808
:08000800012A82073F3448344D
compilacin
GOTO SIGUE4
:10001000483448343F347F344934493449343634E1
:100020003E3441344134413422347F34413441340C
:1000300041343E347F3449344934493449347F347F
BTFSS PORTB,3
:1000400048344834483440343E34413441344534F3
GOTO PROG
:1000500026347F340834083408347F344134413442
l ca
Vo
SIGUE10
Cdigo mquina
Archivo.hex
:100060007F344134413406340134013401347E3468
BTFSC PORTB,2
do
GOTO SIGUE5
am
BTFSC VA_RA1
ia
or
em
GOTO SIGUE4
BSF VA_RA1
GOTO SIGUE6
SIGUE5 BTFSS VA_RA1
GOTO SIGUE4
BCF VA_RA1
SIGUE6 BSF
ANTIRBensamblador
Listado
MOVLWArchivo.asm
0x0F
MOVWF ARB_CTR
BCF INTCON,GIE
STATUS,C
BCF
MOVF TSEMAN0,W
ADDWF
TCICLO0,W
MOVWF TREALM0
...
www.inacap.cl
www.inacap.cl
void visualizacion()
compilacin
{
if (!aux) {
:10001000483448343F347F344934493449343634E1
:100020003E3441344134413422347F34413441340C
vis=FALSE;
:1000300041343E347F3449344934493449347F347F
PORTB=0;
:1000400048344834483440343E34413441344534F3
Cdigo mquina
:1000500026347F340834083408347F344134413442
l ca
Vo
Archivo.hex
:100060007F344134413406340134013401347E3468
else {
do
PORTB=leds;
am
if (!no_leds) {
ia
or
em
no_leds=TRUE;
targetH+=2;
nCaracter--;
leds=0;
}
else {
no_leds=FALSE;
targetH+=2;
if (nCaracter)
Listado en{ C
if (--aux) obtenerH();
Archivo.c
}
else {
nCaracter=6;
www.inacap.cl
www.inacap.cl
www.inacap.cl
Directivas de preprocesado
Programas
Bloques de programa.
una
llamada
Sentencias
Instrucciones que definen lo que hace el
programa y la secuencia de ejecucin del
mismo.
Comentarios
Imprescindibles como documentacin del
cdigo fuente.
www.inacap.cl
11
p.e.:int i;
www.inacap.cl
Los tipos de variable short y long pueden tener detrs la palabra int sin
efecto alguno.
13
www.inacap.cl
Significado
Tamao
Rango
carcter con signo 8 bits
-128 a 127
entero con signo
16 bits
-16384 a 16383
coma flotante
16 bits
-32768 a 32767
15
www.inacap.cl
16
www.inacap.cl
Los argumentos se pueden pasar a las funciones por valor o por referencia.
La llamada por valor copia el argumento de llamada en el parmetro
formal de la funcin (No modifica su valor en la funcin de partida).
La llamada por referencia usa la direccin de la variable que se pasa a la
funcin (se consigue usando punteros o arrays).
17
www.inacap.cl
De asignacin
Aritmticos
18
www.inacap.cl
Lgicos
De bits
19
www.inacap.cl
Desplazamiento bit
Direccin/indireccin
www.inacap.cl
21
www.inacap.cl
22
www.inacap.cl
Sentencia if
Se ejecuta una sentencia o bloque de cdigo si la expresin que
acompaa al if tiene un valor distinto a cero (verdadero). Si es cero
(falso) contina sin ejecutar la sentencia o bloque de sentencias.
if (expresin)
sentencia; {
sentencia 1;
sentencia 2;
...
}
Sentencia if-else
Se evala una expresin y, si es cierta, se ejecuta el primer bloque
de cdigo (o sentencia 1). Si es falsa, se ejecuta el segundo.
if (expresin)
sentencia 1;
else
sentencia 2;
23
www.inacap.cl
Sentencia if-else
If (P1 !=0) c=20;
else c=0;
24
www.inacap.cl
Sentencia if-if/else
If (a>b) {
If (a>d) c = 15;
else c=0; }
25
www.inacap.cl
Sentencia if/else - if
If (a>b) {
If (a>d) c = 15;
}
else c=0;
26
www.inacap.cl
Sentencia switch
Substituye a if-else cuando se realiza una seleccin mltiple que
compara una expresin con una lista de constantes enteras o
caracteres. Cuando se da una coincidencia, el cuerpo de sentencias
asociadas a esa constante se ejecuta hasta que aparezca break.
switch (expresin)
{
case constante 1:
grupo 1 de sentencias;
break;
case constante 2:
grupo 2 de sentencias;
break;
...
default:
grupo n de sentencias;
}
break es opcional. Si no
aparece se sigue con el case
siguiente.
No puede haber constantes
iguales en dos case de la
misma sentencia switch.
default es opcional y el bloque
asociado se ejecuta slo si no
hay ninguna coincidencia con
las constantes especificadas.
27
www.inacap.cl
Sentencia switch
Switch (k) {
case 0:
x=1;
break;
case 2:
c=6;
b=15;
break;
case 3: x=12;
break;
default: break;
}
28
www.inacap.cl
una
sentencia
bloque
de
For (i=1;i<=100;i++) {
delay_ms(33);
px=?px;
}
For (y=1;i<=99;y=y+3) {
delay_ms(33);
px=y;
}
30
www.inacap.cl
31
www.inacap.cl
32
www.inacap.cl
33
www.inacap.cl
// Esto es un comentario.
Formato 2. Empiezan por /* y finalizan por */. No es posible anidar
comentarios con este formato.
/* Esto tambin es
un comentario */
/* Pero esto que /* parece un comentario vlido*/ no lo es */
34
www.inacap.cl
www.inacap.cl
#DEVICE chip
#FUSES options
Define la palabra de configuracin para la grabacin
del
microcontrolador.
#INCLUDE <fichero>
#INCLUDE fichero
#INLINE
#SEPARATE
www.inacap.cl
#INT_xxxx
www.inacap.cl
38
www.inacap.cl
39
www.inacap.cl
40
www.inacap.cl
Para crear un nuevo proyecto PROJECT > NEW > PIC WIZARD /
MANUAL CREATE
41
www.inacap.cl
PCB (12bit)
PCM (14bit)
PCH (PIC18)
COMPILAR (F9)
MONTARLO
42
www.inacap.cl
www.inacap.cl
www.inacap.cl
Lectura de puertos:
valor = PORTA; // Asigna el dato del puerto A a la variable valor.
Manejo de sentencias:
TRISD=0x0F;
if (PORTD & 0x0F) PORTD |= 0xA0; //comprueba los 4 terminales de
// menor peso del puerto D y si son
// 1111 saca por los 4 terminales de
// mayor peso el dato 1010.
45
www.inacap.cl
46
COMPILAR
(F9)
MONTARLO
47
www.inacap.cl
48
www.inacap.cl
49
www.inacap.cl
51
www.inacap.cl
52
www.inacap.cl
www.inacap.cl
54
www.inacap.cl
55
www.inacap.cl
56
www.inacap.cl
57
www.inacap.cl
58
www.inacap.cl
Por defecto, este driver usa siete bits del puerto B para establecer la
comunicacin entre el LCD y el microcontrolador (aunque tambin se
puede utilizar el puerto D).
B0 Enable
B4 Bit de datos D4
B1 RS
B5 Bit de datos D5
B2 R/W
B6 Bit de datos D6
B3 B7 Bit de datos D7
59
www.inacap.cl
printf(lcd_putc,cadena,vars);
cadena: Cadena de caracteres que puede formarse usando el
contenido de una o ms variables.
vars: Variables incluidas en la cadena (separadas por comas).
c
s
u
x
d
g
w
Carcter
e Flotante (formato exp)
Cadena o carcter f
Flotante truncando
Entero sin signo
lu Entero largo sin signo
X Entero hexadecimal
lx lX Entero largo hexadecimal
Entero con signo
ld Entero largo con signo
Flotante rendondeado
Entero sin signo. La 1 cifra indica el total, la 2 el n de
decimales
60
www.inacap.cl
Valor=0xfe
61
www.inacap.cl
www.inacap.cl
C1/CLKIN
C2/CLKOUT
CLR/Vpp/THV
0/AN0
1/AN1
2/AN2/V REF3/AN3/V REF+
4/T0CKI
5/AN4/S S
RB0/INT
RB1
RB2
RB3/P GM
RB4
RB5
RB6/P GC
RB7/P GD
RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2
RC2/CCP1
RC3/S CK/S CL
RC4/S DI/ SDA
RC5/S DO
RC6/TX /CK
RC7/RX /DT
RS
RW
E
D0
D1
D2
D3
D4
D5
D6
D7
7
8
9
10
11
12
13
14
4
5
6
1
2
3
VSS
VDD
VEE
LM016L
21
22
23
24
25
26
27
28
11
12
13
14
15
16
17
18
16F876
COMPILAR (F9)
MONTARLO
63
www.inacap.cl
D0
D1
D2
D3
D4
D5
D6
D7
RS
RW
E
4
5
6
1
2
3
7
8
9
10
11
12
13
14
V SS
V DD
V EE
LM0 16L
U1
OS C1/CLKIN
OS C2/CLKOUT
MCLR/Vpp/THV
RA 0/A N0
RA 1/A N1
RA 2/A N2/VRE FRA 3/A N3/VRE F+
RA 4/T 0CKI
RA 5/A N4/SS
RB0/IN T
RB1
RB2
RB 3/PGM
RB4
RB5
RB 6/PGC
RB 7/PGD
R C0/T 1OSO/T1CKI
RC1/T1OS I/C CP2
RC2/CCP1
RC3/SCK/S CL
RC4/S DI/SDA
RC5/SDO
RC6/T X/C K
RC7/RX/D T
21
22
23
24
25
26
27
28
11
12
13
14
15
16
17
18
PI C16F87 6
COMPILAR (F9)
MONTARLO
64
www.inacap.cl
kbd_get();
Devuelve el valor de la tecla pulsada en funcin de la tabla que
tiene programada.
65
www.inacap.cl
66
www.inacap.cl
pin(port)
LCD2
RA0/AN0
RA1/AN1
RA2/AN2/VREFRA3/AN3/VREF+
RA4/T0CKI
RA5/AN4/SS
RB0/INT
RB1
RB2
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD
RC0/T 1OSO/T 1CKI
RC1/T 1OSI/CCP2
RC2/CCP1
RC3/SCK/SCL
RC4/SDI/SDA
RC5/SDO
RC6/T X/CK
RC7/RX/DT
21
22
23
24
25
26
27
28
D0
D1
D2
D3
D4
D5
D6
D7
RS
RW
E
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
OSC1/CLKIN
OSC2/CLKOUT
MCLR/Vpp/T HV
VSS
VDD
VEE
U1
9
10
1
1
2
3
LM016L
11
12
13
14
15
16
17
18
PIC16F876
C0
C1 C2
R0
R1
R
2
R3
67
www.inacap.cl
Ejemplo: TECLADO/DISPLAY
2
3
4
5
6
7
OSC1/CLKIN
OSC2/CLKOUT
MCLR/Vpp/T HV
RA0/AN0
RA1/AN1
RA2/AN2/VREFRA3/AN3/VREF+
RA4/T0CKI
RA5/AN4/SS
RB0/INT
RB1
RB2
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD
RC0/T 1OSO/T1CKI
RC1/T 1OSI/CCP2
RC2/CCP1
RC3/SCK/SCL
RC4/SDI/SDA
RC5/SDO
RC6/T X/CK
RC7/RX/DT
21
22
23
24
25
26
27
28
D5
D6
D7
D0
D1
D2
D3
D4
RS
RW
E
4
5
6
7
8
9
10
11
12
13
14
VSS
VDD
VEE
U1
9
10
1
2
3
LM016L
11
12
13
14
15
16
17
18
PIC16F876
68
www.inacap.cl
D0
D1
D2
D3
D4
D5
D6
D7
RS
RW
E
4
5
6
7
8
9
10
11
12
13
14
V SS
V DD
V EE
1
2
3
Ejemplo: TECLADO/DISPLAY
21
22
23
24
25
26
27
28
11
12
13
14
15
16
17
18
69
www.inacap.cl
COMPILAR (F9)
MONTARLO
70
www.inacap.cl
71
www.inacap.cl
#INT_RTCC
#INT_RB
#INT_EXT
#INT_AD
#INT_TBE
#INT_RDA
#INT_TIMER1
#INT_TIMER2
#INT_CCP1
#INT_CCP2
#INT_SSP
#INT_BUSCOL
#INT_EEPROM
Desbordamiento de TMR0.
(T0IF)
Cambio en los pines RB<4:7>.
(RBIF)
Flanco en pin RB0.
(INTF)
Fin de conversin A/D.
(ADIF)
Buffer de transmisin USART vaco.
(TXIF)
Dato recibido en USART.
(RCIF)
Desbordamiento de TMR1.
(TMR1IF)
Desbordamiento de TMR2.
(TMR2IF)
Captura / Comparacin en mdulo CCP1.
(CCP1IF)
Captura / Comparacin en mdulo CCP2.
(CCP2IF)
Envo / Recepcin de dato serie sncrono. (SSPIF)
Colisin de bus I2C.
(BCLIF)
Escritura completa en EEPROM de datos.
(EEIF)
72
www.inacap.cl
El programador
interrupciones.
debe
seguir
encargndose
73
www.inacap.cl
de
habilitar
las
enable_interrupts (nivel);
nivel es una constante definida en 16F876.h y genera el cdigo
necesario para activar las mscaras necesarias.
Etiquetas de nivel definidas para el 16F876:
GLOBAL
INT_RTCC INT_RB
INT_EXT
INT_AD
INT_TBE
INT_RDA
INT_TIMER1
INT_TIMER2 INT_CCP1 INT_CCP2 INT_SSP
INT_PSP
INT_BUSCOL
INT_EEPROM
La mscara global (la que hace GIE=1) debe activarse de manera
independiente. Las otras slo activan la mscara particular y el PEIE
si es necesario.
disable_interrupts (nivel);
Hace la accin contraria a la funcin anterior, poniendo a 0 las
mscaras relacionadas con la interrupcin indicada.
74
www.inacap.cl
ext_int_edge (H_TO_L);
Selecciona flanco de bajada para activar el flag INTF.
ext_int_edge (L_TO_H);
Selecciona flanco de subida para activar el flag INTF.
#INT_EXT
ext_isr() {
......}
enable_interrupts (INT_EXT); // Activa mscara INTE
ext_int_edge (H_TO_L);
// Flag INTF si flanco de bajada.
enable_interrupts (GLOBAL); // Habilita mscara global de int.
/* Si entra una interrupcin por flanco de bajada en RB0, se ir a la
funcin que aparece tras la directiva #INT_EXT */
disable_interrupts (INT_EXT); // Desactiva interrupciones en RB0.
disable_interrupts (GLOBAL); // Desactiva todas las interrupciones.
75
www.inacap.cl
D1
LED-GREE N
R1
180
Ejemplo: INTERRUPCIONES_RB0
COMPILAR (F9)
MONTARLO
76
www.inacap.cl
www.inacap.cl
modo: WDT_18MS
(OPTION_REG 08h)
WDT_36MS (OPTION_REG 09h)
WDT_72MS (OPTION_REG 0Ah)
WDT_144MS
(OPTION_REG 0Bh)
WDT_288MS
(OPTION_REG 0Ch)
WDT_576MS
(OPTION_REG 0Dh)
WDT_1152MS (OPTION_REG 0Eh)
WDT_2304MS (OPTION_REG 0Fh)
78
www.inacap.cl
79
www.inacap.cl
(TMR0 valor)
(valor TMR0)
(equivale a CLRWDT)
80
www.inacap.cl
#INCLUDE <16F876.h>
#use delay(clock=4000000)
#fuses XT,NOWDT
#use standard_io(B)
int1 var0=0;
//variable de cambio
500us=4/Fosc(256-x)
X=6
Con Fosc=4MHz y preescaler
1:2
#int_TIMER0
void TIMER0_isr(void) {
var0++;
//se complementa la variable
if (var0==1) output_bit(PIN_B0,1);
//para semiperiodo alto
else output_bit(PIN_B0,0);
//para semiperiodo bajo
set_timer0 (0x06); }
//se recarga el timer0
void main() {
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); //configuracin timer0
set_timer0 (0x06);
//carga del timer0
enable_interrupts(INT_TIMER0);
//habilita interrupcion timer0
enable_interrupts(global);
//habilita interrupcin general
while (1);
//bucle infinito
}
81
www.inacap.cl
82
www.inacap.cl
www.inacap.cl
www.inacap.cl
temp1s()
{
int cont=0;
0.5=4/Fosc(65536-x)P
X = 3036
Con Fosc=4MHz y preescaler
1:8
output_toggle(PIN_B1);
while (cont<2)
{
set_timer1 (3036);
while (get_timer1()>=3036);
cont++;
}
}
main ()
{
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8);
while(1){
temp1s();
}
85
www.inacap.cl
www.inacap.cl
87
www.inacap.cl
x = 125
int1 var0=0;
//variable de cambio
Con Fosc=4MHz
#int_TIMER2
preescaler 4
void TIMER2_isr(void) {
//Funcin Interrupcin
1
var0++;
//se complementa postscaler
la variable
if (var0==1) output_bit(PIN_B0,1); //para semiperiodo alto
else output_bit(PIN_B0,0);
//para semiperiodo bajo
set_timer0 (0x7C); }
//se recarga el timer0
void main() {
setup_timer_2 (T2_DIV_BY_4 ,124,1); //configuracin timer2
enable_interrupts(INT_TIMER2);
//habilita interrupcion timer0
enable_interrupts(global);
//habilita interrupcin general
while (1);
//bucle infinito
}
88
www.inacap.cl
89
www.inacap.cl
OS C1/CLKIN
OS C2/CLKOUT
MCLR/V pp/ THV
RA 0/AN0
RA 1/AN1
RA 2/AN2/V RE FRA 3/AN3/V RE F+
RA 4/T0CKI
RA 5/AN4/S S
RB0/INT
RB 1
RB 2
RB 3/PGM
RB 4
RB 5
RB 6/PGC
RB 7/PGD
RC0/T1OS O/T 1CKI
RC1/T 1OSI/CCP2
RC2 /CCP1
RC3/SCK/ SCL
RC4/ SDI /SDA
RC5/SDO
RC6/T X/CK
RC7/RX/DT
21
22
23
24
25
26
27
28
11
12
13
14
15
16
17
18
D3
D1
D2
R3
R1
R2
180
180
180
PIC16F876
COMPILAR (F9)
MONTARLO
90
www.inacap.cl
91
www.inacap.cl
www.inacap.cl
D0
D1
D2
D3
D4
D5
D6
D7
RS
RW
VSS
VDD
VEE
U1 (RB0/INT )
2
3
4
5
6
7
RA0/AN0
RA1/AN1
RA2/AN2/VREFRA3/AN3/VREF+
RA4/T 0CKI
RA5/AN4/SS
RB0 /INT
RB1
RB2
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD
RC0/T 1OSO/T 1CKI
RC1/T1OSI/CCP2
RC2/CCP1
RC3/SCK/SCL
RC4/SDI/SDA
RC5/SDO
RC6/TX/CK
RC7/RX/DT
4
5
6
21
22
23
24
25
26
27
28
7
8
9
10
11
12
13
14
OSC1 /CLKIN
OSC2 /CLKOUT
MCLR/Vpp/THV
1
2
3
U1
9
10
1
11
12
13
14
15
16
17
18
PIC16F876
93
www.inacap.cl
94
www.inacap.cl
COMPILAR (F9)
MONTARLO
95
www.inacap.cl
D0
D1
D2
D3
D4
D5
D6
D7
RS
RW
E
4
5
6
1
2
3
7
8
9
10
11
12
13
14
VSS
VDD
VEE
LM016L
U1
9
10
1
2
3
4
5
6
7
OSC1/CLKIN
OSC2/CLKOUT
MCLR/Vpp/THV
RA0/AN0
RA1/AN1
RA2/AN2/VREFRA3/AN3/VREF+
RA4/T 0CKI
RA5/AN4/SS
RB0/INT
RB1
RB2
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD
RC0/T1OSO/T 1CKI
RC1/T1OSI/CCP2
RC2/CCP1
RC3/SCK/SCL
RC4/SDI/SDA
RC5/SDO
RC6/TX/CK
RC7/RX/DT
21
22
23
24
25
26
27
28
11
12
13
14
15
16
17
18
PIC16F876
Simularlo con el
ISIS y leer la
EEPROM con el
DEBUG
96
www.inacap.cl
97
98
www.inacap.cl
ADCS0
CHS1
CHS0
CHS2
GO/DONE
001 = Canal 1
010 = Canal 2
011 = Canal 3
100 = Canal 4
101 = Canal 5
110 = Canal 6
111 = Canal 7
0 = Conversin finalizada
www.inacap.cl
PCFG3
PCFG2
PCFG1
PCFG0
0 = Ajuste a la izquierda
AN7
RE2
AN6
RE1
AN5
RE0
AN4
RE1
AN3
RE3
AN2
RA2
0000
0001
0010
0011
0100
0101
011x
1000
1001
1010
1011
1100
1101
1110
1111
A
A
D
D
D
D
D
A
D
D
D
D
D
D
D
A
A
D
D
D
D
D
A
D
D
D
D
D
D
D
A
A
D
D
D
D
D
A
A
A
A
D
D
D
D
A
A
A
A
D
D
D
A
A
A
A
D
D
D
D
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-
www.inacap.cl
AN1
RA1
A
A
A
A
A
A
D
A
A
A
A
A
A
100
D
D
AN0
RA0
A
A
A
A
A
A
D
A
A
A
A
A
A
A
A
GIE
PEIE
INTE
RBIE
T0IE
RBIF
INTF
ADIE
TXIE
SSPIE
RCIE TMR1IE
ADIF
TXIF
SSPIF
RCIF TMR1IF
0 = Conversin A/D an no
www.inacap.cl
101
www.inacap.cl
4. Comenzar la conversin.
- Poner a 1 el bit GO/DONE. (ADCON0)
No activar este bit a la vez que se enciende el convertidor A/D
5. Esperar a que se complete la conversin A/D.
a) Controlando cundo el bit GO/DONE se pone a 0.
b) Esperando a que llegue la interrupcin del convertidor.
6. Leer el resultado de la conversin.
- Disponible en los registros ADRESH:ADRESL.
- Bajar el flag ADIF si se estn usando interrupciones.
7. Llevar a cabo la siguiente conversin.
- Volver al paso 1 2, segn convenga.
- Espera mnima antes de empezar la siguiente adquisicin:
2TAD.
TAD: Tiempo necesario para la conversin de un bit.
103
www.inacap.cl
Tiempo de adquisicin
Tiempo necesario para cargar el condensador de
mantenimiento (CHOLD).
Tiempo de conversin
La conversin de 10 bits dura 12TAD.
TcicloTAD TAD TA
D
TA
D
TAD
TA
TA
TAD
TA
TAD
TA
TAD
b9 b8
b7 b6 b5 b4 b3 b2
b1 b0
Comienza
la conversin
Se carga
ADRES
Se pone GO/DONE a 0
Se abre SS (tp. 100ns)
Se levanta el flag ADIF
GO/DONE 1
CHOLD conectado a entrada
analgica
- TAD=8TOSC
- TAD=32TOSC
105
www.inacap.cl
Funcin de transferencia
La primera transicin tiene lugar cuando la tensin
analgica de entrada alcanza el valor VREF- + (VREF+ VREF-)/1024 1LSb.
106
www.inacap.cl
ADC_CLOCK_DIV_2
(ADCON0 01h)
ADC_CLOCK_DIV_8
(ADCON0 41h)
ADC_CLOCK_DIV_32
(ADCON0 81h)
ADC_CLOCK_INTERNAL
(ADCON0 C1h)
NO_ANALOGS
ALL_ANALOG
(ADCON1 86h)
(ADCON1 80h)
ANALOG_RA3_REF
A_ANALOG
(ADCON1 81h)
(ADCON1 82h)
A_ANALOG_RA3_REF
RA0_RA1_RA3_ANALOG
(ADCON1 83h)
(ADCON1 84h)
RA0_RA1_ANALOG_RA3_REF
(ADCON1 85h)
107
www.inacap.cl
(ADCON1 88h)
ANALOG_NOT_RE1_RE2
(ADCON1 89h)
ANALOG_NOT_RE1_RE2_REF_RA3
(ADCON1 8Ah)
ANALOG_NOT_RE1_RE2_REF_RA3_RA2
(ADCON1 8Bh)
A_ANALOG_RA3_RA2_REF
(ADCON1 8Ch)
RA0_RA1_ANALOG_RA3_RA2_REF
(ADCON1 8Dh)
RA0_ANALOG
(ADCON1 8Eh)
RA0_ANALOG_RA3_RA2_REF
(ADCON1 8Fh)
(AN0)
1 (AN1)
2 (AN2)
3 (AN3)
(AN4)
(AN5)
(AN6)
7
(AN7)
108
www.inacap.cl
#device
8 bits
10 bits
11 bits
16 bits
adc=8
00-FF
00-FF
00-FF
00-FF
adc=10
0-3FF
adc=11
0-7FF
adc=16
0-FF00
0-FFC0
0-FFE0
0-FFFF
www.inacap.cl
Ejemplo
setup_adc_ports (A_ANALOG);
setup_adc
(ADC_CLOCK_INTERNAL);
set_adc_channel (3);
delay_us (20);
valor = read_adc ();
setup_adc (ADC_OFF);
W ADCON0
WW&
00111000
ADCON0 W
www.inacap.cl
W 10000010
Banco 1
ADCON1 W
Banco 0
W ADCON0
W W & 00111000
W W | 11000001
ADCON0 W
W ADCON0
W W & 11000111
W W | 00011000
ADCON0 W
GO/DONE 1
Espera a
GO/DONE=0
W ADRESH
TEMP W
Banco 1
W ADRESL
Banco 0
REGL W
W TEMP
REGH W
110