Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
DIVISIÓN
MECATRÓNICA - AUTOMATIZACIÓN
ASIGNATURA
MICROCONTROLADORES
PORTAFOLIO DE EVIDENCIAS
PROFESOR
MARTINNEZ TLALPA GONZALO
ALUMNA
CAMACHO ÁLVAREZ SANDRA
GRUPO
5°F
1
Índice
Introducción...............................................................................................................3
Lenguajes de programación ..................................................................................3
Ventajas de lenguajes de programación de alto nivel ...........................................4
Lenguaje C ............................................................................................................5
Practica 5 Motor A Pasos ..........................................................................................6
Marco Teórico........................................................................................................6
Motores unipolares ................................................................................................7
Motores bipolares ..................................................................................................7
Practicas ................................................................................................................9
Practica 6 pantalla de cristal líquido (LCD) .............................................................11
Marco Teórico......................................................................................................12
¿Como es su conexionado? ................................................................................12
Practica ...................................................................................................................14
Practica 7 Analog-to-digital converter (ADC) ..........................................................18
Marco Teórico......................................................................................................18
Practicas .................................................................................................................21
Practica 8 Teclado Matricial 4X4 .............................................................................26
Practicas .................................................................................................................28
Practica 9 Timer 0 ...................................................................................................32
Marco Teórico......................................................................................................32
Practicas .................................................................................................................34
Practica 10 Comunicación Serial ............................................................................41
Marco Teórico......................................................................................................41
LabVIEW .............................................................................................................43
Practicas .................................................................................................................44
Practica 11 pulse-width modulation (PWM).............................................................47
En los motores ...................................................................................................47
Practicas .................................................................................................................49
2
Conclusión ..............................................................................................................50
Introducción
Lenguajes de programación
3
aparentemente sin significado. Dependiendo de la arquitectura del
microcontrolador, el código binario está compuesto por palabras de 12, 14 o 16 bits
de anchura. Cada palabra se interpreta por la CPU como una instrucción a ser
ejecutada durante el funcionamiento del microcontrolador. Todas las instrucciones
que el microcontrolador puede reconocer y ejecutar se les denominan
colectivamente Conjunto de instrucciones. Como es más fácil trabajar con el sistema
de numeración hexadecimal, el código ejecutable se representa con frecuencia
como una serie de los números hexadecimales denominada código Hex. En los
microcontroladores PIC con las palabras de programa de 14 bits de anchura, el
conjunto de instrucciones tiene 35 instrucciones diferentes.
Lenguaje C
5
propósito de uso del microcontrolador. C es un lenguaje compilado, lo que significa
que los archivos fuentes que contienen el código C se traducen a lenguaje máquina
por el compilador. Todas estas características hicieron al C uno de los lenguajes de
programación más populares.
Marco Teórico
6
Motores unipolares
Estos motores cuentan con dos bobinas con un punto medio de los cuales salen los
cables hacia el exterior; estos cables se conectan a la fuente mientras que los
extremos de las bobinas son aterrizadas para cerrar el circuito; dependiendo del tipo
de motor, las líneas comunes pueden ser independientes o no. Esta configuración
puede ser vista de las siguientes formas: que el motor tiene dos bobinas pequeñas
conectadas a un punto en común, o que una bobina está divida en dos por medio
de un punto común. Ahora, y dependiendo de qué media bobina se energice, se
puede tener un polo norte o un polo sur; si se energiza la otra mitad, se obtiene un
polo opuesto al otro. En la Ilustración 0 se muestra un esquema representativo del
motor a pasos unipolar.
Un motor unipolar de 5 cables es así porque los cables intermedios están unidos en
un sólo nodo -ver la Ilustración 1- mientras que el motor unipolar de 6 cables tiene
un cable de alimentación para cada par de bobinas -ver Ilustración 2-
Motores bipolares
Cuentan con dos bobinas sin ningún punto medio donde salga un cable, por lo que
se tienen cuatro cables y cada par corresponde a las terminales de una bobina
7
Ilustraciones 3 y 4- Dada la configuración de la bobina, la corriente puede fluir en
dos direcciones, necesitando un control bidireccional o bipolar. En general, con
respecto al sentido de giro de los motores a pasos bipolares, vale la pena recordar
que el sentido de giro depende de la dirección del flujo de la corriente por las bobinas
ya que ésta induce en el embobinado un campo magnético que genera un polo
magnético norte y sur, de ahí que el rotor se mueva para que uno de los polos del
rotor sea opuesto al de la bobina -localizado en el estator-, como se muestra en la
Ilustración 3.
#include <16f877a.h>
#fuses xt, nowdt
#use delay (crystal=4Mhz)
#use fast_io(c)
#use fast_io(d)
while(true){
if(input(pin_c0)==1){
while(1){
if(input(pin_c4)==1) break;
output_high(pin_d0);
delay_ms(10);
output_low(pin_d0);
delay_ms(10);
9
output_high(pin_d1);
delay_ms(10); output_low(pin_d1);
delay_ms(10);
output_high(pin_d2);
delay_ms(10); output_low(pin_d2);
delay_ms(10);
output_high(pin_d3);
delay_ms(10); output_low(pin_d3);
delay_ms(10);
}
else{
output_low(pin_d0);
output_low(pin_d1);
output_low(pin_d2);
output_low(pin_d3);
if(input(pin_c1)==1){
while(1){
if(input(pin_c4)==1) break;
output_high(pin_d3);
10
delay_ms(10);
output_low(pin_d3);
delay_ms(10);
output_high(pin_d2);
delay_ms(10); output_low(pin_d2);
delay_ms(10);
output_high(pin_d1);
delay_ms(10); output_low(pin_d1);
delay_ms(10);
output_high(pin_d0);
delay_ms(10); output_low(pin_d0);
delay_ms(10);
}
else{
output_low(pin_d0);
output_low(pin_d1);
output_low(pin_d2);
output_low(pin_d3);
11
Marco Teórico
¿Como es su conexionado?
Pines de alimentación:
Vss: Gnd
Vdd: +5 voltios
Vee: corresponde al pin de contraste, lo regularemos con un potenciómetro de 10K
conectado a Vdd.
Pines de control:
12
RS: Corresponde al pin de selección de registro de control de datos (0) o registro
de datos(1). Es decir el pin RS funciona paralelamente a los pines del bus de
datos. Cuando RS es 0 el dato presente en el bus pertenece a un registro de
control/instrucción. y cuando RS es 1 el dato presente en el bus de datos
pertenece a un registro de datos o un carácter.
RW: Corresponde al pin de Escritura(0) o de Lectura(1). Nos permite escribir un
dato en la pantalla o leer un dato desde la pantalla.
E: Corresponde al pin Enable o de habilitación. Si E(0) esto quiere decir que el
LCD no esta activado para recibir datos, pero si E(1) se encuentra activo y
podemos escribir o leer desde el LCD.
¿DDRAM y CGROM?
La memoria CGROM es una memoria interna donde se almacena una tabla con los
caracteres que podemos visualizar en el lcd. En la imagen podemos ver un ejemplo
de la tabla con un contenido de 192 caracteres.
13
#define LCD_ENABLE_PIN PIN_D0
#define LCD_RS_PIN PIN_D1
#define LCD_RW_PIN PIN_D2
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7
lcd_putc: nos muestra un dato en la siguiente posición del lcd, podemos emplear
funciones como \f para limpiar el display, \n cambio a la segunda línea, \b mueve
una posición atrás.
Practica
1. Contador
#include <18f4550.h>
#fuses xt, nowdt
#use delay(crystal=4Mhz)
#use fast_io(d)
#include <lcd.c>//Libreria para el manejo del LCD float
A=0;
14
void main(void)
{ lcd_init(); //Inicia LCD
lcd_gotoxy(2,1); //Columna 3 fila 1
lcd_putc(" DIEGO VICTOR"); //Escribe "DIEGO ORTIZ"
lcd_gotoxy(5,2); //Columna 5 fila 1 lcd_putc("
Contador"); //Escribe "Contador" delay_ms(2000);
// Retardo lcd_putc("\f"); // Limpia pantalla
lcd_putc("Conteo:\n"); // Salta de Linea y Escribe"Conteo:"
while(true)
{
15
2. Recorrimiento de palabras
#include <16f877a.h>
#fuses xt, nowdt
#use delay(crystal=4Mhz)
#include <lcd.c>
#use fast_io(d)
int i;
void main(){
set_tris_d(0x00); lcd_init();
while(true){ lcd_gotoxy(5,1);
printf(lcd_putc,"CURSO UTP");
lcd_gotoxy(4,2);
printf(lcd_putc,"MECATRONICA");
delay_ms(5000);
16
for(i=0;i<=16;i++){ lcd_gotoxy(4,1);
lcd_putc("PRACTICA 6"); lcd_gotoxy(i,2);
printf(lcd_putc,"DIEGO MICHAEL ORTIZ");
delay_ms(500); lcd_putc("\f");
}
for(i=16;i>=1;i--){
lcd_gotoxy(4,1);
printf(lcd_putc,"PRACTICA 6");
lcd_gotoxy(i,2);
printf(lcd_putc,"VICTOR POPOCA");
delay_ms(500); lcd_putc("\f");
}
}
17
Practica 7 Analog-to-digital converter (ADC)
Marco Teórico
El CAD conversor analógico digital PIC (no todos los PIC lo tienen, para los ejemplos
se utilizará el PIC16F877A), permite medir señales analógicas en forma digital, para
ello el PIC cuenta con pines por donde le llegará la señal analógica, estos pines
deben configurarse como entradas analógicas, el conversor analógico digital PIC
cuenta con un circuito que carga un condensador interno al PIC con la tensión
analógica que le está llegando a la entrada analógica, luego la tensión almacenada
en el condensador lo convierte en un número binario de 10 bits que representará la
tensión almacenada en el condensador, este número binario se guarda en sus
registros ADRESH y ADRESL de 8 bits cada uno pero estos actúan como un solo
registro de 16 bits, en el registro ADRESH se guardan los bits mas significativos y
en el registro ADRESL se guardan los bits menos significativos, el número que
representa la tensión almacenada en el condensador y guardado en forma binaria
dentro de estos registros será de 10 bits para el PIC16F877A, la cantidad de bits de
este número depende del conversor analógico digital PIC del microcontrolador PIC
utilizado.
Los registros de control del ADC en un PIC (familia 18F 2520/4520)
Para estos ejemplos voy a usar código para la familia PIC18F2520/4520 con algunos
comentarios sobre la familia 252/452. El conversor AD es una de los módulos de un
PIC donde hay más diferencias entre modelos: distintos número de canales AD,
diferentes formas de programar que canales son digitales o analógicos, la
posibilidad o no de programar tiempos de adquisición, etc.
Esto hace que la configuración del ADC sea bastante dependiente del modelo y
siempre sea bueno tener a mano la documentación ante comportamientos
inesperados. Por ejemplo, los registros asociados al puerto serie son los mismos
entre una amplia gama de dispositivos. Por el contrario, es fácil que el número de
registros de configuración cambie entre modelos.
Además de los registros de control tenemos otros dos registros ADRESH y ADRESL
(AD result High/Low) donde se guarda el resultado de la conversión, pero estos si
son comunes entre dispositivos.
18
Veamos un resumen de estos registros (de nuevo, los datasheet de Microchip son
los mejores manuales de usuario):
CHS: selecciona cual de los posibles 13 canales analógicos se conecta al ADC para
medir.
VCFG1: por defecto (0) usamos Vss=Gnd=0V como Vref-. Si es 1 se tomara como
Vref- el voltaje presente en AN2.
VCFG0: Lo mismo que el anterior pero para Vref+. Por defecto usaremos Vdd
(alimentación, típicamente 5 o 3.3V) como Vref+. Si es 1 se usa el voltaje presente
en AN3 como Vref+.
19
cuales permanecen como canales digitales. Los valores posibles van desde 0000
(todos analógicos) a 1111 (todos digitales).
Los canales analógicos se denotan en la documentación como AN0, AN1, AN2, etc.
Los dispositivos con 8 canales (252/452) los reparten entre el puerto A y el E. Los
que tienen 13 canales usan también parte del puerto B (2520/4520). Mirar la
documentación, porque el orden no es consecutivo. Por ejemplo, para el 4520
Can AN AN AN AN AN AN AN AN AN AN AN AN AN
al 0 1 2 3 4 5 6 7 8 9 10 11 12
Pin RA RA RA RA RA RE RE RE RB RB RB RB RB
0 1 2 3 5 0 1 2 2 3 1 4 0
El caso ADFM=0 se suele usar si sólo queremos los 8 bits más significativos. En
ese caso basta hacer: res = ADRESH;
20
El modo manual (000) era la norma entre familias anteriores, que de hecho no
contaban con estos bits de configuración. En la familia 2520/4520 es posible
programar dicho tiempo de espera. De esta forma tras seleccionar el canal podemos
inmediatamente lanzar la conversión (ADCON0.GO=1) y el módulo esperara el
tiempo programado antes de iniciar la conversión. Esto permite optimizar el
aprovechamiento del ADC como veremos.
ADCS: seleccionan la velocidad del reloj del ADC como una fracción (div = 2, 4, 8,
16, 32, 64) del reloj principal (aunque también es posible asociarlo a un oscilador
RC independiente). El inverso de la frecuencia del ADC determina el llamado Tad,
que viene a ser el tiempo dedicado a obtener cada bit del resultado:
Obviamente deberíamos escoger un divisor bajo para obtener la frecuencia más alta
(Tad más pequeño) posible para tardar lo menos posible en cada conversión. Sin
embargo hay una limitación: el Tad no puede ser menor que un cierto tiempo mínimo
dependiente del modelo. Por ejemplo para la familia 252/452 se recomienda que
Tad sea como mínimo 1.6 usec. En cambio para la 2520/4520 podemos bajar a 0.75
usec.
1:32 si tenemos un 452, ya que Tad = div / Fosc = 32/20 Mhz = 1.6 usec =
recomendado
1:16 si tenemos un 4520 ya que Tad = div / Fosc = 16/20 MHz = 0.8 usec > 0.75
usec recomendados
Practicas
21
1. ADC con LM35 #include
<18f4550.h>
#device adc = 10
#fuses xt, nowdt
#use delay(crystal= 4Mhz)
#include <lcd.c>
long d; float
h; void
main(){
set_tris_d(0x00); setup_adc_ports(an0);
setup_adc(adc_clock_internal);
lcd_init();
while(true){
set_adc_channel(0); delay_ms(1);
d = read_adc(); h = d* 0.4882;
lcd_gotoxy(1,1); printf(lcd_putc,"ADC
=%4Ld" ,d); lcd_gotoxy(1,2);
printf(lcd_putc,"Temperatura=%1.2f",h);
22
int16 x,y,num,h,j,adc,adc2,res; float
res3,a,b;
void main(){
lcd_init(); set_tris_d(0x00);
set_tris_b(0xFF);
SETUP_ADC(ADC_CLOCK_INTERNAL);
SETUP_ADC_PORTS(all_analog);
while(true){
h=input(pin_b0);
j=input(pin_b1);
delay_ms(20);
23
num=(h*1)+(j*2); switch
(num)
{
case 0: /*SUMA*/
lcd_gotoxy(1,1); lcd_putc("\f");
printf(lcd_putc,"Suma"); res = x + y;
lcd_gotoxy(1,2); printf(lcd_putc,"%ld
+%ld =%ld",x,y,res); delay_ms(3000);
break;
case 1:
/*RESTA*/
lcd_gotoxy(1,1);
lcd_putc("\f");
printf(lcd_putc,"Resta");
res = x - y; lcd_gotoxy(1,2);
printf(lcd_putc,"%ld -%ld
=%ld",x,y,res);
delay_ms(3000); break;
case 2:
/*MULTIPLICACION*/
lcd_gotoxy(1,1); lcd_putc("\f");
printf(lcd_putc,"Multiplicacion"); res = x
* y; lcd_gotoxy(1,2);
24
printf(lcd_putc,"%ld x%ld =%ld",x,y,res);
delay_ms(3000); break;
case 3:
/*DIVISION*/
SET_ADC_CHANNEL(0);
delay_us(20);
adc= read_adc();
a=(5 * adc)/51;
SET_ADC_CHANNEL(1);
delay_us(20);
adc2= read_adc();
b=(5 * adc2)/51;
lcd_gotoxy(1,1);
lcd_putc("\f");
lcd_putc("DIVISION: ");
res3=a/b; if((a>0 &&
b==0)||(a==0 && b==0)){
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("DIVISION: ");
lcd_gotoxy(1,2);
printf(lcd_putc,"%.1f/%.1f=
Error",a,b);
delay_ms(3000);
25
} else{ lcd_gotoxy(1,2);
printf(lcd_putc,"%.1f/%.1f=%.1f",a,b,res3);
delay_ms(1000);}
break;
default:
output_d(0x00);
delay_ms(100); break;
}
}
}
26
Las resistencias de pull-up del puerto B se habilitan poniendo en 0 el bit NOT_RBPU
del registro OPTION_REG.Al método aqui expuesto para detectar la pulsación de
una tecla en un teclado matricial se le conoce como muestreo secuencial. Existen
otros, sin embargo esté es tal vez el más sencillo. En el siguiente ejemplo cada tecla
del teclado matricial tiene un valor de 0 a F, valor que se despliega en un display de
7 segmentos. El el código necesario para leer un teclado matricial con un
microcontrolador pic 16f628 es el siguiente.
Existen otros métodos de manejar teclados matriciales, pero creo que ésta es la
más sencilla. Para terminar una imágen del circuito:
27
Practicas
1. Cerradura Electrónica
#include <16f877a.h>
#fuses xt, nowdt
#use delay(crystal= 4Mhz)
#define lcd_data_port getenv("sfr:portd")//Se declara que del pin d4 al d7 sera para
los datos
#define lcd_enable_pin pin_d0
#define lcd_rs_pin pin_d1
#define lcd_rw_pin pin_d2
#define use_portb_kbd true //Se utilizara el puerto b para el teclado matricial
#include <lcd.c>
#include <kbd4x4.c> //Libreria para amnejar Teclado 4x4
#rom 0x2100 = {'1','3','0','3'} //Escribir en la memoria eeprom
void main(){ set_tris_c(0x00); int i; //Es un contador int j=0;
char d; //Lectura del kbd
char dato[4], clave[4]; //Dato almacena los digitos, clave es la contraseña
port_b_pullups (true); lcd_init(); kbd_init();
for(;;){
lcd_putc("\f BIENVENIDO");
lcd_putc("\n USUARIO");
delay_ms(1500);
lcd_putc("\fINGRESE LA
CLAVE");
output_low(pin_d3);
output_low(pin_c1);
i=0;
28
while(i<4){ d
= kbd_getc(); if
(d!=0){
dato[i] = d;
i++;
lcd_gotoxy(i,2);
lcd_putc('*');
}
j=0;
}
else{
29
lcd_putc("\fCLAVE INCORRECTA");
lcd_putc("\nACCESO DENEGADO");
j++; if(j==1){ lcd_putc("\f
Intento 1"); lcd_putc("\n accso
invalido");
} if(j==2){ lcd_putc("\f
Intento 2"); lcd_putc("\n
WARNING!");
delay_ms(300);
}
if(j==3){
lcd_putc("\f BLOQUEADO");
delay_ms(60000);
j=0;
}
output_high(pin_c1);
output_low(pin_d3); delay_ms(2000);
}
30
31
Practica 9 Timer 0
Marco Teórico
Pero el PIC también permite que se produzca una interrupción por desbordamiento
del TMR0.
Cuando se produce una interrupción el programa abandona temporalmente lo que
estaba haciendo para atender la subrutina de interrupción, pero antes guarda en
32
una región especial de la memoria llamada pila la dirección de la siguiente
instrucción de programa, para que cuando acabe la subrutina de interrupción pueda
seguir ejecutando el programa por donde se había quedado.
El registro que configura todas las interrupciones es el INTCON, como veis está
mapeado en los dos bancos, una cosa muy útil cuando se trabaja en ensamblador
para no tener que cambiar de banco constantemente para su configuración, pero
que en C no es necesario saber ya que es el compilador el que se encarga de
gestionar esto de una manera transparente para el programador.
Pues bien vamos a ver lo que significa cada uno de los bits que están implicados
en la interrupción por el TMR0:
• TOIF: solo se puede leer su valor, es un Flag o bandera que se pone a “1”
cuando se produce un desbordamiento del TMR0, (este o no este configurado
para producir una interrupción). Cuando se trabaja en Ensamblador, este bit
hay que ponerlo a "0" por programa, con CCS no tenemos que preocuparnos
por ello. (je, je,.. otra cosa que nos ahorramos)
• TOIE (Habilita la interrupción por desbordamiento de TMR0). Si este bit esta
a "1" la interrupción por desbordamiento de TMR0 es posible.
• GIE (Habilita las interrupciones globalmente). Este bit permite que cualquier
interrupción sea posible. Para poder usar cualquier interrupción hay que
habilitarla globalmente e individualmente.
Bueno como veis hay varias variables que podemos utilizar a nuestro antojo para
utilizar este recurso del PIC, la fórmula que las relaciona es la siguiente:
Y para ver como funciona todo esto con el compilador CCS vamos hacer el
siguiente ejemplo:
Se trata de usar el Timer0 para generar una interrupción cada 32 ms utilizando el
reloj interno del microcontrolador. La función de interrupción se utilizará para hacer
parpadear un Led en la patilla RB7 del PIC.
Para ello vamos a utilizar en el circuito un cristal de cuarzo de 4 MHz.
Si nos fijamos en la formula anterior tenemos Interrupt_TMR0= 32 ms que es el valor
que nos da el ejemplo, también tenemos F.Oscilador = 4 MHz y nos quedan dos
valores para tener resueltas todas las variables de la ecuación el valor TMR0 que
ya hemos dicho que se puede sobrescribir su valor en cualquier momento durante
la ejecución del programa y el Prescaler, pues le damos el valor que queramos al
Prescaler por ejemplo 256 y calculamos en la fórmula el valor que tenemos que
escribir en el registro TMR0 para obtener los 32 ms:
33
Practicas
#int_timer0 void
timer_0()
{
tiempo=tiempo+1;
if(conta==tiempo) {
output_low(PIN_A0);
}
if(tiempo==40)
{output_high(PIN_A0); tiempo=0;
}
set_timer0(65510);//0.5ms
}
34
void main()
{
setup_timer_0(rtcc_internal|rtcc_div_16);
set_timer0(65510);
enable_interrupts(int_timer0);
enable_interrupts(global); while(true)
{
servo(0);
delay_ms(2000);
servo(90);
delay_ms(2000);
servo(180);
delay_ms(2000);
}
}
35
tiempo=tiempo+1;
tiempo1=tiempo1+1;
if(conta==tiempo)
{
output_low(pin_d0);
}
if(conta1==tiempo1)
{
output_low(pin_d1);
}
if(tiempo==40)
{
output_high(pin_d0);
tiempo=0;
}
if(tiempo1==40)
{
output_high(pin_d1);
tiempo1=0;
}
set_timer0(65510);//0.1ms
}
36
if(grados==180) conta=5;
if(grados==90) conta=3; if(grados==0)
conta=1;
}
if(grados1==90) conta1=3;
if(grados1==0) conta1=1;
if(grados1==180) conta1=5;
}
void main()
{
set_tris_d(0x00); setup_timer_0(rtcc_internal|rtcc_div_16);
set_timer0(65510); enable_interrupts(int_timer0); enable_interrupts(global);
while(true)
{
servo(180);
delay_ms(2000);
servo2(90);
delay_ms(2000); servo(90);
delay_ms(2000); servo2(0);
delay_ms(2000);
37
}
}
if(conta==tiempo) {
output_low(PIN_A0);
}
if(tiempo==40)
{output_high(PIN_A0); tiempo=0;
38
}
set_timer0(65510);//0.5ms
}
void main()
{
setup_timer_0(rtcc_internal|rtcc_div_16);
set_timer0(65510);
enable_interrupts(int_timer0);
enable_interrupts(global); lcd_init();
kbd_init(); set_tris_a(0x00);
port_b_pullups(true); inicio:
lcd_putc("\f Bienvenido ");
lcd_putc("\n Usuario");
delay_ms(1500);
lcd_putc("\fGrados Deseados:\n");
x=0; while(true)
{
39
while(d!='#'){
while(x!=3){
d=kbd_getc(); if(d!=0){
ser[x]=d; ser1[x]=d;
ser2[x]=d; x++;
lcd_gotoxy(x,2);
printf(lcd_putc,"%c",d);
}
if(d=='*'){ goto
inicio;
}
}
d = kbd_getc();
}
if(ser[0]==vector[0]&&ser[1]==vector[1]&&ser[2]==vector[2]){
servo(0);
lcd_putc("\f Posicion\n");
lcd_putc(" 0 Grados");
delay_ms(2000); x=0;//Se iguala a
cero para que reinicie el proceso
d=0;//Se iguala a cero para que reinicie
el proceso goto inicio;
}
if(ser1[0]==vector1[0]&&ser1[1]==vector1[1]&&ser1[2]==vector1[2]){
servo(90);
40
lcd_putc("\f Posicion\n");
lcd_putc(" 90 Grados");
delay_ms(2000); x=0;
d=0; goto inicio;
}
if(ser2[0]==vector2[0]&&ser2[1]==vector2[1]&&ser2[2]==vector2[2]){
servo(180); lcd_putc("\f Posicion\n"); lcd_putc(" 180 Grados");
delay_ms(2000); x=0; d=0; goto inicio;
}
}
}
Marco Teórico
La comunicación serial es un protocolo muy común (no hay que confundirlo con el
Bus Serial de Comunicación, o USB) para comunicación entre dispositivos que se
incluye de manera estándar en prácticamente cualquier computadora. La mayoría
de las computadoras incluyen dos puertos seriales RS-232. La comunicación serial
es también un protocolo común utilizado por varios dispositivos para
instrumentación; existen varios dispositivos compatibles con GPIB que incluyen un
puerto RS-232. Además, la comunicación serial puede ser utilizada para adquisición
de datos si se usa en conjunto con un dispositivo remoto de muestreo.
41
ASCII. Para realizar la comunicación se utilizan 3 líneas de transmisión: (1) Tierra
(o referencia), (2) Transmitir, (3) Recibir. Debido a que la transmisión es asincrónica,
es posible enviar datos por un línea mientras se reciben datos por otra. Existen otras
líneas disponibles para realizar handshaking, o intercambio de pulsos de
sincronización, pero no son requeridas. Las características más importantes de la
comunicación serial son la velocidad de transmisión, los bits de datos, los bits de
parada, y la paridad. Para que dos puertos se puedan comunicar, es necesario que
las características sean iguales.
42
bits de datos) a un valor para asegurarse que la transmisión tenga un número
par o impar de bits en estado alto lógico. Por ejemplo, si la información a
transmitir es 011 y la paridad es par, el bit de paridad sería 0 para mantener
el número de bits en estado alto lógico como par. Si la paridad seleccionada
fuera impar, entonces el bit de paridad sería 1, para tener 3 bits en estado
alto lógico. La paridad marcada y espaciada en realidad no verifican el estado
de los bits de datos; simplemente fija el bit de paridad en estado lógico alto
para la marcada, y en estado lógico bajo para la espaciada. Esto permite al
dispositivo receptor conocer de antemano el estado de un bit, lo que serviría
para determinar si hay ruido que esté afectando de manera negativa la
transmisión de los datos, o si los relojes de los dispositivos no están
sincronizados.
LabVIEW
43
combinarse con todo tipo de software y hardware, tanto del propio fabricante -
tarjetas de adquisición de datos, PAC, Visión, instrumentos y otro Hardware- como
de otros fabricantes.
Practicas
while(true){
dato=getc(); putc(dato);
if(dato=='1'){
output_high(pin_a0);
} else{
if(dato=='0'){
output_low(pin_a0);
}
}
}
44
2. Escribir en un LCD por medio de LabVIEW
#include <16f877a.h>
#fuses xt, nowdt, noprotect, noput, nolvp
#use delay(crystal = 4Mhz)
#define lcd_port_d true
#define lcd_enable_pin pin_d0
#define lcd_rs_pin pin_d1
#define lcd_rw_pin pin_d2
#include <lcd.c>
#use rs232(BAUD=9600, PARITY=N, XMIT=PIN_C6, RCV=PIN_C7,bits=8)
char dato; char write; int i=0;
while(true){
dato=getc();
switch(dato){
case '1':
while(dato=='1'){
write=getc(); if(i<=16){
45
i++; lcd_gotoxy(i,1);
printf(lcd_putc,"%c",write);
}
else if(i>=17){
i=0; dato=getc();
}
}
break;
case '2':
while(dato=='2'){
write=getc(); if(i<=16){
i++; lcd_gotoxy(i,2);
printf(lcd_putc,"%c",write);
}
else if(i>=17){
i=0; dato=getc();
}
}
break;
case '3':
lcd_putc("\f");
i=0; write=0;
break;
}
}
46
}
La modulación por ancho de pulsos (también conocida como PWM, siglas en inglés
de pulse-width modulation) de una señal o fuente de energía es una técnica en la
que se modifica el ciclo de trabajo de una señal periódica (una senoidal o una
cuadrada, por ejemplo), ya sea para transmitir información a través de un canal de
comunicaciones o para controlar la cantidad de energía que se envía a una carga.
En los motores
La modulación por ancho de pulsos es una técnica utilizada para regular la velocidad
de giro de los motores eléctricos de inducción o asíncronos. Mantiene el par motor
constante y no supone un desaprovechamiento de la energía eléctrica. Se utiliza
tanto en corriente continua como en alterna, como su nombre lo indica, al controlar:
un momento alto (encendido o alimentado) y un momento bajo (apagado o
desconectado), controlado normalmente por relés(baja frecuencia) o MOSFET o
tiristores (alta frecuencia).
Otros sistemas para regular la velocidad modifican la tensión eléctrica, con lo que
disminuye el par motor; o interponen una resistencia eléctrica, con lo que se pierde
energía en forma de calor en esta resistencia.
Otra forma de regular el giro del motor es variando el tiempo entre pulsos de
duración constante, lo que se llama modulación por frecuencia de pulsos.
47
En los motores de corriente alterna también se puede utilizar la variación de
frecuencia.
La modulación por ancho de pulsos también se usa para controlar servomotores, los
cuales modifican su posición de acuerdo al ancho del pulso enviado cada un cierto
período que depende de cada servo motor. Esta información puede ser enviada
utilizando un microprocesador como el Z80, o un microcontrolador (por ejemplo, un
PIC 16F877A, 16F1827, 18F4550, etc. de la empresa Microchip), o un
microcontrolador de hardware libre como es Arduino.
48
Practicas
#include <16f877a.h>
#fuses xt, nowdt, noprotect, nolvp
#use delay(crystal=4Mhz) int16
duty=0;
void main(){
set_tris_d(0x00); //Configuracion
del Timer2
setup_timer_2(t2_div_by_16,124,1);//Valor a cargar en el Timer2=124, Valor del
Poscaler=1 setup_ccp1(ccp_pwm);
while(true){
for(duty=1;duty<=500;duty++){
delay_ms(10); set_pwm1_duty(duty);
}
for(duty=500;duty>=1;duty--){
delay_ms(10); set_pwm1_duty(duty);
}
}
}
49
Conclusión
50
Referencias Bibliográficas
https://sites.google.com/site/ielimcortezjesusantonio/5-conclusiones/5-4-conclusion
https://www.mikroe.com/ebooks/microcontroladores-pic-programacion-en-c-
conejemplos/lenguajes-de-programacion
https://www.mikroe.com/ebooks/microcontroladores-pic-programacion-en-c-
conejemplos/puertos-de-entradasalida
https://entrrnadorpic16f84.wordpress.com/4-puertos-de-entrada-y-salida/
https://www.unioviedo.es/ate/alberto/TEMA4-puertos.pdf
51