-
CURSO DE PROGRAMACICURSO DE PROGRAMACIN EN C PARAN EN C PARAMICROCONTROLADORES PIC 16F87XXMICROCONTROLADORES PIC 16F87XX
JULIO 200404FP27CF153
-
CONTENIDOSCONTENIDOS
1.1. IDESIDES2.2. BOOTLOADERBOOTLOADER3.3. PLATAFORMAS DESARROLLO DEPLATAFORMAS DESARROLLO DE
PROYECTOSPROYECTOS4.4. RECORDATORIO DE CRECORDATORIO DE C
........................
-
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).
-
CURSO DE PROGRAMACICURSO DE PROGRAMACIN EN CN EN CPARA MICROCONTROLADORES PICPARA MICROCONTROLADORES PIC
16F87XX16F87XX
1. IDES1. IDES
-
MPLAB DE MICROCHIPMPLAB DE MICROCHIP
Se integra de formaautomtica, al instalar elcompilador PCW.
En versiones anterioresejecutando el comando:
Cscs +setup.
-
PCWPCW
Entorno propio de lacasa CCS, que nospermite la edicin y lacompilacin. Incorpora dentro de la
barra de mens laopcin Tools.
-
CURSO DE PROGRAMACICURSO DE PROGRAMACIN EN CN EN CPARA MICROCONTROLADORES PICPARA MICROCONTROLADORES PIC
16F87XX16F87XX
2 .BOOTLOADER2 .BOOTLOADER
-
INTRODUCCIINTRODUCCINN
Se trata de la construccin de un sistema dedesarrollo de aplicaciones para el PIC16F876sencillo, barato, rpido y eficaz. Programacin del microcontrolador mediante
el puerto serie, sin necesidad de sacar elmicrocontrolador de la placa de CI (programin circuit).
-
INTRODUCCIINTRODUCCINN
Para que esto sea posible, deberemos programar eluC por primera y nica vez con un cdigo dearranque llamado BOOTLOADER Con la ayuda del software de comunicaciones
PICDOWNLOADER, cargaremos los programas en elPIC a travs del puerto serie del PC.
-
Fuente de informacin
www.microchipc.comwww.microchipc.com
-
www.microchipc.com
-
DESCOMPRIMIR BOOTLOADERDESCOMPRIMIR BOOTLOADER
Descomprimir el archivoy nos crea una carpetaPIC bootloader con lossiguientes archivos
-
SELECCIONAR EL ADECUADOSELECCIONAR EL ADECUADO
De todos los ficherosque nos aparecen en lacarpeta, cul de ellosdebo grabar en elPIC?.
-
UN EJEMPLOUN EJEMPLO
Observemos uno de losObservemos uno de los ficherosficheros: se puede comprobarque adems de un nmero de referencia (63619), elnombre 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
-
PICdownloadePICdownloade
La aplicacin PICdownloader,que ser la encargada deestablecer la comunicacin entreel PC y la Tarjeta, transfiriendo losficheros .hex de nuestrasaplicaciones.
-
CARGA DEL fichero .CARGA DEL fichero .hexhex en el PICen el PIC
Ejecutar desde windows elprograma PICdownloaderPICdownloader .
El fichero que queremos transferirFILE:...hex,
El puerto del PC donde hemoscolocado el cable serie decomunicacin
Seleccionar la velocidad en baudios Pulsar write, el programa
comenzar a busca el bootloader Resetear el PIC y el programa
bootloader se activar transcurridos0.2 segundos despus del reset
Cerrar el programa PICdownloader.
-
PICdownloaderPICdownloader & PCW& PCW
Si hemos optado porutilizar como entorno dedesarrollo el programaPCW.EXE, es posibleconfigurar el programapara llamar alPICdownloader desdela opcin Tools-Program Chip.
-
CURSO DE PROGRAMACICURSO DE PROGRAMACIN EN CN EN CPARA MICROCONTROLADORES PICPARA MICROCONTROLADORES PIC
16F87XX16F87XX
3.3. PLATAFORMAS DESARROLLOPLATAFORMAS DESARROLLODE PROYECTOSDE PROYECTOS
-
SISTEMAS DISPOIBLESSISTEMAS DISPOIBLES
MicroPIC Trainer.Software de simulacin
Isis de Proteus.PICKey.
-
MicroPICMicroPIC TrainerTrainer
-
ISIS DE PROTEUS
-
PICKey
-
CURSO DE PROGRAMACICURSO DE PROGRAMACIN EN CN EN CPARA MICROCONTROLADORES PICPARA MICROCONTROLADORES PIC
16F87XX16F87XX
4.4. RECORDATORIO DE CRECORDATORIO DE C
-
#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 FUNCIONES
funcion_1(){variables locales a funcion_1;bloque de sentencias;llamada a otra/s funciones;
}
funcion_n(){}
-
#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 salidawhile(1){if(input(PIN_A0))
rotate_left(&port_b,1);else
rotate_right(&port_b,1);delay_ms(100);}
}
-
EXPRESIONES DE ASIGNACIN
Una expresin de asignacin tradicional es dela forma expr1 = expr1 operador expr2, esdecir, 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
-
OPERADORES DE ASIGNACIOPERADORES DE ASIGNACINN
Operador 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
-
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
-
OPERADORES RELACIONALESOPERADORES RELACIONALES
Su misin es comparar dos operandos y darun resultado entero: 1 (verdadero); 0 (falso).
-
OPERADORES RELACIONALESOPERADORES RELACIONALES
OperadorOperador DescripciDescripcinn< Menor que> Mayor que= Mayor o igual que== Igual a!= Distinto de
-
OPERADORES LOPERADORES LGICOSGICOS
Al igual que los operadores relacionales, stosdevuelven 1 (verdadero), 0 (falso) tras laevaluacin de sus operandos.
-
OPERADORES LOPERADORES LGICOSGICOS
Operador Descripcin! No lgico (NOT)&& Y lgico (AND)|| O lgico (OR)
-
OPERADORES DE MANEJO DE BITSOPERADORES DE MANEJO DE BITS
Estos operadores permiten actuar sobre losoperandos a nivel de bits y slo pueden ser detipo entero (incluyendo el tipo char)
-
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)
-
Operadores de incremento y decrementoOperadores de incremento y decremento
Su comportamiento se asemeja a lasinstrucciones de incremento incf f,d delensamblador del controlador PIC 16f8XX oinc variable del Intel 8051.
-
Operadores de incremento y decrementoOperadores de incremento y decremento
OPERADOR DESCRIPCIN++ Incremento-- Decremento
-
Operadores de desplazamiento de bitsOperadores de desplazamiento de bits
Estos operadores utilizan dos operandosenteros (tipo int): el primero es el elemento adesplazar y el segundo, el nmero deposiciones de bits que se desplaza.
-
Operadores de desplazamiento de bitsOperadores de desplazamiento de bits
OPERADOR DESCRIPCIN>> Desplazamiento a la derecha
-
Operadores de direccin & e indireccin *
Los operadores & y * se utilizan para trabajarcon punteros . El lenguaje C est muyinfluenciado 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 otravariable. Los punteros permiten lamanipulacin indirecta de datos y cdigos
-
Operadores de direccin & e indireccin *
OPERADOR DESCRIPCIN& De direccin* De indireccin
-
EXPRESIONESEXPRESIONES CONSTANTESCONSTANTES
-
IDENTIFICADORES
-
Expresiones en orden descendente de precedenciaExpresiones en orden descendente de precedencia
-
SINTAXIS DE DEFINICISINTAXIS DE DEFINICIN DE DATOSN DE DATOS
La sintaxis utilizada para la definicin de losdatos y las funciones es la misma que laempleada en la programacin con ANSII C
-
TIPOS ESTANDAR EN Cunsigned define un nmero de 8 bits sin signounsigned int define un nmero de 8 bits sin signoint define un nmero de 8 bits sin signochar define un nmero de 8 bits sin signolong define un nmero de 16 bits sin signolong int define un nmero de 16 bits sin signosigned define un nmero de 8 bits con signosigned int define un nmero de 8 bits con signosigned long define un nmero de 16 bits con signofloat define un nmero de 32 bits en punto flotanteshort define un bitshort int define un bit
-
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 ennuestros 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.
-
SENTENCIAS DE C.,
-
SENTENCIA SIMPLE
expr;
EJEMPLOi=1;
-
SENTENCIA COMPUESTA
{SENTENCIA 1;SENTENCIA 2;....................SENTENCIA N;}
-
if else
if (expr) stmt1;[else stmt2;]
EJEMPLOif (x==25) x=1;else x=x+1;
EXPR
STMT1
STTM2
SI
NO
-
while
while (expr)stmt;
EJEMPLOwhile (get_rtcc()!=0)
putc('n');
EXPR STMTSI
NO
-
do while
do stmt while (expr);
EJEMPLOdo
{putc(c=getc());
} while (c!=0);
EXPR
STMT
SI
NO
-
forfor(expr1;expr2;expr3)
stmt;
EJEMPLOfor (i=1;i
-
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
-
switch
switch (cmd){ case 0: printf("cmd 0");
break;case 1: printf("cmd 1");
break;default: printf(comando no vlido");
break;}
-
return
return [expr];
return (5);
-
goto
goto label; goto loop;
EJEMPLOlabel: stmt; loop: i++;
-
break
break; El comando break se puede utilizar con los tres
formatos de bucle y switch. Cuando el programaalcanza un break, se deja sin ejecutar el resto delbucle y se transfiere el control a la sentenciainmediatamente posterior a dicho bucle.
EJEMPLObreak;
-
continue
continue; El comando continue se puede emplear con
cualquiera de los tres bucles, pero no con switch. Aligual que antes el programa no ejecuta las sentenciasrestantes del bucle donde se encuentra. En bucles foro while se comienza a ejecutar el siguiente ciclo delbucle. En do While se comprueba la condicin desalida; si se cumple, se comienza el nuevo ciclo.
EJEMPLOcontinue;
-
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]
}
-
DefiniciDefinicin de funcin de funcinn
El calificador_tipo para una funcin puedenser: void o un especificador de tipo (vase la lista
anterior de tipos)
-
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.
ENTRADA/SALIDA DIGITAL.ENTRADA/SALIDA DIGITAL.
-
EELL PUERTOAPUERTOA Es un puerto bidireccional de 6
bits, cuyo registro deconfiguracin correspondiente esel TRISA, colocando a 1 el bitcorrespondiente configuramos elpin como salida y a 0 comoentrada. El pin RA4 es una entrada del tipo
Trigger Schmitt y una salida enmodo colector abierto. El resto depines son todos compatibles conTTL
-
EELL PUERTOBPUERTOB Es un puerto bidireccional de 8 bits,
cuyo registro de configuracincorresponde con el TRISB, y seconfigura de la misma forma que elpuerto A. Cada uno de los pins tiene la
posibilidad de programarinternamente una resistencia de Pull-up. Cuatro de los pines del PORTB,
RB7:RB4, tienen la propiedad deprovocar una interrupcin cuando sedetecta un cambio de nivel en algunade esos pines.
-
EELL PUERTOCPUERTOC
Es un puerto bidireccional de 8bits, cuyo registro deconfiguracin corresponde conel TRISC, y se configura de lamisma forma que el puerto B. El puerto C esta multiplexado
con una serie de funciones delos perifricos internos. Lospines de puerto C son del tipoTrigger Schmitt cuando seconfiguran como entrada.
-
DIRECTIVAS DELPREPROCESADOR
-
DIRECTIVAS DEL PREPROCESADORDIRECTIVAS DEL PREPROCESADOR
Para comenzar describiremos las directivasdel preprocesador, que como sabemos sonordenes dirigidas al compilador y que noaadirn cdigo a nuestros programas. Por lo general facilitan la programacin y casi
de forma obligatoria debern aparecer entodos nuestros cdigos fuentes
-
#include#include
Esta directiva hace que el compilador incluya ennuestro 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
-
#byte#byte identificador=xidentificador=x#bit#bit identificador=x.yidentificador=x.y
Estas directivas crearn identificadores que podremosutilizar 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 de
memoria x e y su desplazamiento, x puede ser unaconstante u otro identificador.
#byte puertob=6#bit alarma=5.0
-
#device chip options#device chip options
Donde chip es el nombre del procesador(PIC16F876, PIC16F84,etc) y options sonmodificadores estndar del dispositivo. En todos los cdigos fuente deberemos
encontrar una directiva como sta indicandopara que microcontrolador es el cdigo.
-
#define id texto#define id texto
donde id es un identificador del preprocesadory texto es cualquier texto. Esta directiva seutiliza simplemente para reemplazar elidentificador id con el texto.
#define rotar(x) (x
-
#fuses#fuses optionsoptions
donde options vara dependiendo del dispositivo, deentre 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 noafecta a la compilacin, sin embargo, esta informacinse pone en el archivo de salida.
-
#org#org startstart,, endend
Donde start es la primera y end la ltimadireccin ROM de un rea especfica de lamemoria donde queremos que se fije unafuncin o declaracin de constantes. En nuestro caso utilizaremos esta directiva en
todos nuestros programas de la siguienteforma:
#org 0x1FF00, 0x1FFF {}
-
#use#use delay(clockdelay(clock=speed)=speed)#use delay (clock=#use delay (clock=speed,restart_wdtspeed,restart_wdt))
Donde speed es una constante que indica en herciosla frecuencia del reloj utilizado con el micro,opcionalmente podemos utilizar la funcin restart_wdtpara 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.
-
FUNCIONES DE LIBRERA DE C.,
E/S DISCRETA, MANIPULACIN DEBIT/BYTES Y RETARDOS
-
E/S DISCRETAE/S DISCRETA
funciones que manejan unmanejan un bitbit: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.
-
E/S DISCRETAE/S DISCRETA
las que manejan 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 escribirbytes deberemos utilizar la directiva
#byte PUERTO = dir. Puerto
-
E/S DISCRETAE/S DISCRETA
Las que configuran los pines:port_b_pullups(value): activamos o desactivamos
las Rpull-up del 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.
-
MANIPULACIMANIPULACIN DE BIT/BYTESN DE BIT/BYTES
Para manipular un bit podemos encontrarnos con:
bit_clear(var,bit):borra el dgito especificadode 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.
-
manipular unmanipular un bytebyte
rotate_left(address,byte):rotar a la izquierda unbit de un array o una estructura. El bit MSBpasa a ser el LSB.
rotate_right(address,byte): rotar a la derechaun bit de un array o una estructura. El bit LSBpasa a ser el MSB.
-
manipular unmanipular un bytebyte
shift_left(addres,byte,value):desplaza hacia laizquierda 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.
-
Funciones para retardo softwareFunciones para retardo software
delay_cycles(count): Realiza retardos deciclos 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 valor
especificado en milcrosegundos (1..65535).Esta funcin no utiliza los timers internos peroes preciso utilizar la directiva #use delayespecificando la frecuencia del reloj.
-
Funciones para retardo softwareFunciones para retardo software
delay_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
-
RotaciRotacin derecha/izquierda den derecha/izquierda dediodos LEDdiodos LED.
Realizaremos nuestro primerprograma en C, queconsistir en rotar elencendido de un led atravs de una hilera de 8LEDs conectados al puerto Bdel PIC.Dependiendo de si el pinRA0 del puerto A est acero, la rotacin deencendido ser hacia laderecha , y si est a uno,hacia el sentido contrario, esdecir, hacia la izquierda
-
PROCEDIMIENTOPROCEDIMIENTO
Llamamos al programa pcw. Editamos el fichero con el
cdigo fuente y lo salvamoscomo inout.c Seleccionamos del men la
opcin compile.compile. Si no hay ningn error
tenemos listo el ficheroinout.hex para cargarlo en elpic.
-
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
-
Comentemos el programa por partesComentemos el programa por partesmain(){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);
}}
-
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 7segmentos 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.
-
#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);
}}
-
Kbd.c contiene 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 debeser llamada con cierta frecuencia si no queremosperder alguna pulsacin de tecla.
LibrerLibreraa kbd.ckbd.c (teclados 3x4)(teclados 3x4)
-
Lcd.c contiene 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.
LibrerLibreraa lcd.clcd.c
-
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.
COMUNICACIONES RS232.COMUNICACIONES RS232.
-
COMUNICACICOMUNICACIN SERIEN SERIE
Esta vez abordaremos como comunicar el PICcon el exterior, a travs del protocolo decomunicaciones RS232. La comunicacin entre equipos se realiza bit a
bit por un par de hilos, uno de ellos dereferencia.
-
TRAMA ENVIADATRAMA ENVIADA
-
TRAMA ENVIADATRAMA ENVIADA
Bit 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 Paridad par. 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 Paridad impar. 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.o Sin paridad. No se utiliza el bit de paridad.
Bit de paro (stop). Pueden ser uno o dos bits.
-
COMUNICACICOMUNICACIN SERIEN SERIE
Trabajaremos con trasmisin serie yasncrona. Primer problema, los niveles de tensin que
saca 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 CI MAX232
-
MAX232MAX232
El conexionado delMAX232 al PIC es muysencilla. Sloutilizaremos un puertoserie de los dos que traeel chip. Es decir,emplearemos trespatillas (RX,TX yGROUND) adems dealgunos condensadores.
-
ESQUEMA TESQUEMA TPICO CONEXIONADOPICO CONEXIONADO
-
DIRECTIVAS DEL PREPROCESADORDIRECTIVAS DEL PREPROCESADOR
La directiva del preprocesado #use RS232 sedebe colocar al principio del programa o enaquel lugar del mismo donde queramos utilizarel puerto serie
-
#use rs232#use rs232
Un posible ejemplo de utilizacin sera elsiguiente:
#use rs232(baud= 9600, xmit = PIN_A2, rcv = PIN_A3)
-
PARPARMETROS USEMETROS USE RS232: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: =Xdonde 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)
-
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.
-
FUNCIONES DE LIBRERFUNCIONES DE LIBRERAA
Manejo de cadenas de caracteres: gets(), recoge un cadena de caracteres del puerto
serie. puts(), enva una cadena de caracteres por el puerto
serie. printf(), similar a la funcin del ANSII C pero enva la
cadena de caracteres por el puerto serie, es necesarioantes de usarla consultar el manual.
-
Ejemplo comunicaciEjemplo comunicacin con el PCn con el PC
El programa espera a recibirun carcter por el puertoserie, en modo pulling, sinutilizar 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#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
-
EjemploEjemplo
El 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 puertoserie la respuesta.
comando accina leer puerto Ab leer puerto Bc leer puerto C
-
#include #use delay(clock=4000000)#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);}
-
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.
INTERRUPCIONESINTERRUPCIONES..
-
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 PORTINT_TBE SCI SERIAL DATA TRANSMITTEDINT_RDA SCI SERIAL DATA RECEIVEDINT_COMP COMPARATOR INTERRUPT
-
FUNCIONES DE LIBRERA
Por otro lado, mediante las funcionesENABLE_INTERRUPTS( )
y DISABLE_INTERRUPTS(),tendremos control en el programa principal para permitir
o no que se atienda la interrupcin. Lo que va dentrodel parntesis en cada una de ellas, es el tipo deinterrupcin que manejamos, permitiendoindividualmente habilitar o no, cada una de lasinterrupciones.
-
EJEMPLO APLICACIN
Provocaremos una interrupcin externa a travs delpin RB0/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 interrupcin INT_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 alestado normal de reposo hasta que se produce unanueva interrupcin.
-
EJEMPLO APLICACIN
-
#include #use delay(clock=4000000, RESTART_WDT)#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 salidasenable_interrupts(INT_EXT); //hablita int. externaenable_interrupts(GLOBAL); // habilita int globales
while(1)sleep(); // a dormir}
-
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.
CONVERTIDOR A/DCONVERTIDOR A/D..
-
CONVERSIN A/D
Estos microcontroladores poseen un convertidor A/Dde 10 bits de resolucin y 5 canales de entradamultiplexados El convertidor utilizado es del tipo de aproximaciones
sucesivas. 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
-
DIRECTIVAS DELPREPROCESADOR
Dentro de las opciones de configuracin que nosbrinda la directiva #device, configuracin deldispositivo, aparece una opcin que nos permiteespecificar 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)
-
Trabajando con los canales A/D
1. setup_adc_ports(valor), esta funcinconfigura los pines del puerto A para quesean analgicos, digitales o algunacombinacin de ambos.
2. definimos la frecuencia de reloj empleada enla conversin. Podemos hacerlo a travs dela funcin setup_adc(mode).
-
TRABAJANDO CON EL A/D
3. Despus seleccionamos el canal quequeremos 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.
-
ejemplo
-
#include #device adc=10#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);
}}
-
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)..
-
RECURSOS DEL COMPILADOR
Nos 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.
-
Modulo CCP
Modo Captura: Un par de registro CCPx capturanel valor del TMR1 al ocurrir un evento especial en elpin RC2/CCP1 (para el mdulo CCP1) o el pinRC1/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
-
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.
-
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 ). o Se utilizan eclusivamente para el modo PWM. En
ambos 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 2setup_timer2().
-
#include #use delay(clock=4000000) // Frecuencia en Hz del cristal#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(;;);}
-
SEAL DE SALIDA OBTENIDA