Академический Документы
Профессиональный Документы
Культура Документы
69
http://ucursos.webs.com
LEER PARA APRENDER / Por: Jorge Rdz, Editor
dos cuestiones me las haca muy seguido, entonces un da, en mi trabajo encontr en
una maquina avanzada que haba tenido una falla, ya que mi trabajo se trata de reparar
fallas en equipos, pues tuve que ir a ver que era esa tal falla, pues no era ms que una
tarjeta de control que se haba quemado unos diodos, no fue muy difcil saber que era
la falla, y despus como tena tiempo necesario para hacer otras cosas me la pase
revisando que mas tenia o de que estaba compuesto la tarjeta y vi que haba un
mucho tiempo para saber cual era, y valla sorpresa era un MicroPIC 16C57 cuando lo
vi me record todas las practicas que haba hecho con anterioridad, desde ese
momento supe que las horas perdidas pasndola programando y realizado proyectos
con esos PIC ahora s a dnde van los conocimientos adquiridos de tantas horas
A lo largo de este manual usted entender como hacer correctamente un enlace Serial
con unos pocos detalles del cual no son muy impactantes como son la competencia
casi directa con AVR son su AVRStudio 5, del cual es casi como programar en C#. Era
tiempo de que Microchip se pusiera las pilas y que lanzara su nuevo IDE basado en
hacerlo fsicamente ya que nos ahorra tiempo en construccin y sacar fallas antes de
proceder, para nuestro caso usaremos una herramienta sumamente importante para la
control.
1.2 LABVIEW
Para la interfaz del usuario usaremos el software Labview 2010 donde aprenderemos a
TECH FOR PIC16 del cual nos proporcionara la habilidad para programar los PIC de
En nuestra primera impresin de usar MPLAB X es como si fuera una sombra de JAVA,
3
4
Para crear nuestro primer proyecto debemos de dar click en donde dice <Create New
Project> o podemos ir a <File><Creare New Project>
Como haremos nuestro proyecto desde cero daremos click en <Standalone Project>
daremos <Next> y elegiremos el Microcontrolador a usar en este caso para todos los
proyectos usaremos el PIC16F886.
Si tenemos un debugeador en nuestras manos podemos seleccionar uno de ellos como
puede ser el PICKit 2, 3 etc. Como vamos a usar un emulador simplemente
seleccionamos:
Como en MPLAB 8.8 al tener el proyecto listo debemos de hacer una extensin .c
para ellos vamos a <New File> y en ventana de categoras buscaremos en <Micochip
embedded> y elegimos la carpeta donde est el compilador hi tech y en <File Type>en
la primera opcin es que estamos buscando para el compilador hi tech for PIC16. En la
siguiente ventana nos pedir el Nombre del archivo y la extensin despus la ubicacin
del archivo del cual debe ser la misma donde creamos el proyecto.
Como hemos realizado nuestro primer proyecto en MPLAB X no tiene mucha ciencia la
programacin en C, ya que si hemos programado en Hi tech compiler es prcticamente
igual.
La idea de nuestro primer programa en C es hacer una comunicacin serial que prenda
un puerto completo del cual podemos usar interrupciones por Recepcin de datos o
simple recepcin de datos.
#include "pic.h"
__CONFIG(FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_OFF & CPD_OFF & BOREN_OFF
& IESO_OFF & FCMEN_OFF & LVP_OFF & DEBUG_OFF & BOR4V_BOR40V & WRT_OFF);
/*
* FOSC_HS 20Mhz External Crystal
* WDTE_OFF Watch dog disable
* PWERTE_ON Power System Enable
* MCLRE_ON Master Clear Enable
*/
#define _XTAL_FREQ 20000000 //
#include "libUSART/usartdr.h"//Libreria para usar el serial
/*
* VARIABLES GLOBALES DEL PROGRAMA
*/
unsigned char data;
//ISR Interrupt
static void interrupt
isr(void){}
//Programa Principal
void main(void) {
TRISC=0x80;//RX COMO ENTRADA Y TX COMO SALIDA
TRISB=0X00;//PUERTO COMPLETO COMO SALIDA
/*
* CONFIGURAMOS SERIAL
* VALUE=(FOSC/(BAUD*16))-1
* SIN INTERRUPCIONES
* A 19200
*/
OpenUSART(64,OFF,ON);//64=19200
GIE=0; //DESACTIVA INTERRUPCIONES GLOBALES
PEIE=0; //DESACTIVA INTERRUPCIONES POR PERIFERICOS
PORTB=0X00; //INICIALIZA PUERTO B COMO APAGADO
Recuerde que usaremos una velocidad de transmisin de 19200 baud por defecto
siempre aparecer en 9200 baud.
Se debe de conectar primero el hardware que en este caso es el PIC16 ya que estar
esperando el dato de un byte, al este estar conectado daremos play en Labview para
correr el programa y rpidamente este enviara el primer dato, y ya podremos enviar los
estados de los switches.
Recuerde siempre usar el MAX 232 para las conversiones de niveles RS232.
1.4.2 Esquema del Proyecto
La diferencia del proyecto anterior es que ahora es hacer que el puerto B sea Entrada
digital, y usar interruptores para que tomar los datos y gurdalos en una variable, del
cual se enviara a Labview, para ello se agrega la librera USART como se realizo en la
prctica anterior, al tomar solo los 4 bits de menor peso del puerto B este solo se enva
para despus esperar 100mS que servirn para sincronizacin.
/*
* File: Main.c
* Author: george
*
* Created on November 15, 2011, 8:22 PM
*/
#include "pic.h"
__CONFIG(FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_OFF & CPD_OFF & BOREN_OFF
& IESO_OFF & FCMEN_OFF & LVP_OFF & DEBUG_OFF & BOR4V_BOR40V & WRT_OFF);
/*
* FOSC_HS 20Mhz External Crystal
* WDTE_OFF Watch dog disable
* PWERTE_ON Power System Enable
* MCLRE_ON Master Clear Enable
*/
#define _XTAL_FREQ 20000000 //
#include "libUSART/usartdr.h"//Libreria para usar el serial
/*
* VARIBALES GLOBALES
*/
unsigned char dato;
//Funcion de Tiempo
void dly(unsigned int t){
while(--t)__delay_ms(1);
}
//ISR Interrupt
static void interrupt
isr(void){}
//Programa Principal
void main(void) {
TRISC=0x80;//RX COMO ENTRADA Y TX COMO SALIDA
TRISB=0X0F;//NIBBLE BAJO COMO ENTRADA RESTO SALIDA
ADCON0=0x00;//DESACTIVA ENTRADAS ANALOGAS
ANSELH=0x00;//ENTRADAS ANALOGAS EN PUERTO B APAGADO
/*
* CONFIGURAMOS SERIAL
* VALUE=(FOSC/(BAUD*16))-1
* SIN INTERRUPCIONES
* A 19200
*/
OpenUSART(64,OFF,OFF);//64=19200
GIE=0; //DESACTIVA INTERRUPCIONES GLOBALES
PEIE=0; //DESACTIVA INTERRUPCIONES POR PERIFERICOS
while(1){
dato=PORTB&0x0F; //TOMA SOLO NIBBLE BAJO
putch(dato); //CARGA DATO EN EL SERIAL PARA ENVIARLO
dly(100); //ESPERA 100mS
}
}
Como hemos realizado en el proyecto anterior se debe de crear un Nuevo IV, despus
en la ventana Font Panel agregaremos unos cuantos arreglos para que nos quede de
la siguiente forma, note que esto puede ser a su gusto ya que lo ms importante esta
en Block Diagram :
Visa resource name es donde podemos agregar el COM disponible del cual se puede
obtener al agregar las configuracin del puerto.
Set up 19200 esto nos proporciona la velocidad a que
debe de trabajar la comunicacin en Labview, como al
agregarlo por default aparecer con una velocidad de
9 600 baud solo se debe de escribir la velocidad
deseada que en este caso es de 19200 baud como se
ha configurado el Microcontrolador.
Como hemos visto al recibir los datos en forma de cadenas de caracteres del cual solo
es un byte, solo se debe de transformar en un arreglo de bytes y despus buscar en el
arreglo de bytes el primer byte para despus transformar de nmero a un arreglo
binario que este ya visualizara el estado de los interruptores. Y despus solo
cerraremos el puerto pero antes se debe de borrar cualquier evento antes abierto.
1.5.3 Esquema del Diagrama Electrnico
Las mayoras de las veces necesitamos adquirir datos continuos, por ejemplo de
temperatura, Luz, y entre varios sensores que varen con respecto a circunstancias
fsicas. Despus de tomar este dato anlogo, se enva a una PC para procesar con
respecto a un algoritmo incluido en un tipo de software donde hace el proceso de
arrojar en la salida un dato digital o variable.
En esta prctica vas a proponer graficar datos continuos esto quiere decir que cada vez
que el Microcontrolador en s entrada anloga consiga leer el estado del sensor
rpidamente lo envi para apreciarlo en una grafica realizada en Labview con respecto
al tiempo.
/*
* File: main.c
* Author: george
*
* Created on November 17, 2011, 6:34 PM
*/
#include "pic.h"
__CONFIG(FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_OFF & CPD_OFF & BOREN_OFF
& IESO_OFF & FCMEN_OFF & LVP_OFF & DEBUG_OFF & BOR4V_BOR40V & WRT_OFF);
/*
* FOSC_HS 20Mhz External Crystal
* WDTE_OFF Watch dog disable
* PWERTE_ON Power System Enable
* MCLRE_ON Master Clear Enable
*/
#define _XTAL_FREQ 20000000 //
#include "libADC/adcdr.h"
#include "libUSART/usartdr.h"
/*
* VARIABLES GLOBALES DEL PROGRAMA
*/
unsigned int value_adc;
unsigned char data[2];
/*
* SE OBTIENE EL DATO ANALOGO
* EN ESTE CASO AL LEER EL EL DATO SERA DE 1024 BITS
* DEL CUAL ES 2 BYTES
*/
unsigned int take_data_analog(){
__delay_ms(1);
startADC();
while(GO_DONE!=0);
return readADC();
}
/*
* SE DESPEJA EL DATO ANALOGO Y SEPARA LOS 2 BYTES
* PARQ QUE SE GUARDEN EN UN ARREGLO POR SEPARADO
* PARA PREPARARLO PARA EL ENVIO
*/
void convert_two_byte(unsigned int analog){
data[0]=(analog>>8)&0x03; //TOMA BYTE DE MAYOR PESO
data[1]=analog&0xFF; //TOMA BYTE DE MENOR PESO
}
/*
* ENVIA LOS DOS BYTES POR EL PUESRTO SERIAL
* ENVIA PRIMERO EL BYTE DE MAYOR PESO Y DEPSUES EL DE MENOR PESO
*/
void send_data_rs232(void){
putch(data[0]);
putch(data[1]);
}
//ISR Interrupt
static void interrupt
isr(void){}
/*
* FUNCION PRINCIPAL
*/
void main(void){
TRISA=0X01; //RA0 COMO ENTRADA ANALOGA
TRISC=0X80; //SE CONFIGURAMOS TX Y RX
/*
* CONFIGURAMOS SERIAL
* VALUE=(FOSC/(BAUD*16))-1
* SIN INTERRUPCIONES
* A 19200
*/
OpenUSART(64,OFF,OFF);//64=19200
/*
* CONFIGURAMOS ADC
* PUERTOB DESACTIVADO PARA ENTRADAS ANALOGAS
* SOLO SE ACTIVA EL RA0 COMO ENTRADA ANALOGA
*/
OpenADC(FOSC_32,AN0,OFF);
GIE=0;//INTERRUPCIONES GLOBALES ACTIVADAS
PEIE=0;//ACTIVA INTERURPCIONES POR PERIFERICOS
/*
* EMPIEZA EL PROGRAMA PRINCIPAL
*/
while(1){
value_adc=take_data_analog();//TOMA DATO ANALOGO
convert_two_byte(value_adc); //CONVIERTE A DOS BYTES
send_data_rs232(); //ENVIA DATOS
}
}
Como hemos estado viendo en los proyectos anteriores siempre se debe de configurar
el puerto y los baudios que es lo ms bsico para empezar, ya si el usuario quiere
cambiar ms opciones lo puede hacer. Por ahora como vamos a recibir datos debemos
de crear un evento, que es esperar por 10s un carcter del rs232, al recibir estos datos
rpidamente debe leerlos y mandarlos a procesar que no es ms que juntar los dos
bytes y enviarlo a graficar.
Siempre una buena presentacin del programa puede ayudar mucho a la hora de
comercializar un software, por eso nunca deje la presentacin su proyecto a un lado.
1.2.3 Diagrama Electrnico
3. Control de Intensidad de lmpara
fig 3.0
Un triac es un interruptor de estado slido, una pequea corriente en la terminal de la
puerta puede conducir una gran corriente, pensando que un triac como dos SCR
puesto en paralelo invertido cada uno de ellos, donde el ctodo de uno de los SCR est
conectado hacia el nodo del otro y viceversa. La puertas estn conectadas juntas,
porque tenemos dos tipos configuracin de SCRs esto permite activar amos a medios
ciclos.
Y cuando se desee usar las dos partes de la onda se recomiendo un opto con cruce
por cero.
3.1 Control de Lmpara
El programa consta de solo recibir un dato de Labview y reaccionar con forme a ello, el
dato ser solo de un 1 byte y que solo responda con un comando cuando hay que
encenderlo o apagarlo, para ello se usara la interrupcin por recepcin de datos.
/*
* File: MAIN.c
* Author: george
*
* Created on November 24, 2011, 8:53 PM
*/
#include "pic.h"
__CONFIG(FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_OFF & CPD_OFF & BOREN_OFF
& IESO_OFF & FCMEN_OFF & LVP_OFF & DEBUG_OFF & BOR4V_BOR40V & WRT_OFF);
/*
* FOSC_HS 20Mhz External Crystal
* WDTE_OFF Watch dog disable
* PWERTE_ON Power System Enable
* MCLRE_ON Master Clear Enable
*/
#define _XTAL_FREQ 20000000 //
#include "libUSART/usartdr.h"
//definiciones de variables globales
unsigned char DATA;
//definiciones de trabajo
#define LAMPARA_ON RB7=1
#define LAMPARA_OFF RB7=0
//ISR Interrupt
static void interrupt
isr(void){
if(RCIF){ //HEMOS RECIBIDO UN DATO?
RCIF=0; //RESET A FLAG DE INTERRUPCION DE DATO
DATA=getch();//TOMAMOS DATO
if(DATA==0xFF){//ES PARA ENCENDER?
LAMPARA_ON;
}
if(DATA==0x77){//ES PARA APAGAR
LAMPARA_OFF;
}
}
}
/*
* FUNCION PRINCIPAL
*/
void main(void) {
TRISB=0; //PUERTO B COMO SALIDA
TRISC=0X80; //SE CONFIGURAMOS TX Y RX
PORTB=0;
/*
* CONFIGURAMOS SERIAL
* VALUE=(FOSC/(BAUD*16))-1
* SIN INTERRUPCIONES
* A 19200
*/
OpenUSART(64,OFF,ON);//64=19200
GIE=1;//ACTIVAMOS INTERRUPCIONES GENERALES
PEIE=1;//ACTIVAMOS INTERRUPCIONES POR PERIFERICOS
while(1);
}
La estrategia a seguir que al usar un interruptor virtual que solo mande verdadero o
falso, con este dato booleano entrara a un case structure del cual este elegir que dato
debe de enviar, en este caso como hemos programado en el Microcontrolador que al
recibir el dato 0xFF mande a prender la lmpara sino el dato 0x77 para apagar la
lmpara.
En la parte de front panel podemos hacer unos cuantos arreglos para que nuestro
programa quede bien hecho.
3.1.3 Diagramas
Entrada para el
PIC
Al realizar el siguiente circuito en la salida del transistor debemos de tener una onda
cuadra de 0 a 5v, del cual este entrara al Microcontrolador para decir cuando esta el
ciclo positivo y cuando est en el ciclo negativo.
Escala 2 volts.
El software es el siguiente:
/*
* File: main.c
* Author: george
*
* Created on November 29, 2011, 8:14 PM
*/
#include "pic.h"
__CONFIG(FOSC_HS& WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_OFF & CPD_OFF & BOREN_OFF
& IESO_OFF & FCMEN_OFF & LVP_OFF & DEBUG_OFF & BOR4V_BOR40V & WRT_OFF);
/*
* FOSC_HS 20Mhz External Crystal
* WDTE_OFF Watch dog disable
* PWERTE_ON Power System Enable
* MCLRE_ON Master Clear Enable
*/
#define _XTAL_FREQ 20000000 //
#include "libUSART/usartdr.h"
/*
* VARIABLES GLOBALES DE TRABAJO
*/
unsigned char senal;
/*
* FUNCION DE TIEMPO
*/
void dly(unsigned int t){
while(--t)__delay_ms(1);
}
/////////////////////////////////////////////////
//Funcion de interrupcion
//Si no se usa simplemente no hacemos nada...
//Esto sirve para direccionar lo los datos
//en un lugar muy cercano al Inicio de la memoria
//de datos
////////////////////////////////////////////////
static void interrupt
isr(void){}
/*
* PROGRAMA PRINCIPAL
*/
void main(void) {
/*
* Inicliazamos Puertos
*/
ANSELH=0X00;//Analogo desactivado
TRISA=0x10; //RA4 como entrada resto salida
TRISC=0x80;//
ADCON0=0x00;//
/*
* Inicializamos TIMER0
* Entrada de senal extarna,Prescalar 1:2
*/
OPTION_REG=0b10100000;
/*
* CONFIGURAMOS SERIAL
* VALUE=(FOSC/(BAUD*16))-1
* SIN INTERRUPCIONES
* A 19200
*/
OpenUSART(64,OFF,OFF);//64=19200
TMR0;
GIE=0;
PEIE=0;
while(1){
TMR0=0; //Reseteamos Contador
dly(1000); //Esperamos 1 Segundo
senal=TMR0;//Leemos El contador
putch(senal);//Enviamos dato
}
}
El programa en Labview es demasiado sencillo, del cual solo debe de recibir un dato (1
byte) este dato debemos de convertirlo a string, ya que hemos referenciado que el dato
recibido es un dato de Hz, del cual se debe juntar dos string por esta razn se usa la
funcin, concatnate para unir el dato + Hz
En front Panel podemos ver cmo queda
nuestro programa, lo que debemos hacer
primer es Iniciar Labview y despus
conectar rpidamente el hardware que es
el Microcontrolador.
P. 1
P.2
P.3
Para controlar la onda senoidal se debe de rectorar ambas ondas positiva y negativa
para hacer eso se debe de generar un PWM de la misma frecuencia pero cuadrada, del
cual esta seal PWM debe de recortar la onda exactamente cundo cruce por cero.
He recortado la onda de inicio tanto para la positiva y negativa porque ya que la onda
est decayendo el resultado es menor potencia del cual se reflejara en intensidad, y
podemos ver mucho mejor el descenso de la iluminacin de la lmpara. Ya que si fuera
al contrario no veremos mucho el cambio que realiza de intensidad ya que como la
onda empieza a subir tiene mayor potencia y aunque variemos el PWM al principio de
la onda este no reflejara mucho el cambio de intensidad de la lmpara.
Como hemos realizado en la segunda prctica de este proyecto al obtener los ciclos o
los hertz de la corriente alterna, al usar ese mtodo podemos sincronizar la frecuencia
PWM con la onda senoidal, ya que al cruzar por cero podemos apagar el optoacoplador
exactamente e iniciar el pulso PWM donde deseamos y cuando vuelva a cruzar por
cero apagamos y esperamos a iniciar el pulso para que de la lmpara encienda, y
obtendremos un ancho de pulso proporcional a la frecuencia de VCA.
El firmware del Microcontrolador es muy sencillo usando l interrupcin por recepcin de
datos (Rs232) y la interrupcin por desbordamiento por timer0, podemos hacer esta
prctica:
/*
* File: main.c
* Author: george
*
* Created on December 3, 2011, 1:45 PM
*/
#include "pic.h"
__CONFIG(FOSC_HS& WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_OFF & CPD_OFF & BOREN_OFF
& IESO_OFF & FCMEN_OFF & LVP_OFF & DEBUG_OFF & BOR4V_BOR40V & WRT_OFF);
/*
* FOSC_HS 20Mhz External Crystal
* WDTE_OFF Watch dog disable
* PWERTE_ON Power System Enable
* MCLRE_ON Master Clear Enable
*/
#define _XTAL_FREQ 20000000 //
#include "libTIMER0/OpenTIMER0.h"
#include "libUSART/usartdr.h"
/*
* DEFINICIONES GLOBALES
*/
#define PIN_INTENSIDAD RC0
/*
* VARIABLES GLOBALES
*/
unsigned char BUFFER=127;
/////////////////////////////////////////////////
//Funcion de interrupcion
//Si no se usa simplemente no hacemos nada...
//Esto sirve para direccionar lo los datos
//en un lugar muy cercano al Inicio de la memoria
//de datos
////////////////////////////////////////////////
static void interrupt
isr(void){
if(T0IF){
T0IF=0;
PIN_INTENSIDAD=1;
T0IE=0;
}else if(RCIF){
RCIF=0;
BUFFER=getch();
}
}
/*
* PROGRAMA PRINCIPAL
*/
void main(void) {
/*
* CONFIGURAMOS PUERTOS
*/
TRISA=0X10; //RA4 COMO ENTRADA RESTO SALIDA
TRISC=0X80; //RC7 COMO ENTRADA Y RC6 COMO SALIDA
ANSELH=0X00; //PORTB DIGITAL
ADCON0=0X00; //APAGAMOS CONVERTIDOR ANALOGO
CM1CON0=0x00;
CM2CON0=0x00;
/*
* Configuramos Timer 0
* FORMULA:
* TMR0=256-{TIEMPO_DESEADO/[(1/(_XTAL_FREQ/4)*PRESCLAR]}
* Tiempo Requerido T=0.004 s
* Valor del timer 0 a cargar = 50
*/
OpenTIMER0(prescalar_256,OFF);
/*
* CONFIGURAMOS SERIAL
* VALUE=(FOSC/(BAUD*16))-1
* SIN INTERRUPCIONES
* A 19200
*/
OpenUSART(64,OFF,ON);//64=19200
GIE=1; //TODAS LAS INTERRUPCIONES APAGADAS
PEIE=1; //TODAS LAS INTERRUPCIONES POR PERIFERICOS APAGADAS
while(1){
if(RA4==1){
TMR0=BUFFER;
T0IE=1;
PIN_INTENSIDAD=0;
while(RA4==1);
TMR0=BUFFER;
T0IE=1;
PIN_INTENSIDAD=0;
while(RA4==0);
}
}
}
Al enviar un dato de 0 a 255 este valor al ser cargado a la variable BUFFER carga
automticamente al registro TMR0 del timer0 del cual indica cuando hay que
interrumpir para prender el led del optoacoplador, esto realizndose a 60Hz del cual el
PWM ser del mismo valor de la frecuencia de VCA.
Foto del Proyecto
Diagrama:
RETOS:
Esta seccin usted deber de realizar las siguientes practicas que involucren un enlace
con Labview, estar a prueba para conocer si usted all entendido correctamente las
practicas anteriores:
1.- Visualice y un dato anlogo que usted desee, como puede ser un sensor de
temperatura, sensor de proximidad o lo que usted desee, solo que al leer un dato que
este fuera del rango seale cuando este en bajo nivel o alto.
2.- Manipule dos lmpara de 127 VCA del cual pueda ajustar la intensidad de cada uno
de ellos por separado.
Nota: Cuando trabaje con 127 VCA tenga mucho cuidado a la hora de conectar o
tener un corto circuito, ya que habla con una de las corrientes ms peligrosas.
Realizado por
George arth
Pagina
http://ucursos.webs.com
http://ucursos.blogspot.com