View
24
Download
0
Category
Preview:
Citation preview
5/28/2018 Curso de Programacion en C
1/130
CURSO DE PROGRAMACICURSO DE PROGRAMACIN EN C PARAN EN C PARAMICROCONTROLADORES PIC 16F87XXMICROCONTROLADORES PIC 16F87XX
JULIO 200404FP27CF153
5/28/2018 Curso de Programacion en C
2/130
CONTENIDOSCONTENIDOS
1.1. IDESIDES
2.2. BOOTLOADERBOOTLOADER
3.3. PLATAFORMAS DESARROLLO DEPLATAFORMAS DESARROLLO DEPROYECTOSPROYECTOS
4.4. RECORDATORIO DE CRECORDATORIO DE C
........................
5/28/2018 Curso de Programacion en C
3/130
CONTENIDOS
5.5. PROGRAMACIPROGRAMACIN EN C DE LOSN EN C DE LOSMMDULOS DEL PIC16F8XX.DULOS DEL PIC16F8XX.
ENTRADA/SALIDA DIGITAL.ENTRADA/SALIDA DIGITAL. COMUNICACIONES RS232.COMUNICACIONES RS232.
INTERRUPCIONES.INTERRUPCIONES.
CONVERTIDOR A/D.CONVERTIDOR A/D.
CCP (PWM).CCP (PWM).
5/28/2018 Curso de Programacion en C
4/130
CURSO DE PROGRAMACICURSO DE PROGRAMACIN EN CN EN CPARA MICROCONTROLADORES PICPARA MICROCONTROLADORES PIC
16F87XX16F87XX
1. IDES1. IDES
5/28/2018 Curso de Programacion en C
5/130
MPLAB DE MICROCHIPMPLAB DE MICROCHIP
Se integra deformaautomtica, al instalar el
compilador PCW.
En versiones anterioresejecutando el comando:
Cscs+setup.
5/28/2018 Curso de Programacion en C
6/130
PCWPCW
Entorno propio de lacasa CCS, que nos
permite la edicin y lacompilacin.
Incorpora dentro de labarra de mens laopcin Tools.
5/28/2018 Curso de Programacion en C
7/130
CURSO DE PROGRAMACICURSO DE PROGRAMACIN EN CN EN CPARA MICROCONTROLADORES PICPARA MICROCONTROLADORES PIC
16F87XX16F87XX
2 .BOOTLOADER2 .BOOTLOADER
5/28/2018 Curso de Programacion en C
8/130
INTRODUCCIINTRODUCCINN
Se trata de la construccin de un sistema dedesarrollo de aplicaciones para el PIC16F876
sencillo, barato, rpido y eficaz. Programacin del microcontrolador mediante
el puerto serie, sin necesidad de sacar elmicrocontrolador de la placa de CI (program
in circuit).
5/28/2018 Curso de Programacion en C
9/130
INTRODUCCIINTRODUCCINN
Para que esto sea posible, deberemos programar el
uCpor primera y nica vezcon un cdigo dearranque llamadoBOOTLOADER
Con la ayuda del software de comunicacionesPICDOWNLOADER, cargaremos los programas en elPIC a travs del puerto serie del PC.
5/28/2018 Curso de Programacion en C
10/130
Fuente de informacin
www.microchipc.comwww.microchipc.com
5/28/2018 Curso de Programacion en C
11/130
www.microchipc.com
5/28/2018 Curso de Programacion en C
12/130
DESCOMPRIMIR BOOTLOADERDESCOMPRIMIR BOOTLOADER
Descomprimir el archivoy nos crea una carpetaPIC bootloadercon lossiguientes archivos
5/28/2018 Curso de Programacion en C
13/130
SELECCIONAR EL ADECUADOSELECCIONAR EL ADECUADO
De todos los ficherosque nos aparecen en lacarpeta, cul de ellosdebo grabar en el PIC?.
5/28/2018 Curso de Programacion en C
14/130
UN EJEMPLOUN EJEMPLO
Observemos uno de losObservemos uno de los ficherosficheros: se puede comprobarque adems de un nmero de referencia (63619), el
nombre del programa y la versin (bootldr-v25), aparecenel tipo de micro que utilizaremos (16F876-16F877), lafrecuencia del cristal de cuarzo (3.6864Mhz) y lavelocidad de comunicacin entre PC y micro (19200bps).
63619-bootldr-v25-16F876-77-03.6864Mhz-19200bps.hex
5/28/2018 Curso de Programacion en C
15/130
PICdownloadePICdownloade
La aplicacin PICdownloader,
que ser la encargada deestablecer la comunicacin entreel PC y la Tarjeta, transfiriendo losficheros .hex de nuestrasaplicaciones.
5/28/2018 Curso de Programacion en C
16/130
CARGA DEL fichero .CARGA DEL fichero .hexhexen el PICen el PIC
Ejecutar desde windows elprogramaPICdownloaderPICdownloader . El fichero que queremos transferir
FILE:...hex, El puerto del PC donde hemos
colocado el cable serie decomunicacin
Seleccionar la velocidad en baudios Pulsar write, el programa
comenzar a busca el bootloader
Resetear el PIC y el programabootloader se activar transcurridos0.2 segundos despus del reset
Cerrar el programa PICdownloader.
5/28/2018 Curso de Programacion en C
17/130
PICdownloaderPICdownloader& PCW& PCW
Si hemos optado por
utilizar como entorno dedesarrollo el programaPCW.EXE, es posibleconfigurar el programapara llamar alPICdownloaderdesde
la opcin Tools-Program Chip.
5/28/2018 Curso de Programacion en C
18/130
CURSO DE PROGRAMACICURSO DE PROGRAMACIN EN CN EN CPARA MICROCONTROLADORES PICPARA MICROCONTROLADORES PIC16F87XX16F87XX
3.3.PLATAFORMAS DESARROLLOPLATAFORMAS DESARROLLODE PROYECTOSDE PROYECTOS
5/28/2018 Curso de Programacion en C
19/130
SISTEMAS DISPOIBLESSISTEMAS DISPOIBLES
MicroPIC Trainer.
Software de simulacinIsis de Proteus.
PICKey.
5/28/2018 Curso de Programacion en C
20/130
MicroPICMicroPICTrainerTrainer
5/28/2018 Curso de Programacion en C
21/130
ISIS DE PROTEUS
5/28/2018 Curso de Programacion en C
22/130
PICKey
5/28/2018 Curso de Programacion en C
23/130
CURSO DE PROGRAMACICURSO DE PROGRAMACIN EN CN EN CPARA MICROCONTROLADORES PICPARA MICROCONTROLADORES PIC16F87XX16F87XX
4.4.RECORDATORIO DE CRECORDATORIO DE C
5/28/2018 Curso de Programacion en C
24/130
#DIRECTIVAS DEL PREPROCESADOR//DECLARACIN DE PROTOTIPOS DE FUNCIONES
//DECLARACIN DE VARIABLES GLOBALES
// PROGRAMA PRINCIPALmain(){
variables locales;bloque de sentencias;llamadas a las funciones;
}// DEFINICIN DE FUNCIONESfuncion_1(){variables locales a funcion_1;bloque de sentencias;llamada a otra/s funciones;
}
funcion_n(){}
5/28/2018 Curso de Programacion en C
25/130
#include
#use delay(clock=4000000,RESTART_WDT)
#byte port_b=6
#org 0x1F00, 0x1FFF {}//para proteger el cdigomain(){port_b=1;set_tris_b(0x00); // todo el puerto B como salida
while(1){if(input(PIN_A0))
rotate_left(&port_b,1);else
rotate_right(&port_b,1);delay_ms(100);
}}
5/28/2018 Curso de Programacion en C
26/130
EXPRESIONES DE ASIGNACIN
Una expresin de asignacin tradicional es dela forma expr1 = expr1 operador expr2, es
decir, i = i + 5. Esta expresin se puederepresentar por otra forma ms corta:
expr1 operador= expr2;expr1 operador= expr2;
siguiendo con el mismo ejemplo i += 5
5/28/2018 Curso de Programacion en C
27/130
OPERADORES DE ASIGNACIOPERADORES DE ASIGNACINNOperador Descripcin+= Asignacin de suma-= Asignacin de resta
*= Asignacin de multiplicacin/= Asignacin de divisin%= Asignacin de resto de divisin= Asignacin de desplazamiento a la derecha&= Asignacin de AND de bits
|= Asignacin de OR de bits^= Asignacin de OR exclusivo de bits~= Asignacin de negacin de bits
5/28/2018 Curso de Programacion en C
28/130
OPERADORES ARITMETICOSOPERADORES ARITMETICOS
OperadorOperador DescripciDescripcinn EjemplEjemploo
+ Suma (enteros o reales) resul = var1 + var2
- Resta (enteros o reales) resul = var1 - var2
* Multiplicacin (enteros o reales) resul = var1 * var2/ Divisin (enteros o reales) resul = var1 / var2
- Cambio de signo en enteros o reales -var1
% Mdulo; rango = n [A1]% 256
5/28/2018 Curso de Programacion en C
29/130
OPERADORES RELACIONALESOPERADORES RELACIONALES
Su misin es comparar dos operandos y dar
un resultado entero: 1 (verdadero);
0 (falso).
5/28/2018 Curso de Programacion en C
30/130
OPERADORES RELACIONALESOPERADORES RELACIONALES
OperadorOperador DescripciDescripcinn
< Menor que
> Mayor que= Mayor o igual que
== Igual a
!= Distinto de
5/28/2018 Curso de Programacion en C
31/130
OPERADORES LOPERADORES LGICOSGICOS
Al igual que los operadores relacionales, stosdevuelven 1 (verdadero), 0 (falso) tras la
evaluacin de sus operandos.
5/28/2018 Curso de Programacion en C
32/130
OPERADORES LOPERADORES LGICOSGICOS
Operador Descripcin
! No lgico (NOT)
&& Y lgico (AND)
|| O lgico (OR)
5/28/2018 Curso de Programacion en C
33/130
OPERADORES DE MANEJO DE BITSOPERADORES DE MANEJO DE BITS
Estos operadores permiten actuar sobre losoperandos a nivel de bits y slo pueden ser de
tipo entero (incluyendo el tipo char)
5/28/2018 Curso de Programacion en C
34/130
OPERADORES DE MANEJO DE BITSOPERADORES DE MANEJO DE BITS
Operador Descripcin
~ Negacin de bits (complemento a 1)
& Y de bits (AND)
^ O exclusivo de bits (EXOR)
| O de bits (OR)
5/28/2018 Curso de Programacion en C
35/130
Operadores de incremento y decrementoOperadores de incremento y decremento
Su comportamiento se asemeja a lasinstrucciones de incremento incf f,d del
ensamblador del controlador PIC 16f8XX oinc variable del Intel 8051.
5/28/2018 Curso de Programacion en C
36/130
Operadores de incremento y decrementoOperadores de incremento y decremento
OPERADOR DESCRIPCIN
++ Incremento
-- Decremento
5/28/2018 Curso de Programacion en C
37/130
Operadores de desplazamiento de bitsOperadores de desplazamiento de bits
Estos operadores utilizan dos operandosenteros (tipo int): el primero es el elemento a
desplazar y el segundo, el nmero deposiciones de bits que se desplaza.
5/28/2018 Curso de Programacion en C
38/130
Operadores de desplazamiento de bitsOperadores de desplazamiento de bits
OPERADOR DESCRIPCIN
>> Desplazamiento a la derecha
5/28/2018 Curso de Programacion en C
39/130
Operadores de direccin & e indireccin *
Los operadores & y * se utilizan para trabajarcon punteros . El lenguaje C est muy
influenciado por el uso de punteros. Unpuntero es una variable que contiene ladireccin de una variable o de una funcin, esdecir, es una variable que apunta a otra
variable. Los punteros permiten lamanipulacin indirecta de datos y cdigos
5/28/2018 Curso de Programacion en C
40/130
Operadores de direccin & e indireccin *
OPERADOR DESCRIPCIN
& De direccin
* De indireccin
5/28/2018 Curso de Programacion en C
41/130
EXPRESIONESEXPRESIONESCONSTANTESCONSTANTES
5/28/2018 Curso de Programacion en C
42/130
IDENTIFICADORES
5/28/2018 Curso de Programacion en C
43/130
Expresiones en orden descendente de precedenciaExpresiones en orden descendente de precedencia
5/28/2018 Curso de Programacion en C
44/130
SINTAXIS DE DEFINICISINTAXIS DE DEFINICIN DE DATOSN DE DATOS
La sintaxis utilizada para la definicin de losdatos y las funciones es la misma que la
empleada en la programacin con ANSII C
5/28/2018 Curso de Programacion en C
45/130
TIPOS ESTANDAR EN Cunsigneddefine un nmero de 8 bits sin signounsigned intdefine un nmero de 8 bits sin signointdefine un nmero de 8 bits sin signo
chardefine un nmero de 8 bits sin signolongdefine un nmero de 16 bits sin signolong intdefine un nmero de 16 bits sin signosigneddefine un nmero de 8 bits con signosigned intdefine un nmero de 8 bits con signo
signed longdefine un nmero de 16 bits con signofloatdefine un nmero de 32 bits en punto flotanteshortdefine un bitshort intdefine un bit
5/28/2018 Curso de Programacion en C
46/130
DIFERENCIA DEL ANSII C
La nica diferencia a la hora de declarar variables esla aparicin de variables de tipo BOLEAN, de un bit,cuando necesitamos utilizar este tipo de variables en
nuestros programas deberemos utilizar un tipo noestandar que se denomina SHORT. Es un tipoespecial utilizado para generar cdigo muy eficientepara las operaciones de manejo de bit en I/O. No sepermiten las arrays de SHORT ni los punteros aSHORT. La siguiente tabla muestra la sintaxis para lasdeclaraciones de datos.
5/28/2018 Curso de Programacion en C
47/130
SENTENCIAS DE C.,
5/28/2018 Curso de Programacion en C
48/130
SENTENCIA SIMPLE
expr;
EJEMPLO
i=1;
5/28/2018 Curso de Programacion en C
49/130
SENTENCIA COMPUESTA
{
SENTENCIA 1;
SENTENCIA 2;....................
SENTENCIA N;
}
5/28/2018 Curso de Programacion en C
50/130
if elseif (expr) stmt1;
[else stmt2;]
EJEMPLO
if (x==25) x=1;
else x=x+1;
EXPR
STMT1
STTM2
SI
NO
5/28/2018 Curso de Programacion en C
51/130
whilewhile (expr)
stmt;
EJEMPLO
while (get_rtcc()!=0)putc('n');
EXPR STMTSI
NO
5/28/2018 Curso de Programacion en C
52/130
do whiledo stmt while (expr);
EJEMPLO
do
{
putc(c=getc());
} while (c!=0);
EXPR
STMT
SI
NO
5/28/2018 Curso de Programacion en C
53/130
forfor(expr1;expr2;expr3)
stmt;
EJEMPLO
for (i=1;i
5/28/2018 Curso de Programacion en C
54/130
switchswitch (expr)
{
case exp1: stmt1;
case exp2:stmt2;
case exp3:stm2; .
.
case cexpre:stmn;
[default:stmt;]
}
expr
stmt1 stmt2 stmt3 stmtn
case exp1 case exp2 default
stmt
case expncase exp3
5/28/2018 Curso de Programacion en C
55/130
switchswitch (cmd)
{ case 0: printf("cmd 0");
break;case 1: printf("cmd 1");
break;
default: printf(comando no vlido");
break;
}
5/28/2018 Curso de Programacion en C
56/130
returnreturn [expr];
return (5);
5/28/2018 Curso de Programacion en C
57/130
gotogoto label; goto loop;
EJEMPLO
label: stmt; loop: i++;
5/28/2018 Curso de Programacion en C
58/130
breakbreak;
El comandobreakse puede utilizar con los tres
formatos de bucle yswitch. Cuando el programaalcanza unbreak, se deja sin ejecutar el resto delbucle y se transfiere el control a la sentenciainmediatamente posterior a dicho bucle.
EJEMPLObreak;
5/28/2018 Curso de Programacion en C
59/130
continuecontinue; El comandocontinuese puede emplear con
cualquiera de los tres bucles, pero no conswitch. Aligual que antes el programa no ejecuta las sentenciasrestantes del bucle donde se encuentra. En buclesforo whilese comienza a ejecutar el siguiente ciclo delbucle. Endo Whilese comprueba la condicin desalida; si se cumple, se comienza el nuevo ciclo.
EJEMPLOcontinue;
5/28/2018 Curso de Programacion en C
60/130
DefiniciDefinicin de funcin de funcinn
El formato de la definicin de una funcin es como sigue:
[calificador_tipo] identificador ([especificador_tipo identificador]){
[cuerpo de la funcin]
}
5/28/2018 Curso de Programacion en C
61/130
DefiniciDefinicin de funcin de funcinn
El calificador_tipo para una funcin puedenser:
void o unespecificador de tipo (vase la lista
anterior de tipos)
5/28/2018 Curso de Programacion en C
62/130
CURSO DE PROGRAMACICURSO DE PROGRAMACIN EN CN EN CPARA MICROCONTROLADORES PICPARA MICROCONTROLADORES PIC16F87XX16F87XX
5.5. PROGRAMACIPROGRAMACIN EN C DE LOSN EN C DE LOSMMDULOS DEL PIC16F8XX.DULOS DEL PIC16F8XX.
ENTRADA/SALIDA DIGITAL.ENTRADA/SALIDA DIGITAL.
5/28/2018 Curso de Programacion en C
63/130
EELLPUERTOAPUERTOA Es un puerto bidireccional de 6
bits, cuyo registro deconfiguracin correspondiente esel TRISA, colocando a 1 el bit
correspondiente configuramos elpin como salida y a 0 comoentrada.
El pin RA4 es una entrada del tipoTrigger Schmitt y una salida enmodo colector abierto. El resto de
pines son todos compatibles conTTL
5/28/2018 Curso de Programacion en C
64/130
EELLPUERTOBPUERTOB Es un puerto bidireccional de 8 bits,
cuyo registro de configuracincorresponde con el TRISB, y seconfigura de la misma forma que el
puerto A. Cada uno de los pins tiene laposibilidad de programarinternamente una resistencia de Pull-up.
Cuatro de los pines del PORTB,RB7:RB4, tienen la propiedad de
provocar una interrupcin cuando sedetecta un cambio de nivel en algunade esos pines.
5/28/2018 Curso de Programacion en C
65/130
EELLPUERTOCPUERTOC Es un puerto bidireccional de 8
bits, cuyo registro deconfiguracin corresponde con
el TRISC, y se configura de lamisma forma que el puerto B.
El puerto C esta multiplexadocon una serie de funciones delos perifricos internos. Lospines de puerto C son del tipo
Trigger Schmitt cuando seconfiguran como entrada.
5/28/2018 Curso de Programacion en C
66/130
DIRECTIVAS DELPREPROCESADOR
5/28/2018 Curso de Programacion en C
67/130
5/28/2018 Curso de Programacion en C
68/130
DIRECTIVAS DEL PREPROCESADORDIRECTIVAS DEL PREPROCESADOR
Para comenzar describiremos lasdirectivasdel preprocesador,que como sabemos son
ordenes dirigidas al compilador y que noaadirn cdigo a nuestros programas.
Por lo general facilitan la programacin y caside forma obligatoria debern aparecer en
todos nuestros cdigos fuentes
5/28/2018 Curso de Programacion en C
69/130
#include#include Esta directiva hace que el compilador incluya en
nuestro fichero fuente el texto que contiene el archivoespecificado en . Deberemos utilizarlasiempre que queramos incorporar los ficheros decabecera que contienen las definiciones de todos losregistros internos del microcontrolador que utilicemosen nuestro proyecto, como por ejemplo:
#include
5/28/2018 Curso de Programacion en C
70/130
#byte#byteidentificador=xidentificador=x
#bit#bitidentificador=x.yidentificador=x.y Estas directivas crearn identificadores que podremos
utilizar en nuestro cdigo fuente como cualquier enterode 8 bits (byte) o entero corto de 1 bit.
El identificador referencia a un objeto en la posicin dememoria x e y su desplazamiento, x puede ser unaconstante u otro identificador.
#byte puertob=6
#bit alarma=5.0
5/28/2018 Curso de Programacion en C
71/130
#device chip options#device chip options
Donde chip es el nombre del procesador(PIC16F876, PIC16F84,etc) y options son
modificadores estndar del dispositivo. En todos los cdigos fuente deberemos
encontrar una directiva como sta indicandopara que microcontrolador es el cdigo.
5/28/2018 Curso de Programacion en C
72/130
#define id texto#define id texto
donde id es un identificador del preprocesadory texto es cualquier texto. Esta directiva se
utiliza simplemente para reemplazar elidentificador id con el texto.
#define rotar(x) (x
5/28/2018 Curso de Programacion en C
73/130
#fuses#fusesoptionsoptions donde options vara dependiendo del dispositivo, de
entre las opciones ms comunes podemos encontrar: LP,XT,HS,RC
WDT,NOWDT PROTECTED, NOPROTECTED, etc...
Esta Directiva define que fusibles deben activarse enel dispositivo cuando se programe. Esta directiva no
afecta a la compilacin, sin embargo, esta informacinse pone en el archivo de salida.
5/28/2018 Curso de Programacion en C
74/130
#org#orgstartstart,,endend Donde start es la primera y end la ltima
direccin ROM de un rea especfica de lamemoria donde queremos que se fije unafuncin o declaracin de constantes.
En nuestro caso utilizaremos esta directiva entodos nuestros programas de la siguienteforma:
#org 0x1FF00, 0x1FFF {}
5/28/2018 Curso de Programacion en C
75/130
#use#usedelay(clockdelay(clock=speed)=speed)
#use delay (clock=#use delay (clock=speed,restart_wdtspeed,restart_wdt))
Dondespeedes una constante que indica en herciosla frecuencia del reloj utilizado con el micro,opcionalmente podemos utilizar la funcin restart_wdt
para que se refresque el WDT durante los procesos deretardo. Utilizaremos esta directiva siempre que queramos usar
las funciones que incorpora la librera de C paragenerar retardos por software y siempre que debamosespecificar la frecuencia de reloj a la que trabajanuestro micro.
5/28/2018 Curso de Programacion en C
76/130
FUNCIONES DE LIBRERA DE C.,
E/S DISCRETA, MANIPULACIN DEBIT/BYTES Y RETARDOS
5/28/2018 Curso de Programacion en C
77/130
E/S DISCRETAE/S DISCRETA
funciones quemanejan unmanejan unbitbit:input(pin):retorna el valor 0 1 del pin indicado.
output_bit(pin,valor):colocar el pin indicado a 0 1.output_high(pin): colocar el pin a estado alto 1.
output_low(pin):colocar el pin a estado bajo 0.
5/28/2018 Curso de Programacion en C
78/130
E/S DISCRETAE/S DISCRETAlas quemanejan un byte:
input_x(): donde x es el nombre del puerto (A, B,...).retorna un int de 8 bits.
output_x(valor):sacar el valor por el puerto X (A,B,....).
Nota : estas funciones aparecen en el manual pero no sonreconocidas por el compilador, si queremos leer o escribir
bytes deberemos utilizar la directiva#byte PUERTO = dir. Puerto
5/28/2018 Curso de Programacion en C
79/130
E/S DISCRETAE/S DISCRETA
Las que configuran los pines:
port_b_pullups(value): activamos o desactivamos
lasRpull-updel puerto B.set_tris_x(valor): permite configurar los puertos X (A,
B,...) para que sus pines sean entradas o salidas. Un 1indica entrada y un 0 salida.
5/28/2018 Curso de Programacion en C
80/130
MANIPULACIMANIPULACIN DE BIT/BYTESN DE BIT/BYTESParamanipular un bitpodemos encontrarnos con:
bit_clear(var,bit):borra el dgito especificado
de la variable. bit_set(var,bit): pone a uno el digito
especificado de la variable.
bit_test(var,bit): retorna el valor del bit de la
variable indicada.
5/28/2018 Curso de Programacion en C
81/130
manipular unmanipular unbytebyterotate_left(address,byte):rotar a la izquierda un
bit de un array o una estructura. El bit MSB
pasa a ser el LSB.rotate_right(address,byte): rotar a la derecha
un bit de un array o una estructura. El bit LSBpasa a ser el MSB.
5/28/2018 Curso de Programacion en C
82/130
manipular unmanipular unbytebyteshift_left(addres,byte,value):desplaza hacia la
izquierda un bit de un array o una estructura. Adiferencia de rotate aqu debemos especificar el valor
(value) con el que queremos que rellene los huecosdesplazados y byte indica el nmero de bytesimplicados.
shift_right(addres,byte,value):desplaza hacia laderecha un bit de un array o una estructura.
swap(value): Intercambia el nible bajo con el nible altodel byte dado. No retorna el resultado, lo deja envalue.
5/28/2018 Curso de Programacion en C
83/130
Funciones para retardo softwareFunciones para retardo software delay_cycles(count): Realiza retardos de
ciclos de instruccin segn el valor indicado encount (1..255). Un ciclo de instruccin es iguala cuatro perodos de reloj.
delay_us(time): realiza retardos del valorespecificado en milcrosegundos (1..65535).Esta funcin no utiliza los timers internos pero
es preciso utilizar la directiva #use delayespecificando la frecuencia del reloj.
5/28/2018 Curso de Programacion en C
84/130
Funciones para retardo softwareFunciones para retardo softwaredelay_ms(time):realiza retardosespecificando el valor en milisegundos
(1..65535). Esta funcin no utiliza los timersinternos pero es preciso utilizar la directiva#use delay especificando la frecuencia del reloj
5/28/2018 Curso de Programacion en C
85/130
RotaciRotacin derecha/izquierda den derecha/izquierda de
diodos LEDdiodos LED.Realizaremos nuestro primerprograma en C, queconsistir en rotar elencendido de un leda
travs de una hilera de 8LEDs conectados al puerto Bdel PIC.Dependiendo de si elpinRA0 del puerto Aest acero, la rotacin de
encendido ser hacia laderecha , y si est a uno,hacia el sentido contrario, esdecir, hacia la izquierda
5/28/2018 Curso de Programacion en C
86/130
PROCEDIMIENTOPROCEDIMIENTO
Llamamos al programapcw.
Editamos el fichero con elcdigo fuente y lo salvamoscomoinout.c
Seleccionamos del men laopcincompile.compile.
Si no hay ningn errortenemos listo el fichero
inout.hexpara cargarlo en elpic.
5/28/2018 Curso de Programacion en C
87/130
Comentemos el programa por partesComentemos el programa por partes
#include
#use delay(clock=4000000,RESTART_WDT)
#byte port_b=6#org 0x1F00, 0x1FFF {}//para proteger el cdigo
//del cargador
5/28/2018 Curso de Programacion en C
88/130
Comentemos el programa por partesComentemos el programa por partes
main(){port_b=1;set_tris_b(0x00); // todo el puerto B como salidawhile(1)
{if(input(PIN_A0))
rotate_left(&port_b,1);else
rotate_right(&port_b,1);delay_ms(100);
}}
5/28/2018 Curso de Programacion en C
89/130
MANEJO DE UN DISPLAY DE 7 SEGMENTOSMANEJO DE UN DISPLAY DE 7 SEGMENTOS
En esta seccin se proponela realizacin de un sencillocontador de 0..9 visualizandola cuenta en un display de 7
segmentos conectado a lapuerta B. Es decir, realizaremos un
contador decimal continuo detal manera que vayamosvisualizando los nmeros atravs de dicho display. Paraello conectaremos el PICsegn se muestra en elesquema.
5/28/2018 Curso de Programacion en C
90/130
#include #use delay(clock=4000000,RESTART_WDT)#byte port_b=6
#org 0x1F00, 0x1FFF {}//para proteger el cdigo del cargadormain(){unsigned int const display[10]={0x3f,0x6,0x5,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f};int x=0;set_tris_b(0x00); // todo el puerto B como salidaport_b=0;for(;;)
{x++;if(x>9) x=0;port_b=display[x];delay_ms(500);
}}
5/28/2018 Curso de Programacion en C
91/130
Kbd.ccontiene dos funciones:kbd_init(): que debe ser llamada antes de utilizar el tecladokbd_getc ( ): que retorna el valor de la tecla pulsada y 0 en
caso de no pulsar ninguna tecla. Esta funcin debe
ser llamada con cierta frecuencia si no queremosperder alguna pulsacin de tecla.
LibrerLibreraakbd.ckbd.c(teclados 3x4)(teclados 3x4)
LibLibrera l dlcd c
5/28/2018 Curso de Programacion en C
92/130
Lcd.ccontiene cuatro funciones:lcd_init() :debe ser llamada antes que ninguna otra
de las tres funciones.lcd_putc(c): Visualiza el carcter c en la siguiente
posicin del LCD.Los siguientes caracteres tienen una funcin especial
\f borrar display\n salto al comienzo de la segunda lnea
\b mueve el cursor una posicin hacia detrs
lcd_gotoxy(x,y): Situa el cursor para escribir en la posicin x, y.La posicin superior izquierda es la 1,1
lcd_getc(x,y) Retorna el carcter que hay en el LCD en laposicin indicada por x, y.
LibrerLibreraalcd.clcd.c
5/28/2018 Curso de Programacion en C
93/130
5/28/2018 Curso de Programacion en C
94/130
CURSO DE PROGRAMACICURSO DE PROGRAMACIN EN CN EN CPARA MICROCONTROLADORES PICPARA MICROCONTROLADORES PIC16F87XX16F87XX
5.5. PROGRAMACIPROGRAMACIN EN C DE LOSN EN C DE LOSMMDULOS DEL PIC16F8XX.DULOS DEL PIC16F8XX.
COMUNICACIONES RS232.COMUNICACIONES RS232.
5/28/2018 Curso de Programacion en C
95/130
COMUNICACICOMUNICACIN SERIEN SERIE Esta vez abordaremos como comunicar el PIC
con el exterior, a travs del protocolo de
comunicaciones RS232. La comunicacin entre equipos se realiza bit a
bit por un par de hilos, uno de ellos dereferencia.
5/28/2018 Curso de Programacion en C
96/130
TRAMA ENVIADATRAMA ENVIADA
5/28/2018 Curso de Programacion en C
97/130
TRAMA ENVIADATRAMA ENVIADABit de inicio.(start)Bits de datos(7/8).Bit de paridad. Este bit se utiliza para comprobar si los bits
de datos han sido bien recibidos. Existen estas variantes:o Paridadpar. Si la suma de los bits de datos es par, el bit de
paridad es 1,si es impar, el bit de paridad es 0.o Paridadimpar. Si la suma de los bits de datos es impar, el bit
de paridad es 1, si es par, el bit de paridad es 0.oSin paridad. No se utiliza el bit de paridad.
Bit de paro(stop). Pueden ser uno o dos bits.
5/28/2018 Curso de Programacion en C
98/130
COMUNICACICOMUNICACIN SERIEN SERIE Trabajaremos con trasmisin serie y
asncrona.
Primer problema, los niveles de tensin quesaca el PIC son de 5 y 0 voltios mientras quela norma RS232 establece como uno lgico unrango posible entre +3 y +12 V y como cerolgico entre -3 y -12 Voltios.
Solucin, utilizar el CIMAX232
5/28/2018 Curso de Programacion en C
99/130
MAX232MAX232 El conexionado del
MAX232 al PIC es muysencilla. Slo
utilizaremos un puertoserie de los dos que traeel chip. Es decir,emplearemos trespatillas (RX,TX yGROUND) adems de
algunos condensadores.
5/28/2018 Curso de Programacion en C
100/130
ESQUEMA TESQUEMA TPICO CONEXIONADOPICO CONEXIONADO
5/28/2018 Curso de Programacion en C
101/130
DIRECTIVAS DEL PREPROCESADORDIRECTIVAS DEL PREPROCESADOR
La directiva del preprocesado #use RS232se
debe colocar al principio del programa o enaquel lugar del mismo donde queramos utilizarel puerto serie
5/28/2018 Curso de Programacion en C
102/130
#use rs232#use rs232
Un posible ejemplo de utilizacin sera el
siguiente:
#use rs232(baud= 9600, xmit = PIN_A2, rcv = PIN_A3)
5/28/2018 Curso de Programacion en C
103/130
PARPARMETROS USEMETROS USERS232:RS232:
RESTART_WDT: Refrescar el "perro guardin" mientrasespera recibir un datoINVERT: Invierte la polaridad de los pines serie (No utilizada siempleamos el conversor MAX232)
PARITY: =X donde X es N, E, o O.(control de paridad por sivamos a detectar errores en la trasmisin)BITS: =Xdonde X es 5-9 (nmero de bits que forman elpaquete a trasmitir; de 5 a 9 por paquete).ERRORS: Si la usamos hace que el compilador guarde en lavariable RS232_ERRORS los errores en la recepcin.
ENABLE: = pin. El pin especificado estar a nivel alto durantela trasmisin (Empleado en la trasmisin RS485)
5/28/2018 Curso de Programacion en C
104/130
FUNCIONES DE LA LIBRERFUNCIONES DE LA LIBRERAA Manejo de caracteres:
getc(), recoge un carcter del puerto serie.
putc(), enva un carcter por el puerto serie. kbhit(), nos indica si se ha recibido un carcter
desde el puerto serie. Nos retorna 1 si se harecibido un carcter y 0 si no.
5/28/2018 Curso de Programacion en C
105/130
FUNCIONES DE LIBRERFUNCIONES DE LIBRERAA Manejo de cadenas de caracteres:
gets(), recoge un cadena de caracteres del puertoserie.
puts(), enva una cadena de caracteres por el puertoserie.
printf(),similar a la funcin del ANSII C pero enva lacadena de caracteres por el puerto serie, es necesario
antes de usarla consultar el manual.
5/28/2018 Curso de Programacion en C
106/130
Ejemplo comunicaciEjemplo comunicacin con el PCn con el PC El programa espera a recibir
un carcter por el puertoserie, en modo pulling, sin
utilizar las interrupciones.Cuando el carcter recibidoes un nmero (0..9) elnmero ser representado enun display de 7 segmentos.Cuando sea un carcter eldisplay se apagar
#include #use delay(clock=4000000)#fuses XT NOWDT NOPROTECT
5/28/2018 Curso de Programacion en C
107/130
#fuses XT,NOWDT,NOPROTECT#ORG 0x1F00,0x1FFF {} // Reservar Memoria para el Bootloader#byte port_b=6char caracter;unsigned int const display[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f,0x7A};main() {set_tris_b(0);//puerto B como salidaport_b=0; //apaga el display#use RS232(BAUD=9600, BITS=8 ,PARITY=N, XMIT=PIN_C6, RCV=PIN_C7)do{
if(kbhit())//se ha recibido un caracter?{
caracter=getc();//leer el caracterif(caracter>='0' && caracter
5/28/2018 Curso de Programacion en C
108/130
EjemploEjemploEl programa espera a recibir un comando por el puertoserie, en modo pulling, sin utilizar las interrupciones.Alrecibir un comando lo interpreta y enva por el puerto
serie la respuesta.comando accin
a leer puerto A
b leer puerto B
c leer puerto C
#include #use delay(clock=4000000)
5/28/2018 Curso de Programacion en C
109/130
#fuses XT,NOWDT,NOPROTECT#ORG 0x1F00,0x1FFF {} // Reservar Memoria para el Bootloader#byte port_b=6char caracter;
unsigned int constdisplay[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f,0x7A};char estado=m;main(){
set_tris_b(0);//puerto B como salidaport_b=0; //apaga el display#use RS232(BAUD=9600, BITS=8 ,PARITY=N, XMIT=PIN_C6, RCV=PIN_C7)do{
if(kbhit())//se ha recibido un caracter?{ //interpretar el comando
} // si no seguir con nuestra tarea
}while(1);}
5/28/2018 Curso de Programacion en C
110/130
CURSO DE PROGRAMACICURSO DE PROGRAMACIN EN CN EN CPARA MICROCONTROLADORES PICPARA MICROCONTROLADORES PIC16F87XX16F87XX
5.5. PROGRAMACIPROGRAMACIN EN C DE LOSN EN C DE LOSMMDULOS DEL PIC16F8XX.DULOS DEL PIC16F8XX.
INTERRUPCIONESINTERRUPCIONES..
5/28/2018 Curso de Programacion en C
111/130
Directvas usadas.INT_EXT EXTERNAL INTERRUPTINT_RTCC TIMER0 (RTCC) OVERFLOWINT_RB CHANGE ON B4-B7 PININT_AD A/D CONVERTERINT_EEPROM EEPROM WRITE COMPLETEINT_TIMER1 TIMER1 OVERFLOWINT_TIMER2 TIMER2 OVERFLOWINT_CP1 CCP1 CAPTUREINT_CCP2 CCP2 CAPTUREINT_SSP SMART SERIAL PORT (SPI, I2C)INT_PSP PARALLEL PORT
INT_TBE SCI SERIAL DATA TRANSMITTEDINT_RDA SCI SERIAL DATA RECEIVEDINT_COMP COMPARATOR INTERRUPT
5/28/2018 Curso de Programacion en C
112/130
FUNCIONES DE LIBRERAPor otro lado, mediante las funciones
ENABLE_INTERRUPTS( )
y DISABLE_INTERRUPTS(),
tendremos control en el programa principal para permitiro no que se atienda la interrupcin. Lo que va dentrodel parntesis en cada una de ellas, es el tipo deinterrupcin que manejamos, permitiendo
individualmente habilitar o no, cada una de lasinterrupciones.
5/28/2018 Curso de Programacion en C
113/130
EJEMPLO APLICACIN Provocaremos una interrupcin externa a travs del
pinRB0/INT. Esta pin estara conectado a un pulsadorque en reposo valdra "uno" y al pulsarlo pasara a
"cero" provocando un flanco descendente en RB0/INTy activando la interrupcinINT_EXT. Normalmente elPIC estar en estado de reposo (SLEEP) saliendo deste al activarse la interrupcin. Es entonces cuandoencender durante 1 segundo un diodo LED situadoen el pin 7 del puerto B. Tras ello el PIC vuelve al
estado normal de reposo hasta que se produce unanueva interrupcin.
5/28/2018 Curso de Programacion en C
114/130
EJEMPLO APLICACIN
#include #use delay(clock=4000000, RESTART_WDT)#fuses XT,NOPROTECT
5/28/2018 Curso de Programacion en C
115/130
#fuses XT,NOPROTECT#ORG 0x1F00,0x1FFF {} // Reservar Memoria para el Bootloader
#byte port_b=6#bit LED=6.7
#INT_EXTExt_Int_Handler() // funcin asociada a la interrupcin{LED=1;delay_ms(1000); // led encendido durante un segundoLED=0;
while(!input(PIN_B0)); //no se sale de la rutina de interrupcin mientras no se suelte elpulsador}
main(){port_b=0;
set_tris_b(0x0f); //RB0-RB3 entradas, RB4-RB7 salidas
enable_interrupts(INT_EXT); //hablita int. externaenable_interrupts(GLOBAL); // habilita int globales
while(1)sleep(); // a dormir
5/28/2018 Curso de Programacion en C
116/130
CURSO DE PROGRAMACICURSO DE PROGRAMACI
N EN CN EN C
PARA MICROCONTROLADORES PICPARA MICROCONTROLADORES PIC16F87XX16F87XX
5.5. PROGRAMACIPROGRAMACIN EN C DE LOSN EN C DE LOSMMDULOS DEL PIC16F8XX.DULOS DEL PIC16F8XX.
CONVERTIDOR A/DCONVERTIDOR A/D..
5/28/2018 Curso de Programacion en C
117/130
CONVERSIN A/D Estos microcontroladores poseen un convertidor A/D
de 10 bits de resolucin y 5 canales de entradamultiplexados
El convertidor utilizado es del tipo deaproximacionessucesivas.La seal analgica de entrada se aplica aun condensador de captura y mantenimiento ("Sampleand Hold") y luego se introduce al conversor A/D,proporcionando el resultado en un registro de 10 bits
5/28/2018 Curso de Programacion en C
118/130
DIRECTIVAS DEL
PREPROCESADORDentro de las opciones de configuracin que nosbrinda la directiva #device, configuracin deldispositivo, aparece una opcin que nos permite
especificar el nmero de bits que la funcinread_adc() debe retornar. Como ejemplo si queremosque la lectura del convertidor AD nos retorne un valorde 8 bits, deberemos especificarlo en el programa conla siguiente directiva:
#device (ADC=8)
5/28/2018 Curso de Programacion en C
119/130
Trabajando con los canales A/D1. setup_adc_ports(valor),esta funcin
configura los pines del puerto A para que
sean analgicos, digitales o algunacombinacin de ambos.
2. definimos la frecuencia de reloj empleada enla conversin. Podemos hacerlo a travs dela funcinsetup_adc(mode).
5/28/2018 Curso de Programacion en C
120/130
TRABAJANDO CON EL A/D3. Despus seleccionamos el canal que
queremos leer mediante la funcin:
set_adc_chanel(numero)4. Por ltimo, efectuamos la lectura yconversin gracias a la funcin:read_adc( ).Esta funcin lee el valor digital del conversoranalgico digital.
5/28/2018 Curso de Programacion en C
121/130
ejemplo
#include #device adc=10#fuses HS NOPROTECT NOWDT
5/28/2018 Curso de Programacion en C
122/130
#fuses HS,NOPROTECT,NOWDT#use delay(clock=4000000)#ORG 0x1F00,0x1FFF {} /* reserva de memoria para el bootloader*/
#use RS232(BAUD=9600, BITS=8 ,PARITY=N, XMIT=PIN_C6, RCV=PIN_C7)unsigned long int valor;// programa principalmain(){setup_adc_ports(RA0_ANALOG);setup_adc(ADC_CLOCK_INTERNAL);set_adc_channel(0);valor=read_adc();while(1){
valor=read_adc();delay_ms(10);
printf("valor = %lu\r\n",valor);}
}
5/28/2018 Curso de Programacion en C
123/130
CURSO DE PROGRAMACICURSO DE PROGRAMACIN EN CN EN CPARA MICROCONTROLADORES PICPARA MICROCONTROLADORES PIC
16F87XX16F87XX
5.5. PROGRAMACIPROGRAMACIN EN C DE LOSN EN C DE LOSMMDULOS DEL PIC16F8XX.DULOS DEL PIC16F8XX.
CCP (PWM)CCP (PWM)..
5/28/2018 Curso de Programacion en C
124/130
RECURSOS DEL COMPILADORNos encontramos que en la librera existencuatro funciones, dos para cada mdulo CCP yuna tercera necesaria para el caso de utilizarel modo PWM, que sera la de configuracindel timer2.
5/28/2018 Curso de Programacion en C
125/130
Modulo CCP Modo Captura: Un par de registro CCPx capturan
el valor del TMR1 al ocurrir un evento especial en elpin RC2/CCP1 (para el mdulo CCP1) o el pin
RC1/T1OSI/CCP2 (para el mdulo CCP2 Modo Comparacin: Es comparado el valor del
TMR1 con el valor cargado en un par de registros (16bits), cuando ambos valores coinciden se provoca unevento en los pines RC2/CCP1 o RC1/T1OSI/CCP2.
Modo Modulacin de Anchura de pulso PWM:Establece el ciclo de trabajo de una seal cuadrada,utiliza el TMR2
5/28/2018 Curso de Programacion en C
126/130
Setup_timer2 (modo, periodo, posescale).o Modo permite habilitar el timer 2 y
establecer el valor del prescaler(1, 4 16).Periodo es un nmero entero entre 0 y 255 yposescaler un nmero entre 1 y 16 quedetermina cuantos resets del timer sonnecesarios para que se provoque unainterrupcin.
5/28/2018 Curso de Programacion en C
127/130
Setup_ccp1(mode ) y setup_ccp2( mode).o En ambos casos mode especifica el modo
de funcionamiento de la unidad de CCP, modocaptura, modo comparacin o modo PWM.
Set_pwm1_duty ( value) y set_pwm2_duty(value ).
5/28/2018 Curso de Programacion en C
128/130
o Se utilizan eclusivamente para el modo PWM. Enambos casos establecemos con value el ciclo detrabajo de la seal de salida por el pincorrespondiente. Value se usa para establecer eltiempo que la seal d salida estar a nivel alto (T1), esun valor de 10 bits (0 a 1023).
T1=value * (1/clock)*t2div
Donde:.- clock es frecuencia del oscilador..- t2div: es el valor del prescaler del timer 2 que previamente
hemos colocado en la funcin de configuracin del timer 2
setup_timer2().
#include #use delay(clock=4000000) // Frecuencia en Hz del cristal
5/28/2018 Curso de Programacion en C
129/130
#fuses XT,NOWDT,NOPROTECT#ORG 0x1F00,0x1FFF {} //Reservamos mla memoria para el
//bootloaderunsigned long int valor;main (void){set_tris_c(0);
setup_timer_2(T2_DIV_BY_16, 124, 16);// El periodo de la//seal PWM de 2 ms.
setup_ccp1(CCP_PWM); // Configura CCP1 en modo PWMvalor=125;set_pwm1_duty(valor);// La anchura del pulso de .5 ms. (CT=
//25%)for(;;);}
5/28/2018 Curso de Programacion en C
130/130
SEAL DE SALIDA OBTENIDA
Recommended