Vous êtes sur la page 1sur 91

1

Compilador C para PIC


CCS C

2
Compilador C para PIC
CCS PIC COMPILER

Un compilador convierte un lenguaje de alto nivel a instrucciones en cdigo mquina.

Un cross-compiler es un compilador que funciona en un procesador (normalmente
en PC) diferente al procesador objeto. Varios compiladores C tiene como procesador
objetos los PICmicro tal es el caso de HiTECH, MicroChip y CCS.








Los programas son editados y compilados a instrucciones mquina en el PC.

El cdigo mquina es cargado del PC al sistema PIC mediante el ICD2.

El cdigo es ejecutado en el PIC y puede ser depurado (puntos de ruptura, paso a
paso, etc) desde el PC.

Nota: Ver documentos anexos sobre CCS
3
Compilador C para PIC
CCS PIC COMPILER

Los elementos bsicos de un programa en C

Directivas de preprocesado
Indican al compilador cmo debe generar el
cdigo mquina.

Programas
Bloques de programa.
Siempre debe incluirse una llamada main().

Sentencias
Instrucciones que definen lo que hace el
programa y la secuencia de ejecucin del mismo.

Comentarios
Imprescindibles como documentacin del
cdigo fuente.



4
Compilador C para PIC
VARIABLES

Una variable es un nombre asignado a una o varias posiciones de memoria RAM.

En C es necesario declarar todas las variables antes de poder utilizarlas, indicando el
nombre asignado y el tipo de datos que en ella se van a almacenar (opcionalmente
tambin el valor inicial asignado).

tipo nombre_variable [=valor]; p.e.:int i;

Los tipos de datos aceptados en C estndar son cinco:
char (carcter) int (entero)
float (coma flotante en 32 bits) double (coma flotante en 64 bits)
void (sin valor)

Las variables pueden ser locales o globales. Las variables locales slo pueden ser
usadas en la funcin en que se declaran, mientras que las variables globales son
compartidas por todas las funciones del programa (deben declararse fuera de cualquier
funcin y antes de ser utilizadas).



5
Compilador C para PIC
VARIABLES

El compilador de CCS acepta los siguiente tipos de variable.

Especificacin Significado Tamao Rango
char carcter 8 bits 0 a 255 (sin signo)
int entero 8 bits 0 a 255 (sin signo)
float coma flotante 32 bits 6 bits de precisin
double float doble precisin no soportado No para PCM
void sin valor nulo ninguno
int1 entero de 1 bit 1 bit 0 a 1
int8 entero de 8 bits 8 bits 0 a 255 (sin signo)
int16 entero de 16 bits 16 bits 0 a 65535 (sin signo)
int32 entero de 32 bits 32 bits 0 a (232-1)
short entero de 1 bit 1 bit 0 a 1
long entero de 16 bits 16 bits 0 a 65535 (sin signo)
Los tipos de variable short y long pueden tener detrs la palabra int sin efecto alguno.


6
Compilador C para PIC
VARIABLES

Todos los tipos de datos son por defecto sin signo (unsigned) salvo los de tipo float.
Para almacenar datos con signo, hay que introducir el modificador signed delante del
tipo. El efecto que se consigue es el recogido en la siguiente tabla.

Especificacin Significado Tamao Rango
signed char carcter con signo 8 bits -128 a 127
signed int16 entero con signo 16 bits -16384 a 16383
signed long coma flotante 16 bits -32768 a 32767

Los nmeros negativos se codifican en complemento a 2.

Cuando se opera con distintos grupos de datos en una misma expresin, se aplican una
serie de reglas para resolver las diferencias. En general se produce una promocin
hacia los tipos de datos de mayor longitud presentes en la expresin.


7
Compilador C para PIC
FUNCIONES

Las funciones son los bloques constructivos fundamentales en C. Todas las sentencias
deben encontrarse dentro de funciones.
Las funciones deben ser definidas antes de ser utilizadas.
Formato general de definicin de una funcin:

tipo_dato_return nombre_func (tipo param1 , tipo param2 , )
{
cuerpo de la funcin (sentencias);
}

Las funciones pueden devolver un valor a la sentencia que las llama. El tipo de dato
devuelto se indica mediante tipo_dato (char, int16, long). Si no se indica nada, se
entiende que devuelve un entero. Si no devuelve nada, debe incluirse una especificacin
tipo void.

8
Compilador C para PIC
FUNCIONES

La manera que tiene una funcin para devolver un valor es mediante la sentencia
return.
return (expresin); return expresin;

La expresin debe proporcionar el mismo tipo de dato que el especificado en la
funcin. Si no debe devolver nada, se finaliza con return;

Cuando una funcin se encuentra con una sentencia return se vuelve a la rutina de
llamada inmediatamente y las sentencias posteriores a return no se ejecutan.

Adems de con las sentencia return, las funciones terminan su ejecucin y vuelven al
lugar desde donde se les llam cuando alcanzan la llave de cierre de funcin } tras
ejecutar la ltima sentencia de la misma.

9
Compilador C para PIC
FUNCIONES

Adems de devolver valores, una funcin tambin puede recibir parmetros
(denominados argumentos) segn se indic en su definicin.

int suma (int a , int b) Parmetros formales
{
return (a+b);
}
main()
{
int c;
c = suma (10 , 23); Argumentos de llamada
}

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).



10
Compilador C para PIC
OPERADORES

El lenguaje C define numerosos operadores mediante los cuales se construyen las
expresiones (combinacin de operadores y operandos).


De asignacin








Aritmticos

11
Compilador C para PIC
OPERADORES


Relacionales





Lgicos



De bits
12
Compilador C para PIC
OPERADORES


In/decremento



Desplazamiento bit



Direccin/indireccin



En lenguaje C profesional es muy frecuente usar abreviaturas.
As, por ejemplo, es ms habitual ver a += b; que a = a + b;

13
Compilador C para PIC
OPERADORES



14
Compilador C para PIC
DECLARACIONES



15
Compilador C para PIC
Sentencias de control de programa
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; (expresin) ? (sentencia 1) : (sentencia 2);
else
sentencia 2;






16
Compilador C para PIC
Sentencias de control de programa
Sentencia if-if/else





If (P1 !=0) c=20;
else c=0;
If (a>b) {
If (a>d) c = 15;
else c=0; }
If (a>b) {
If (a>d) c = 15;
}
else c=0;
17
Compilador C para PIC
Sentencias de control de programa
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;
}







default es opcional y el bloque
asociado se ejecuta slo si no hay
ninguna coincidencia con las
constantes especificadas.
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.
18
Compilador C para PIC
Sentencias de control de programa
Sentencia switch







Switch (k) {
case 0:
x=1;
break;
case 2:
c=6;
b=15;
break;
case 3: x=12;
break;
default: break;
}
19
Compilador C para PIC
Sentencias de control de programa
Sentencia de bucle for
Se emplea para repetir una sentencia o bloque de sentencias.
for (inicializacin ; condicin ; incremento)
{
sentencia(s);
}

En la inicializacin se le asigna un valor inicial a una variable que se emplea
para el control de la repeticin del bucle.

La condicin se evala antes de ejecutar la sentencia. Si es cierta, se ejecuta
el bucle. Si no, se sale del mismo.

El incremento establece cmo cambia la variable de control cada vez que se
repite el bucle.

Es posible anidar bucles for para modificar dos o ms variables de control.







20
Compilador C para PIC
Sentencias de control de programa
Sentencia de bucle for







For (i=1;i<=100;i++) {
delay_ms(33);
px=?px;
}
For (y=1;i<=99;y=y+3) {
delay_ms(33);
px=y;
}
21
Compilador C para PIC
Sentencias de control de programa
Sentencia de bucle while
La repeticin se lleva a cabo mientras sea cierta una expresin.
while(mientras) (expresin)
{
sentencia(s);
}
La expresin se evala antes de cualquier iteracin. Si es falsa, ya no se
ejecuta la sentencia o bloque de sentencias.
Sentencia de bucle do-while.
do
{
sentencia(s);
}
while (expresin)
Las sentencias se ejecutan antes de que se evale la expresin, por lo que el
bucle se ejecuta siempre al menos una vez.







22
Compilador C para PIC
Sentencias de control de programa
Sentencia de bucle while-do/while







while (x>0 && y++<5) {
a=1;
b=45;
x=p1;
}
do {
a=1;
b=45;
x=p1;
}
while (x>0 && y++>5);

23
Compilador C para PIC
Comentarios
Los comentarios se incluyen en el cdigo fuente para explicar el sentido y la
intencin del cdigo al que acompaan. Son ignorados por el compilador y no
afectan a la longitud ni rapidez de ejecucin del cdigo final.
Un comentario se puede colocan en cualquier lugar del programa y pueden
tener la longitud y el nmero de lneas que se quiera.
Hay dos formatos posibles para los comentarios.
Formato 1. Empiezan por // y finalizan con el final de la lnea.

// 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 */







24
Compilador C para PIC
C especfico para los PIC

Las principales diferencias entre compiladores residen en las directivas (pre-
processor commands) y en las funciones integradas (built-in functions).

Al final de esta seccin se incluyen sendas listas con las directivas y las
funciones integradas correspondientes al compilador de CCS.

Directivas de preprocesado ms habituales:
#ASM Las lneas entre estas dos directivas deben ser instrucciones
#ENDASM ensamblador que se insertan tal y como aparecen.

#BIT id=x.y Se crea una variable tipo bit correspondiente al bit y del byte x
en memoria.

#BYTE id=x Se crea una variable y se sita en el byte x en memoria. Si ya
exista esa variable, se coloca fsicamente en la posicin
especificada.








25
Compilador C para PIC
C especfico para los PIC

#DEFINE id texto El identificador se sustituye por el texto adjunto.

#DEVICE chip Define el micro para el que se escribe el cdigo.

#FUSES options Define la palabra de configuracin para la grabacin del
microcontrolador.

#INCLUDE <fichero> Se incluye el texto del fichero especificado en el
#INCLUDE fichero directorio o fuera de l.

#INLINE La funcin que sigue a esta directiva se copia en memoria de
programa cada vez que se le llame. Puede servir para
mejorar la velocidad.

#SEPARATE La funcin que sigue a esta directiva se implementa de
manera separada (no INLINE). De esta manera se ahorra
ROM






26
Compilador C para PIC
C especfico para los PIC

#ORG start Sita el cdigo a partir de una determinada posicin de la
memoria de programa

#INT_xxxx Indica que la funcin que sigue es un programa de
tratamiento de la interrupcin xxxx.
#INT_GLOBAL Indica que la funcin que sigue es un programa genrico de
tratamiento de interrupcin. No se incluye cdigo de
salvaguarda de registros ni de recuperacin como cuando se
usa #INT_xxxx.

#PRIORITY ints Establece un orden de prioridad en las interrupciones.

#USE DELAY (clock = frecuencia en Hz)
Define la frecuencia del oscilador que se va a utilizar, que se
emplea para realizar los clculos para funciones integradas
de retardo.








27
Compilador C para PIC
pre-processor commands





28
Compilador C para PIC
built-in functions





29
Compilador C para PIC
built-in functions





30
Compilador C para PIC
PIC C COMPILER

INICIO > PIC-C > PIC C COMPILER





Se puede Crear o abrir un fichero (FILE > NEW / OPEN) o crear un proyecto
(conjunto de ficheros y opciones de compilacin que se utilizan en un
programa). Los proyectos tienen la extensin PJT.

Para crear un nuevo proyecto PROJECT > NEW > PIC WIZARD / MANUAL
CREATE




31
Compilador C para PIC
PIC C COMPILER











COMPILAR (F9)
MONTARLO
PCB (12bit)
PCM (14bit)
PCH (PIC18)
32
Compilador C para PIC
GESTION DE PUERTOS
Existen dos opciones para configurar y manejar los puertos E/S

Definiendo los registros como variables localizadas en RAM. Se definen los
puertos y los registros de direccin como variables de C y se colocan en las
posiciones reales de estos registros en la memoria RAM de datos. Constituye la
manera ms directa de trabajar con los puertos E/S.


Usando las funciones integradas especficas del compilador. Se definen la
direccin de datos si es necesario y se gestionan las entradas y las salidas
mediante funciones relativas al manejo de todo el puerto o de bits particulares
del mismo.

Cuando se usan las funciones integradas del compilador de CCS, el cdigo
que introduce el compilador puede variar en cuanto a tamao y tiempo de
ejecucin. Depender de la activacin de ciertas directivas de preprocesado:

#USE FAST_IO - #USE FIXED_IO - #USE STANDARD_IO








33
Compilador C para PIC
GESTION DE PUERTOS: POR RAM
OPCIN 1. Definiendo los registros en la RAM. Se definen los registros PORTx y TRISx
como bytes y se sitan en la posicin correspondiente de la memoria RAM. La
directiva C utilizada es #BYTE:
#BYTE variable=constante;
#BYTE TRISA = 0x85 //Variable TRISA en 85h.
#BYTE PORTA = 0x05 //Variable PORTA en 05h.
#BYTE TRISB = 0x86 //Variable TRISB en 86h.
#BYTE PORTB = 0x06 //Variable PORTB en 06h.
Una vez definidas estas variables se pueden configurar y controlar los puertos
mediante comandos de asignacin.A partir de este punto, estas variables
permiten controlar los puertos y se pueden utilizar en sentencias de
asignacin.
TRISA = 0xFF; // 8 terminales de entrada
TRISB = 0x00; // 8 terminales de salida
TRISC = 0x0F; // 4 pin de mayor peso OUT,4 pin de menor peso IN

34
Compilador C para PIC
GESTION DE PUERTOS: POR RAM
Escritura en los puertos:
PORTC = 0x0A; // salida del datos 00001010 por el puerto C
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.



35
Compilador C para PIC
GESTION DE PUERTOS: POR RAM

El compilador de CCS incorpora una serie de funciones integradas que permite
manejar los bits de una variable previamente definida.

bit_clear (var,bit); //Pone a 0 el bit especfico (0 a 7) de la variable.
bit_set (var , bit); //Pone a 1 el bit especfico (0 a 7) de la variable.
bit_test (var , bit); //Muestra el bit especfico (0 a 7) de la variable.
swap (var); //Intercambia los 4 bits de mayor peso por los 4
//de menor peso de la variable.

bit_set (PORTC , 4); //saca un 1 por el terminal RC4
if (bit_test(PORTB,0)==1) bit_clear(PORTB,1); //si RB0 es 1 borra RB1

Tambin se puede declarar un bit de un registro con una variable mediante la
directiva #BIT y trabajar directamente con la variable.

#BIT nombre = posicin.bit #BIT RA4 = 0x05.4
......
RA4 = 0;








36
Compilador C para PIC
GESTION DE PUERTOS: POR RAM








Ejemplo: LED CONTROLADO POR BOTON
RA0/AN0
2
RA1/AN1
3
RA2/AN2/VREF-
4
RA4/T0CKI
6
RA5/AN4/SS
7
OSC1/CLKIN
9
OSC2/CLKOUT
10
RC1/T1OSI/CCP2
12
RC2/CCP1
13
RC3/SCK/SCL
14
RB7/PGD
28
RB6/PGC
27
RB5
26
RB4
25
RB3/PGM
24
RB2
23
RB1
22
RB0/INT
21
RC7/RX/DT
18
RC6/TX/CK
17
RC5/SDO
16
RC4/SDI/SDA
15
RA3/AN3/VREF+
5
RC0/T1OSO/T1CKI
11
MCLR/Vpp/THV
1
U1
PIC16F876
SW1
SW-SPST-MOM
D1
LED-BLUE
R1
180
COMPILAR (F9)
MONTARLO
37
Compilador C para PIC
GESTION DE PUERTOS: POR DIRECTIVAS

OPCIN 2. Usando funciones integradas del compilador.


El compilador de CCS incorpora una serie de funciones integradas orientadas a
trabajar con los puertos E/S.

output_X (valor); //Por el puerto correspondiente se saca
// el valor (0-255).
input_X(); //Se obtiene el valor en el puerto correspondiente.
set_tris_X(valor); //Carga el registro TRISx con el valor (0-255).
port_b_pullups (valor); //Mediante valor=TRUE o valor=FALSE habilita o
//deshabilita las resistencias de pull-up en PORTB.

38
Compilador C para PIC
GESTION DE PUERTOS: POR DIRECTIVAS


Hay una serie de funciones asociadas a un terminal o pin*. El parmetro pin*
se define en un fichero include (por ejemplo, 16F876.h) con un formato del
tipo PIN_Xn, donde X es el puerto y n es el nmero de pin.

#define PIN_A0 40
#define PIN_A1 41


output_low (pin*); //Pin a 0.
output_high (pin*); //Pin a 1.
output_bit (pin* , valor); //Pin al valor especificado.
output_toggle(pin*); //Complementa el valor del pin.
output_float (pin*); //Pin de entrada, quedando a tensin flotante
input_state(pin*); //lee el valor del pin sin cambiar su sentido
input(pin*); // lee el valor del pin.
39
Compilador C para PIC
GESTION DE PUERTOS: POR DIRECTIVAS

La generacin de cdigo para las funciones output_x( ) e input_x( ) depende
de la ltima directiva del tipo #USE *_IO que est activa.

#USE FAST_IO (PUERTO) [PUERTO: A]
Cada vez que se emplea una funcin output...() se saca el valor directamente
al puerto, y cada vez que se emplea una funcin input...() se lee el puerto,
pero no se modifican previamente el registro TRIS correspondiente.
El usuario debe asegurarse de que los registros TRIS estn cargados
adecuadamente antes de llamar a las funciones.
Ej. #USE FAST_IO (B)

#USE STANDARD_IO (PUERTO) [PUERTO: A]
Cada vez que se emplea una funcin output...() se inserta cdigo previo para
forzar a que el bit particular o el puerto completo sean de salida (mediante la
carga del TRIS correspondiente). Si se trata de una funcin input...() se carga
cdigo para definir bit o puerto completo como de entrada.
sta es la opcin activa por defecto.
Ej. #USE STANDARD_IO (C)
40
Compilador C para PIC
GESTION DE PUERTOS: POR DIRECTIVAS

#USE FIXED_IO (PUERTO_OUTPUTS=pin* , ...) [PUERTO: A]
Se genera cdigo relativo a la direccin de los datos de manera previa cada vez
que aparece una funcin integrada del tipo input( ) output( ), pero los
pines se configuran de acuerdo con la informacin que acompaa a la directiva
(slo se indican los pines de salida) y no dependiendo de que la operacin sea
de entrada o de salida como sucede con #USE STANDARD_IO(PUERTO)

Ej. USE FIXED_IO (B_OUTPUTS = PIN_B2 , PIN_B3)


El efecto de colocar una u otra directiva se puede observar en los ficheros *.lst
que se generan como resultado de la compilacin. En general se puede decir
que resulta ms cmodo gestionar los pines de E/S de modo STANDARD, pero
hacindolo de modo FAST se adquiere ms control de lo que se le est
mandando al PIC y se optimiza cdigo.
41
Compilador C para PIC
GESTION DE PUERTOS: POR DIRECTIVAS




42
Compilador C para PIC
GESTION DE PUERTOS: POR PUNTEROS

La memoria se puede acceder en C usando punteros. Los punteros deben ser del
tipo INT.

#define portb (int *) 0x06

portb es un puntero INT cuyo valor es la direccin del bus del dispositivo. El
puerto es accesible mediante el uso del operado *.

int p
p = *portb

En este ejemplo el valor del dato en el puerto direccionado en la posicin de
memoria 0x06 (puerto B) es asignado a la variable p. Antes de que el puerto
sea leido es necesario establecer si es de entrada o salida

#define trisb (int *) 0x86
*trisb = 0xFF



43
Compilador C para PIC
GESTION DE PUERTOS: POR PUNTEROS

Los pines pueden escritos o leidos mediante operadores lgicos.

*portb |= 0b00000100; pone el pin 2 del portB a 1

*portb &= 0b11111011; pone el pin 2 del portB a 0.

Para lee el valor del pin 7 del portB:

If (*portb & 0b10000000) {..



44
Compilador C para PIC
GESTION DE PUERTOS: POR PUNTEROS




45
46
47
48
49
50
51
Compilador C para PIC
Ejemplo: DISPLAY
1.- Vss (Masa)
2.- Vcc (Alimentacin de 2.7V a 5.5V)
3.- Ajuste de contraste (de 0 a 5.5V)
4.- RS (seleccin de registro)
5.- R/W (lectura/escritura)
6.- E (enable)
7.- D0 (dato LSB)
8.- D1
9.- D2
10.- D3
11.- D4
12.- D5
13.- D6
14.- D7 (dato MSB)
LCD con driver HD44780

52
Compilador C para PIC
Ejemplo: DISPLAY
53
Compilador C para PIC
Ejemplo: DISPLAY

LCD en el compilador C de CCS

El compilador C de CCS incluye un driver para manejar LCD, el fichero que
define las funciones indicadas a continuacin.
lcd_init ();
Debe llamarse antes que ninguna otra funcin del fichero LCD.C.
Tal y como aparece en el fichero, adems de borrar el display, configura el LCD
para trabajar como sigue:
a) En formato de 4 bits, con dos lneas y con caracteres de 58 puntos.
b) Con display encendido, cursor apagado y sin parpadeo.
c) Con autoincremento del puntero de direcciones y sin desplazamiento
del display real.
lcd_gotoxy (x , y);
Establece la posicin del LCD a la que se
debe acceder.
Recurdese que la primera posicin de la primera lnea tiene coordenadas (1 ,
1), y que la primera posicin de la segunda lnea es la (1 , 2).
54
Compilador C para PIC
Ejemplo: DISPLAY

lcd_putc (dato);
Escribe dato en la posicin a la que apunta el puntero de direcciones.
La variable dato es de tipo char, y se definen algunos caracteres especiales:
\f Borra el display
\n Se posiciona en el inicio de la segunda lnea
\b Retrocede una posicin

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
55
Compilador C para PIC
Ejemplo: DISPLAY
Tambin es posible escribir en el LCD usando la siguiente funcin.

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).

Para indicar la posicin y el tipo de las variables a incluir en la cadena, se usa
el formato %nt, donde n es opcional.

n: 1-9 Indica el nmero de caracteres a mostrar
(opcional) 01-09 Indica el nmero de ceros a la izquierda
1.1-9.9 Indica cuntos decimales se han de mostrar

t: c Carcter e Flotante (formato exp)
s Cadena o carcter f Flotante truncando
u Entero sin signo lu Entero largo sin signo
x X Entero hexadecimal lx lX Entero largo hexadecimal
d Entero con signo ld Entero largo con signo
g Flotante rendondeado
w Entero sin signo. La 1 cifra indica el total, la 2 el n de
decimales
56
Compilador C para PIC
Ejemplo: DISPLAY

Algunos ejemplos.
printf(lcd_putc , Hola);
printf(lcd_putc , Tecla %c pulsada %u veces , key , cont );

Ejemplos de formato.
Especificador Valor=0x12 Valor=0xfe
%03u 018 254
%u 18 254
%2u 18 ???
%5 18 254
%d 18 -2
%x 12 fe
%X 12 FE
%4X 0012 00FE
%3.1w 1.8 25.4
57
Compilador C para PIC Ejemplo: DISPLAY
El driver LCD.C est pensado para trabajar con el PORTB o el PORTD.








Si se quiere trabajar con otro puerto, como por ejemplo el PORTC, se deben
cambiar los datos en el fichero








#define use_portb_lcd TRUE permite seleccionar el PORT

58
Compilador C para PIC
Ejemplo: DISPLAY

RA0/AN0
2
RA1/AN1
3
RA2/AN2/VREF-
4
RA4/T0CKI
6
RA5/AN4/SS
7
OSC1/CLKIN
9
OSC2/CLKOUT
10
RC1/T1OSI/CCP2
12
RC2/CCP1
13
RC3/SCK/SCL
14
RB7/PGD
28
RB6/PGC
27
RB5
26
RB4
25
RB3/PGM
24
RB2
23
RB1
22
RB0/INT
21
RC7/RX/DT
18
RC6/TX/CK
17
RC5/SDO
16
RC4/SDI/SDA
15
RA3/AN3/VREF+
5
RC0/T1OSO/T1CKI
11
MCLR/Vpp/THV
1
U1
PIC16F876
D
7
1
4
D
6
1
3
D
5
1
2
D
4
1
1
D
3
1
0
D
2
9
D
1
8
D
0
7
E
6
R
W
5
R
S
4
V
S
S
1
V
D
D
2
V
E
E
3
LCD2
LM016L
COMPILAR (F9)
MONTARLO
59
Compilador C para PIC
Ejemplo: DISPLAY/MENU

RA0/AN0
2
RA1/AN1
3
RA2/AN2/VREF-
4
RA4/T0CKI
6
RA5/AN4/SS
7
OSC1/CLKIN
9
OSC2/CLKOUT
10
RC1/T1OSI/CCP2
12
RC2/CCP1
13
RC3/SCK/SCL
14
RB7/PGD
28
RB6/PGC
27
RB5
26
RB4
25
RB3/PGM
24
RB2
23
RB1
22
RB0/INT
21
RC7/RX/DT
18
RC6/TX/CK
17
RC5/SDO
16
RC4/SDI/SDA
15
RA3/AN3/VREF+
5
RC0/T1OSO/T1CKI
11
MCLR/Vpp/THV
1
U1
PIC16F876
R1
10k
D
7
1
4
D
6
1
3
D
5
1
2
D
4
1
1
D
3
1
0
D
2
9
D
1
8
D
0
7
E
6
R
W
5
R
S
4
V
S
S
1
V
D
D
2
V
E
E
3
LCD1
LM016L
COMPILAR (F9)
MONTARLO
60
Compilador C para PIC
Ejemplo: TECLADO/DISPLAY

KEYPAD (3x4) en el compilador C de CCS

El compilador C de CCS incluye un driver KBD.C para manejar el teclado (3x4).

kbd_get();
Devuelve el valor de la tecla pulsada en funcin de la tabla que tiene
programada.

Vista desde atrs
61
Compilador C para PIC
Ejemplo: TECLADO/DISPLAY

El driver KBD.C est pensado para trabajar con el PORTB o el PORTD.









#define use_portb_lcd TRUE permite seleccionar el PORT


62
Compilador C para PIC
Ejemplo: TECLADO/DISPLAY

Las conexiones vienen dadas en el fichero pero se pueden modificar:

col pin(port)
RA0/AN0
2
RA1/AN1
3
RA2/AN2/VREF-
4
RA4/T0CKI
6
RA5/AN4/SS
7
OSC1/CLKIN
9
OSC2/CLKOUT
10
RC1/T1OSI/CCP2
12
RC2/CCP1
13
RC3/SCK/SCL
14
RB7/PGD
28
RB6/PGC
27
RB5
26
RB4
25
RB3/PGM
24
RB2
23
RB1
22
RB0/INT
21
RC7/RX/DT
18
RC6/TX/CK
17
RC5/SDO
16
RC4/SDI/SDA
15
RA3/AN3/VREF+
5
RC0/T1OSO/T1CKI
11
MCLR/Vpp/THV
1
U1
PIC16F876
1 2 3
4 5 6
7 8 9
0 #
123
A
B
C
D
D
7
1
4
D
6
1
3
D
5
1
2
D
4
1
1
D
3
1
0
D
2
9
D
1
8
D
0
7
E
6
R
W
5
R
S
4
V
S
S
1
V
D
D
2
V
E
E
3
LCD2
LM016L
C0 C1 C2
R0
R1
R2
R3
63
Compilador C para PIC
Ejemplo: TECLADO/DISPLAY
RA0/AN0
2
RA1/AN1
3
RA2/AN2/VREF-
4
RA4/T0CKI
6
RA5/AN4/SS
7
OSC1/CLKIN
9
OSC2/CLKOUT
10
RC1/T1OSI/CCP2
12
RC2/CCP1
13
RC3/SCK/SCL
14
RB7/PGD
28
RB6/PGC
27
RB5
26
RB4
25
RB3/PGM
24
RB2
23
RB1
22
RB0/INT
21
RC7/RX/DT
18
RC6/TX/CK
17
RC5/SDO
16
RC4/SDI/SDA
15
RA3/AN3/VREF+
5
RC0/T1OSO/T1CKI
11
MCLR/Vpp/THV
1
U1
PIC16F876
1 2 3
4 5 6
7 8 9
0 #
123
A
B
C
D
D
7
1
4
D
6
1
3
D
5
1
2
D
4
1
1
D
3
1
0
D
2
9
D
1
8
D
0
7
E
6
R
W
5
R
S
4
V
S
S
1
V
D
D
2
V
E
E
3
LCD2
LM016L
64
Compilador C para PIC
Ejemplo: TECLADO/DISPLAY
RA0/AN0
2
RA1/AN1
3
RA2/AN2/VREF-
4
RA4/T0CKI
6
RA5/AN4/SS
7
OSC1/CLKIN
9
OSC2/CLKOUT
10
RC1/T1OSI/CCP2
12
RC2/CCP1
13
RC3/SCK/SCL
14
RB7/PGD
28
RB6/PGC
27
RB5
26
RB4
25
RB3/PGM
24
RB2
23
RB1
22
RB0/INT
21
RC7/RX/DT
18
RC6/TX/CK
17
RC5/SDO
16
RC4/SDI/SDA
15
RA3/AN3/VREF+
5
RC0/T1OSO/T1CKI
11
MCLR/Vpp/THV
1
U1
PIC16F876
1 2 3
4 5 6
7 8 9
0 #
123
A
B
C
D
D
7
1
4
D
6
1
3
D
5
1
2
D
4
1
1
D
3
1
0
D
2
9
D
1
8
D
0
7
E
6
R
W
5
R
S
4
V
S
S
1
V
D
D
2
V
E
E
3
LCD2
LM016L
65
Compilador C para PIC
Ejemplo: TECLADO/DISPLAY
COMPILAR (F9)
MONTARLO
66
Compilador C para PIC
Ejemplo: TECLADO/DISPLAY
67
Compilador C para PIC
Ejemplo: INTERRUPCIONES
Las directivas #INT_xxxx. Indican que la funcin que aparece a continuacin
corresponde al tratamiento de una interrupcin (no tiene ni necesita
parmetros).
En el caso de los PIC 16F87x hay 14 posibles directivas.

#INT_RTCC Desbordamiento de TMR0. (T0IF)
#INT_RB Cambio en los pines RB<4:7>. (RBIF)
#INT_EXT Flanco en pin RB0. (INTF)
#INT_AD Fin de conversin A/D. (ADIF)
#INT_TBE Buffer de transmisin USART vaco. (TXIF)
#INT_RDA Dato recibido en USART. (RCIF)
#INT_TIMER1 Desbordamiento de TMR1. (TMR1IF)
#INT_TIMER2 Desbordamiento de TMR2. (TMR2IF)
#INT_CCP1 Captura / Comparacin en mdulo CCP1. (CCP1IF)
#INT_CCP2 Captura / Comparacin en mdulo CCP2. (CCP2IF)
#INT_SSP Envo / Recepcin de dato serie sncrono. (SSPIF)
#INT_BUSCOL Colisin de bus I2C. (BCLIF)
#INT_EEPROM Escritura completa en EEPROM de datos. (EEIF)
68
Compilador C para PIC
Ejemplo: INTERRUPCIONES

La directiva #INT_DEFAULT. Indica que la funcin que viene a continuacin
ser llamada si se dispara una interrupcin y ninguno de los flags est activo.


La directiva #INT_GLOBAL. Indica que la funcin que va a continuacin
sustituye todas las acciones que inserta el compilador al aceptarse una
interrupcin. Slo se ejecuta lo que vaya en dicha funcin.

Ventajas de usar las directivas de interrupciones

El compilador genera el cdigo necesario para saltar a la funcin que va tras
esta directiva en el momento de la interrupcin.

Tambin genera cdigo para salvar al principio y restituir al final el contexto, y
borrar el flag que se activ con la interrupcin.

El programador debe seguir encargndose de habilitar las interrupciones.
69
Compilador C para PIC
Ejemplo: INTERRUPCIONES
Funciones para gestin de interrupciones. El compilador C de CCS incluye
algunas funciones integradas destinadas a manejar interrupciones.

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.

70
Compilador C para PIC
Ejemplo: INTERRUPCIONES
Existe tambin una funcin adicional destinada a configurar el flanco activo que
genera la interrupcin externa (en RB0).

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.

71
Compilador C para PIC
Ejemplo: INTERRUPCIONES_RB0

RA0/AN0
2
RA1/AN1
3
RA2/AN2/VREF-
4
RA4/T0CKI
6
RA5/AN4/SS
7
OSC1/CLKIN
9
OSC2/CLKOUT
10
RC1/T1OSI/CCP2
12
RC2/CCP1
13
RC3/SCK/SCL
14
RB7/PGD
28
RB6/PGC
27
RB5
26
RB4
25
RB3/PGM
24
RB2
23
RB1
22
RB0/INT
21
RC7/RX/DT
18
RC6/TX/CK
17
RC5/SDO
16
RC4/SDI/SDA
15
RA3/AN3/VREF+
5
RC0/T1OSO/T1CKI
11
MCLR/Vpp/THV
1
U1
PIC16F876
R1
180
D1
LED-GREEN
SW1
SW-SPDT-MOM
COMPILAR (F9)
MONTARLO
72
Compilador C para PIC
Ejemplo: TIMER0
TMR0 / WDT en el compilador C de CCS
Configuracin del mdulo TMR0.
setup_timer_0 (modo);
modo: RTCC_INTERNAL (OPTION_REG 00h)
RTCC_EXT_L_TO_H (OPTION_REG 20h)
RTCC_EXT_H_TO_L (OPTION_REG 30h)
RTCC_DIV_2 (OPTION_REG 00h)
RTCC_DIV_4 (OPTION_REG 01h)
RTCC_DIV_8 (OPTION_REG 02h)
RTCC_DIV_16 (OPTION_REG 03h)
RTCC_DIV_32 (OPTION_REG 04h)
RTCC_DIV_64 (OPTION_REG 05h)
RTCC_DIV_128 (OPTION_REG 06h)
RTCC_DIV_256 (OPTION_REG 07h)
Se pueden agrupar constantes de distintos grupos con |.

73
Compilador C para PIC
Ejemplo: TIMER0
Configuracin del mdulo WDT.
setup_wdt (modo);

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)

Para que el temporizador WATCHDOG pueda llevar a cabo su misin es
necesario indicarlo as con la directiva #fuses.
#fuses [opciones], WDT [opciones] WDT activado
#fuses [opciones], NOWDT [opciones] WDTdesactivado


74
Compilador C para PIC
Ejemplo: TIMER0
Configuracin de los mdulos TMR0 y WDT (obsoleto).
Funciones implementadas en el compilador por compatibilidad con versiones
anteriores. No se recomienda su uso.
setup_counters (rtcc , prescaler);
rtcc: RTCC_INTERNAL (OPTION_REG 00h)
RTCC_EXT_L_TO_H (OPTION_REG 20h)
RTCC_EXT_H_TO_L (OPTION_REG 30h)
prescaler: RTCC_DIV_2 (OPTION_REG 00h)
... ...
RTCC_DIV_256 (OPTION_REG 07h)
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)


75
Compilador C para PIC
Ejemplo: TIMER0

Escritura en el mdulo TMR0.
set_timer0 (valor);
valor: Entero de 8 bits. (TMR0 valor)

Lectura del mdulo TMR0.
valor = get_timer0 ();
valor: Entero de 8 bits. (valor TMR0)

Puesta a cero del Watchdog.
restart_wdt ();
No precisa ningn parmetro. (equivale a CLRWDT)


76
Compilador C para PIC
Ejemplo: TIMER0

#INCLUDE <16F876.h>
#use delay(clock=4000000)
#fuses XT,NOWDT
#use standard_io(B)

int1 var0=0; //variable de cambio

#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
}




Generar una seal cuadrada de
1KHz utilizando la interrupcin
del Timer0. Con un semiperiodo
de 500us

500us=4/Fosc(256-x)
X = 6
Con Fosc=4MHz y preescaler 1:2

77
Compilador C para PIC
Ejemplo: TIMER0




Para ajustar el tiempo se carga
el timer0 con 29 (0x1D).
Esto es debido a la generacin
de cdigo ensamblador por
parte del compilador.

78
Compilador C para PIC
Ejemplo: TIMER1
Registro T1CON (10h)



bits 5-4 T1CKPS1:T1CKPS0: Seleccin del prescaler
00: Prescaler1:1. 10: Prescaler1:4.
01: Prescaler1:2. 11: Prescaler1:8.
bit 3 T1OSCEN: Habilitacin del oscilador de TMR1
0: Apagado 1: Habilitado
bit 1 TMR1CS: Reloj de TMR1
0: Reloj interno (fOSC/4). 1: Reloj externo ( en RC0).
bit 2 T1SYNC: Control de la sincronizacin con el reloj externo
Slo si TMR1CS=1
0: Sincronizar 1: No sincronizar
bit 0 TMR1ON: Bit de encendido de TMR1
0: TMR1 apagado. 1: TMR1 encendido.


79
Compilador C para PIC
Ejemplo: TIMER1
TMR1 en el compilador C de CCS

Configuracin del mdulo TMR1.
setup_timer_1 (modo);
modo: T1_DISABLED (T1CON 00h)
T1_INTERNAL (T1CON 85h)
T1_EXTERNAL (T1CON 87h)
T1_EXTERNAL_SYNC (T1CON 83h)
T1_CLK_OUT (T1CON 08h)
T1_DIV_BY_1 (T1CON 00h)
T1_DIV_BY_2 (T1CON 10h)
T1_DIV_BY_4 (T1CON 20h)
T1_DIV_BY_8 (T1CON 30h)
Se pueden agrupar constantes de distintos grupos con |.

Lectura / Escritura en el mdulo TMR1.
valor = get_timer1 (); set_timer1 (valor);
valor: Entero de 16 bits.


80
Compilador C para PIC
Ejemplo: TIMER1

#include <16f876.h>
#fuses XT,NOWDT
#use delay(clock=4000000)
#use standard_io(b)


temp1s()
{
int cont=0;

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();
}
}



Configurar el mdulo TMR1 para
generar una temporizacin de 1s.
(dos de 0,5)

0.5=4/Fosc(65536-x)P
X = 3036
Con Fosc=4MHz y preescaler 1:8


81
Compilador C para PIC
Ejemplo: TIMER2

Registro T2CON (12h)


bits 6-3 TOUTPS3:TOUTPS0: Seleccin del postscaler
0000: Postscaler1:1
0001: Postscaler1:2
0010: Postscaler1:3
.....
1111: Postscaler1:16

bit 2 TMR2ON: Bit de encendido de TMR2
0: Apagado 1: Habilitado

bits 1:0 T2CKPS1:T2CKPS0: Seleccin del prescaler
00: Prescaler1
01: Prescaler4
1x: Prescaler16




82
Compilador C para PIC
Ejemplo: TIMER2

TMR2 en el compilador C de CCS
Configuracin del mdulo TMR2.
setup_timer_2 (modo,periodo,postscaler);
modo: T2_DISABLED (T2CON 00h)
T2_DIV_BY_1 (T2CON 04h)
T2_DIV_BY_4 (T2CON 05h)
T2_DIV_BY_16 (T2CON 06h)
periodo: Entero de 8 bits (0-255) que se pasa al registro PR2.
postscaler: Valor del postscaler (1-16).

Lectura / Escritura en el mdulo TMR2.
valor = get_timer2 (); set_timer2 (valor);
valor: Entero de 8 bits.




83
Compilador C para PIC
Ejemplo: TIMER2


INCLUDE <16F876.h>
#use delay(clock=4000000)
#fuses XT,NOWDT
#use standard_io(B)

int1 var0=0; //variable de cambio
#int_TIMER2
void TIMER2_isr(void) { //Funcin Interrupcin
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 (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
}




Generar una seal cuadrada de 1KHz
utilizando la interrupcin del Timer2.

Temp=[Prescaler(PR2+1)Postscaler]Tinstr

500us=(4/4000000)[4 (X+1) 1]
x = 125
Con Fosc=4MHz
preescaler 4
postscaler 1
84

Compilador C para PIC
Ejemplo: TIMER2




Para ajustar el tiempo se carga
el timer2 con 124 (0x7C).
Esto es debido a la generacin
de cdigo ensamblador por
parte del compilador.

85
Compilador C para PIC
Ejemplo: INTERRUPCIONES_TIMER

RA0/AN0
2
RA1/AN1
3
RA2/AN2/VREF-
4
RA4/T0CKI
6
RA5/AN4/SS
7
OSC1/CLKIN
9
OSC2/CLKOUT
10
RC1/T1OSI/CCP2
12
RC2/CCP1
13
RC3/SCK/SCL
14
RB7/PGD
28
RB6/PGC
27
RB5
26
RB4
25
RB3/PGM
24
RB2
23
RB1
22
RB0/INT
21
RC7/RX/DT
18
RC6/TX/CK
17
RC5/SDO
16
RC4/SDI/SDA
15
RA3/AN3/VREF+
5
RC0/T1OSO/T1CKI
11
MCLR/Vpp/THV
1
U1
PIC16F876
R1
180
D1
LED-GREEN
R2
180
D2
LED-GREEN
R3
180
D3
LED-GREEN
COMPILAR (F9)
MONTARLO
86
Compilador C para PIC
Ejemplo: INTERRUPCIONES_TIMER

Medir el ancho de un pulso mediante el TIMER1 y la Interrupcin Externa por
RB0.

El TIMER1 es un contador de 16 bits que se incrementa cada 4 ciclos de
Reloj (FOSC *4). A este tiempo le vamos a llamar PASO de TIMER1. Si el
cristal de cuarzo es de 4 Mhz, entonces 1s se produce un PASO de TIMER1.

Un ciclo completo del TIMER1, desde 0x0000 hasta 0xFFFF (65536 pasos),
ocupa un tiempo total de 1s * 65.536 = 65,536ms.

Podemos fijar un tipo de flanco a detectar y escribir un cierto cdigo para
ejecutarlo cuando ese tipo de flanco, subida o bajada, es detectado. este
cdigo escrito para tratar la interrupcin externa por RB0 podemos
mantener o cambiar el flanco a detectar, cambindolo del de Subida al de
Bajada o viceversa y leer o escribir el valor de TIMER1 que en ese momento
tiene el contador.

87
Compilador C para PIC
Ejemplo: INTERRUPCIONES_TIMER

1. Se configura la INTEXT por RB0 para detectar inicialmente el Flanco de
Subida.

2. Al llegarnos este Flanco de Subida se guarda el valor en ese momento de
TIMER1.

3. Se cambia la configuracin de la INTEXT por RB0 para detectar el siguiente
Flanco de Bajada.

4. Cuando llegue el Flanco de Bajada se guarda de nuevo el valor de TIMER1.

5. Se vuelve a configurar la INTEXT por RB0 para detectar de nuevo un Flanco de
Subida.

6. Con estos dos valores de TIMER1 se obtiene, expresados en PASOS de
TIMER1, restando el segundo del primero, el tiempo que ha permanecido en
alto el Pulso. Multiplicando dicho nmero de PASOS de TIMER1 por el tiempo
que dura cada PASO (dependiente del cristal) se obtiene el Tiempo W.

7. El ancho de pulso mximo es de 65,536ms (un ciclo de TIMER1). El mnimo
depender del tiempo que tarda en programa en gestionar la interrupcin y
los clculos.

88
Compilador C para PIC
Ejemplo: INTERRUPCIONES_TIMER

Modificar el fichero LCD.C para trabajar con el LCD en el puerto C (guardarlo como
LCD_MIO.C)
RA0/AN0
2
RA1/AN1
3
RA2/AN2/VREF-
4
RA4/T0CKI
6
RA5/AN4/SS
7
OSC1/CLKIN
9
OSC2/CLKOUT
10
RC1/T1OSI/CCP2
12
RC2/CCP1
13
RC3/SCK/SCL
14
RB7/PGD
28
RB6/PGC
27
RB5
26
RB4
25
RB3/PGM
24
RB2
23
RB1
22
RB0/INT
21
RC7/RX/DT
18
RC6/TX/CK
17
RC5/SDO
16
RC4/SDI/SDA
15
RA3/AN3/VREF+
5
RC0/T1OSO/T1CKI
11
MCLR/Vpp/THV
1
U1
PIC16F876
D
7
1
4
D
6
1
3
D
5
1
2
D
4
1
1
D
3
1
0
D
2
9
D
1
8
D
0
7
E
6
R
W
5
R
S
4
V
S
S
1
V
D
D
2
V
E
E
3
LCD2
LM016L
U1(RB0/INT)
89
Compilador C para PIC
Ejemplo: INTERRUPCIONES_TIMER

90
Compilador C para PIC
Ejemplo: INTERRUPCIONES_TIMER

COMPILAR (F9)
MONTARLO
91
Compilador C para PIC
Ejemplo: EEPROM INTERNA

Simularlo con el
ISIS y leer la
EEPROM con el
DEBUG
RA0/AN0
2
RA1/AN1
3
RA2/AN2/VREF-
4
RA4/T0CKI
6
RA5/AN4/SS
7
OSC1/CLKIN
9
OSC2/CLKOUT
10
RC1/T1OSI/CCP2
12
RC2/CCP1
13
RC3/SCK/SCL
14
RB7/PGD
28
RB6/PGC
27
RB5
26
RB4
25
RB3/PGM
24
RB2
23
RB1
22
RB0/INT
21
RC7/RX/DT
18
RC6/TX/CK
17
RC5/SDO
16
RC4/SDI/SDA
15
RA3/AN3/VREF+
5
RC0/T1OSO/T1CKI
11
MCLR/Vpp/THV
1
U1
PIC16F876
D
7
1
4
D
6
1
3
D
5
1
2
D
4
1
1
D
3
1
0
D
2
9
D
1
8
D
0
7
E
6
R
W
5
R
S
4
V
S
S
1
V
D
D
2
V
E
E
3
LCD2
LM016L

Vous aimerez peut-être aussi