Documentos de Académico
Documentos de Profesional
Documentos de Cultura
INTRODUCCIN
En este curso, se enfocara a desarrollar aplicaciones para
resolver problemas reales, con un alto grado de eficiencia y
complejidad, sin dejar de ser fcil de aprender por el alumno,
dando como resultado, prcticas y material realmente
importante para incursionar en el diseo y desarrollo de
aplicaciones avanzadas con tecnologa de ltima generacin.
La tecnologa..
La tecnologa avanza da con da, surgiendo nuevas necesidades, cada
vez mas especificas y complejas, esto requiere cierto nivel de
conocimiento mayor que el de hace aos, dejando los sistemas de
aprendizaje convencionales obsoletos, para la solucin de problemas
que enfrenta la sociedad tecnolgica.
Es por esto que nuevas herramientas surgen para tratar de resolver
esas necesidades, mejorando en eficiencia y complejidad. Es por esto,
que los estudiantes necesitan conocer cules son estas nuevas
herramientas de desarrollo, llmese, compiladores de lenguaje de alto
nivel, nuevas familias de microcontroladores, con sistemas embebidos
tales como: Ethernet, USB, CAN, PWM, USART, etc. Haciendo de estos
pequeos controladores, poderosas soluciones.
CAPITULO 1
INTRODUCCION A LOS MICROCONTROLADORES
Esquema microcontrolador
Clasificacin
Actualmente existen ms familias de microcontroladores, y ms marcas, hasta ahora,
la tendencia es emigrar a 32 bits en la industria, como son los microcontroladores con
arquitectura ARM.
Familia PIC18F4550
Value
Flash
32
2,048
256
24
CAPITULO 2
LENGUAJE DE PROGRAMACION C ORIENTADO A SISTEMAS EMBEBIDOS
DELAY_CYCLES(count)
Esta funcin realiza retardos segn el nmero de ciclos de instruccin especificado en
count; los valores posibles van desde 1 a 255. Un ciclo de instruccin es igual a cuatro
periodos de reloj.
Ejemplo:
delay_cycles( 3 ); // retardo de 3ciclos instruccin; es igual que un NOP
DELAY_MS(time)
Esta funcin realiza retardos del valor especificado en time. Dicho valor de tiempo es
en milisegundos y el rango es 0-65535.
Para obtener retardos ms largos as como retardos 'variables' es preciso hacer
llamadas a una funcin separada; vase el ejemplo siguiente.
Es preciso utilizar la directiva #use delay(clock=frecuencia) antes de la llamada a esta
funcin, para que el compilador sepa la frecuencia de reloj.
Ejemplos:
#use delay (clock=4000000) // reloj de 4MHz
delay_ms( 2 ); // retardo de 2ms
void retardo_segundos(int n) { // retardo de 'n' segundos; 0 <= n => 255
for (; n!=0; n--)
delay_ms( 1000 ); // 1 segundo
}
DELAY_US(time)
Esta funcin realiza retardos del valor especificado en time. Dicho valor es en
microsegundos y el rango va desde 0 a 65535. Es necesario utilizar la directiva #use
delay antes de la llamada a esta funcin para que el compilador sepa la frecuencia de
reloj.
Ejemplos:
#use delay(clock=20000000)
delay_us(50);
int espera = 10;
delay_us(espera);
Pasos para hacer un programa en C
Edicin de un programa en C
Para crear un programa hay que seguir los pasos siguientes:
1. Especificaciones del programa (qu tiene que hacer)
2. Hacer organigrama
3. Escribir el cdigo fuente (conocer el lenguaje)
Diagrama de Flujo
CAPITULO 3
INSTRUCCIONES PARA LA PROGRAMACIN DE MICROCONTROLADOR
Para empezar a programar nuestro microcontrolador daremos los pasos muy sencillos
de cmo hacerlo a continuacin
Primer paso
Abrir nuestro plantilla general que se encuentra en la carpeta de programas, con el
nombre de forma_general en formato .txt y copiar el texto, abrir nuestro programa
compilador CCS.
Una vez creado el proyecto, pegamos el contenido que copiamos anteriormente (sin
modificar nada) y pegamos en el compilador
Finalmente cerramos nuestra forma_general y nos disponemos a modificar el
programa en nuestro compilador.
Al cargar el programa con la opcin Load Hex File, nos saldr una ventana como esta
CAPITULO 4
PRACTICAS DE LABORATORIO
Practica #1
Encendido de un led (parpadeo)
Practica #2
Manejo de un puerto como salida, y como entrada
Practica #3
Secuencia de leds con condiciones
Practica #4
Display de 7 segmentos
Practica #5
Motor paso a paso
Practica #6
Motor CD con puente h
Practica #7
ADC
Practica #8
Interrupcin timer
Practica #9
PWM (modulacin por ancho de pulso)
Practica #10
Manejo de LCD 16x2
Practica #11
LM35 (temperatura)
Practica #12
Puerto Serial RS232
Practica #13
EEPROM externa protocolo I2C
Practica #14
Frecuencmetro
Ejercicio #1
Encender un led
Objetivo
En esta prctica podremos comenzar a familiarizarnos con los entornos
del compilador, programador, simulacin y finalmente programacin
fsica y montaje de nuestro microcontrolador.
Practica #2
Esquemtico de la prctica
Practica #3
if(entrada(A0)){
output_b(0x01);
delay_ms(1000);
output_b(0x02);
delay_ms(1000);
output_b(0x04);
delay_ms(1000);
output_b(0x08);
delay_ms(1000);
}else{
output_b(0x08);
delay_ms(1000);
output_b(0x04);
delay_ms(1000);
output_b(0x02);
delay_ms(1000);
output_b(0x01);
delay_ms(1000);
}
Practica #4
Display de 7 segmentos
Objetivo
En esta prctica haremos una secuencia de todo nuestro puerto,
especficamente el puerto B, que se comprende de 8 entradas o salidas,
en este ejemplo lo tomaremos como salidas, formando una palabra de
8 bits (binario). En el cual manejaremos un display de 7 segmentos.
Para nuestro montaje fsico, solo utilizaremos 7 bits. As como tambin
manejar tiempos de reloj para poder hacer una secuencia de datos
paso a paso.
El visualizador de siete segmentos (llamado tambin display) es una forma de
representar nmeros en equipos electrnicos. Est compuesto de siete segmentos que
se pueden encender o apagar individualmente. Cada segmento tiene la forma de una
pequea lnea.
Practica #5
PASO
Bobina A
Bobina B
Bobina C
Bobina D
ON
ON
OFF
OFF
OFF
ON
ON
OFF
OFF
OFF
ON
ON
ON
OFF
OFF
ON
PASO
Bobina A
Bobina B
Bobina C
Bobina D
ON
OFF
OFF
OFF
OFF
ON
OFF
OFF
OFF
OFF
ON
OFF
OFF
OFF
OFF
ON
Bobina A
Bobina B
Bobina C
Bobina D
ON
OFF
OFF
OFF
ON
ON
OFF
OFF
OFF
ON
OFF
OFF
OFF
ON
ON
OFF
OFF
OFF
ON
OFF
OFF
OFF
ON
ON
OFF
OFF
OFF
ON
ON
OFF
OFF
ON
Conexin ULN2803
0
U1
2
3
4
5
6
7
10
U2
+88.8
10
18
17
16
15
14
13
12
11
COM
1C
2C
3C
4C
5C
6C
7C
8C
1B
2B
3B
4B
5B
6B
7B
8B
1
2
3
4
5
6
7
8
21
22
23
24
25
26
27
28
RA0/AN0
RC0/T1OSO/T1CKI
RA1/AN1
RC1/T1OSI/CCP2/UOE
RA2/AN2/VREF-/CVREF
RC2/CCP1
RA3/AN3/VREF+
RC4/D-/VM
RA4/T0CKI/C1OUT/RCV
RC5/D+/VP
RA5/AN4/SS/LVDIN/C2OUT
RC6/TX/CK
RA6/OSC2/CLKO
RC7/RX/DT/SDO
RB0/AN12/INT0/FLT0/SDI/SDA
RB1/AN10/INT1/SCK/SCL
RB2/AN8/INT2/VMO
RB3/AN9/CCP2/VPO
RB4/AN11/KBI0/CSSPP
RB5/KBI1/PGM
RB6/KBI2/PGC
RB7/KBI3/PGD
PIC18F2550
ULN2803
Conexin practica 5
Cdigo
void secuencia(){
output_b(0xFE);
delay_ms(500);
output_b(0xFD);
delay_ms(500);
output_b(0xFB);
delay_ms(500);
output_b(0xF7);
delay_ms(500);
}
void secuencia2(){
output_b(0xF7);
delay_ms(500);
output_b(0xFB);
OSC1/CLKI
VUSB
RE3/MCLR/VPP
11
12
13
15
16
17
18
9
14
1
Practica #6
Introduccin
Un Puente H o Puente en H es un circuito electrnico que permite a un motor elctrico
DC girar en ambos sentidos, avance y retroceso. Son ampliamente usados en robtica
y como convertidores de potencia. Los puentes H estn disponibles como circuitos
integrados, pero tambin pueden construirse a partir de componentes discretos.
Funcionamiento puente H
Estructura de un puente H (marcado en rojo)
Puente H
Los 2 estados bsicos del circuito.
El trmino "puente H" proviene de la tpica representacin grfica del circuito. Un
puente H se construye con 4 interruptores (mecnicos o mediante transistores).
Cuando los interruptores S1 y S4 (ver primera figura) estn cerrados (y S2 y S3
abiertos) se aplica una tensin positiva en el motor, hacindolo girar en un sentido.
Abriendo los interruptores S1 y S4 (y cerrando S2 y S3), el voltaje se invierte,
permitiendo el giro en sentido inverso del motor.
Con la nomenclatura que estamos usando, los interruptores S1 y S2 nunca podrn
estar cerrados al mismo tiempo, porque esto cortocircuitara la fuente de tensin. Lo
mismo sucede con S3 y S4.
Como hemos dicho el puente H se usa para invertir el giro de un motor, pero tambin
puede usarse para frenarlo (de manera brusca), al hacer un corto entre las bornas del
motor, o incluso puede usarse para permitir que el motor frene bajo su propia inercia,
L293D
L293
Diagrama interno de nuestro integrado, en el cual vemos diferentes tipos de
aplicaciones.
0
U1
0
8
3
6
11
14
OUT1 VS
OUT2
OUT3
OUT4 GND
U2
16
VSS
GND
IN1
IN2
EN1
EN2
IN3
IN4
2
7
1
9
10
15
L293D
2
3
4
5
6
7
10
21
22
23
24
25
26
27
28
RA0/AN0
RC0/T1OSO/T1CKI
RA1/AN1
RC1/T1OSI/CCP2/UOE
RA2/AN2/VREF-/CVREF
RC2/CCP1
RA3/AN3/VREF+
RC4/D-/VM
RA4/T0CKI/C1OUT/RCV
RC5/D+/VP
RA5/AN4/SS/LVDIN/C2OUT
RC6/TX/CK
RA6/OSC2/CLKO
RC7/RX/DT/SDO
RB0/AN12/INT0/FLT0/SDI/SDA
RB1/AN10/INT1/SCK/SCL
RB2/AN8/INT2/VMO
RB3/AN9/CCP2/VPO
RB4/AN11/KBI0/CSSPP
RB5/KBI1/PGM
RB6/KBI2/PGC
RB7/KBI3/PGD
OSC1/CLKI
VUSB
RE3/MCLR/VPP
PIC18F2550
Cdigo
Declaramos una variable en el lugar donde nos indica que podemos hacerlo
int entradas=0;
Y en nuestro programa principal ponemos esto:
///////////poner programa desde aqui////////////
entradas=PORTA();
if (entradas==0x00){
enciende(B0);
enciende(B5);
enciende(B1);
apaga(B2);
11
12
13
15
16
17
18
9
14
1
Practica #7
CNY70
Cmo configurar nuestro sensor?
Practica #8
Interrupcin de Timer0
Objetivo
Conocer el funcionamiento de las interrupciones de los temporizadores del microcontrolador,
as como la configuracin de las mismas.
Introduccin
La interrupcin RTCC se produce cada vez que el contador TIMER0 pasa de FFh a 00h.
El timer0 est compuesto por 8 bits, es por esto que solo es de 00h a FFh.
El TIMER0 hace un cmputo completo de 00h a FFh cada 512 S, sin embargo este
tiempo puede ser cambiado mediante un preescaler o sea un divisor, ajustable. Los
tiempos generados para cada configuracin son :
:2 -> 512 S al mnimo preescaler posible.
:4 -> 1.0 mS
:8 -> 2.0 mS
:16 -> 4.0 mS
:32 -> 8.1 mS
:64 -> 16.3 mS
:128 -> 33.3 mS
:256 -> 66.6 mS al mximo preescaler posible.
El Template que propongo usa un Preescaler de 128 para producir una interrupcin
RTCC cada 33.3 mS y as cada 30 veces que se produce cambio de estado la variable
Flag, o sea 33.3 x 30 = 999 mS.
Para declarar una interrupcin necesitamos declarar la interrupcin de la siguiente
forma
#int_timer0
void int_tiempo0(void){
}
Como se puede observar la directiva #int_timer0 declaramos que es una interrupcin
de tipo timer, y debajo de esta directiva tenemos que poner la funcin que queremos
que haga cuando detecte esta interrupcin.
Interrupcin timer para nuestro ejemplo
#int_timer0
void int_tiempo0(void){
++contRTCC;
if(contRTCC==30){
contRTCC=0;
if (val==1){
val=0;
}else{
val=1;
}
}
}
Lo que realizara esta funcin es cambiar los estados de de las banderas, para que se
apague y prenda A0, asi de esta manera nos evitamos utilizar un retardo y nuestro
programa sigue realizando sus funciones sin tener que parar y quedar en reposo.
En nuestro programa principal tenemos
if(val==1){
output_high(pin_a0);
}else{
output_low(pin_a0);
}
En el esquemtico de nuestra prctica nicamente pondremos un led en el puerto A0 y
veremos cmo parpadea, cabe mencionar que hay herramientas fciles de utilizar para
poder calcular los retardos que deseemos.
Como puede ser RRPic timer calculator
Como podemos observar en la siguiente figura
Practica #9
D es el ciclo de trabajo
es el tiempo en que la funcin es positiva (ancho del pulso)
T es el perodo de la funcin
La construccin tpica de un circuito PWM se lleva a cabo mediante un comparador
con dos entradas y una salida. Una de las entradas se conecta a un oscilador de onda
triangular, mientras que la otra queda disponible para la seal moduladora. En la salida
la frecuencia es generalmente igual a la de la seal triangular y el ciclo de trabajo esta
en funcin de la portadora.
La principal desventaja que presentan los circuitos PWM es la posibilidad de que haya
interferencias generadas por radiofrecuencia. Estas pueden minimizarse ubicando el
controlador cerca de la carga y realizando un filtrado de la fuente de alimentacin.
Esquemtico a realizar
Practica #10
LCD 16x2
Introduccin
Para que podamos visualizar los resultados obtenidos de nuestros procesos o
monitoreo, una forma muy profesional de visualizarlos es utilizando una pantalla LCD
16x2 que es una excelente opcin debido a su bajo consumo y bajo precio en
comparacin con otras opciones.
Practica #11
Ajustamos para que nuestra ganancia para cada grado de aumento sea de .20mv de
voltaje.
Para este ejemplo, no utilizaremos este circuito, aunque se recomienda utilizarlo para
cuando la precisin es muy importante, exponemos el cdigo:
Declaramos variables:
int16 temp=0;
float tempreal=0;
Declaramos nuestra funcin:
void toma_adc(void){
set_adc_channel(0);
delay_ms(1);
temp=read_adc();
}
Y en nuestro men principal:
toma_adc();
tempreal=temp/2;
lcd_gotoxy(1,1);
Practica #12
Introduccin
RS-232 (tambin conocido como Electronic Industries Alliance RS-232C) es una interfaz
que designa una norma para el intercambio serie de datos binarios entre un DTE
(Equipo terminal de datos) y un DCE (Data Communication Equipment, Equipo de
Comunicacin de datos), aunque existen otras situaciones en las que tambin se utiliza
la interfaz RS-232.
Nombre
CD: Detector de transmisin
RXD: Recibir datos
TXD: Transmitir datos
DTR: Terminal de datos lista
GND: Seal de tierra
DSR: Ajuste de datos listo
RTS: Permiso para transmitir
CTS: Listo para enviar
RI: Indicador de llamada
Proteccin
Diagrama
PROGRAMA
Declaramos la directiva para nuestra interrupcin RDA, y nuestra funcin que hara un
eco a lo que escribamos, y activara una bandera para que cuando detecte el carcter
T imprima la temperatura.
#int_rda
void serial_isr() {
Keypress=0x00;
if(kbhit()){
Keypress=getc();
if(Keypress!=0x00){
Asi es que sin importar que carcter le pongamos, no va a responder, solo con el
carcter T.
Practica #13
La memoria eeprom cuenta con 2Kb de memoria, suficiente para 2000 muestras de 8
bits. Aqu vemos sus caractersticas tcnicas:
Practica #14
Aqu podemos ver el diagrama lgico de todas las interrupciones soportados por
nuestro microcontrolador.
Programa
Nuestro programa capturara una seal desde nuestra interrupcin externa, la cual se
incrementar hasta que la interrupcin del timer0 llegue a aproximadamente 1
#int_ext
void isr_ext(){
contador++;
}
#int_timer0
void isr_timer0(){
set_timer0(93);
tick++;
if(tick>600){
tick=0;
frecuencia=contador;
contador=0;
}
}
Ahora en nuestro programa for(;;) solo imprimiremos la frecuencia en nuestro LCD:
lcd_gotoxy(1,2);
printf(lcd_putc,"Frec= %Lu",frecuencia);