Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Cursodemicrocontroladorespic18f4550 131220135853 Phpapp01 PDF
Cursodemicrocontroladorespic18f4550 131220135853 Phpapp01 PDF
INTRODUCCIN
La tecnologa..
CAPITULO 1
Definicin de microcontroladores
Aplicaciones
Esquema de microcontrolador
Esquema microcontrolador
Ing. Braulio Elas Chi Salavarra
Clasificacin
Familia PIC18F4550
CAPITULO 2
Introduccin a lenguaje C
Operandos
Operadores de asignacin
Es en las expresiones complejas, y no en una tan simple como la del ejemplo, donde se
puede apreciar la conveniencia de usar esta notacin. La siguiente tabla resume los
operadores de asignacin compuesta y su significado.
Operador Descripcin
+= Asignacin de suma
-= Asignacin de resta
*= Asignacin de multiplicacin
/= Asignacin de divisin
%= Asignacin de resto de divisin
<<= Asignacin de desplazamiento a la izquierda
>>= 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 aritmticos
Ing. Braulio Elas Chi Salavarra
Operadores relacionales
Operadores lgicos
Al igual que los operadores relacionales, stos devuelven 1 (verdadero), 0 (falso) tras la
evaluacin de sus operandos. La tabla siguiente ilustra estos operadores.
Operador Descripcin
! NO lgico
&& Y lgico
|| O lgico
Estos operadores permiten actuar sobre los operandos a nivel de bits y slo pueden
ser de tipo entero (incluyendo el tipo char). Son los que siguen:
Operador Descripcin
~ Negacin de bits (complemento a 1)
& Y de bits (AND)
^^ O exclusivo de bits (EXOR)
| O de bits (OR)
Operador Descripcin
Libreras Incorporadas
Esta directiva le dice al compilador la velocidad en baudios y los pines utilizados para la
I/O serie. Esta directiva tiene efecto hasta que se encuentra otra directiva RS232.
La directiva #USE DELAY debe aparecer antes de utilizar #USE RS232. Esta directiva
habilita el uso de funciones tales como GETCH, PUTCHAR y PRINTF. Si la I/O no es
estndar es preciso poner las directivas FIXED_IO o FAST_IO delante de
#USE RS232
OPCIONES:
RESTART_WDT
Hace que GETC() ponga a cero el WDT mientras espera un carcter.
INVERT
Invierte la polaridad de los pines serie (normalmente no es necesario con el
convertidor de nivel, como el MAX232). No puede usarse con el SCI interno.
PARITY=X Donde X es N, E, u O.
BITS =X Donde X es 5-9 (no puede usarse 5-7 con el SCI).
FLOAT_HIGH Se utiliza para las salidas de colecctor abierto.
ERRORS
Indica al compilador que guarde los errores recibidos en la variable RS232_ERRORS
para restablecerlos cuando se producen.
BRGH1OK
Ing. Braulio Elas Chi Salavarra
Permite velocidades de transmisin bajas en chips (uC's, memorias, etc) que tienen
problemas de transmisin.
Cuando utilizamos dispositivos con SCI y se especifican los pines SCI, entonces se usar
el SCI. Si no se puede alcanzar una tasa de baudios dentro del 3% del valor deseado
utilizando la frecuencia de reloj actual, se generar un error.
ENABLE=pin El pin especificado estar a nivel alto durante la transmisin.
FORCE_SW
Usa una UART software en lugar del hardware aun cuando se especifican los pines del
hardware.
La definicin de RS232_ERRORS es como sigue:
Sin UART:
El bit 7 es el 9 bit para el modo de datos de 9 bit. El bit 6 a nivel alto indica un fallo en
el modo flotante alto.
Con UART:
Usado slo para conseguir:
Copia del registro RCSTA, excepto: que el bit 0 se usa para indicar un error de paridad.
Ejemplo:
#use rs232(baud=9600, xmit=PIN_A2,rcv=PIN_A3)
#USE STANDARD_IO (puerto)
Esta directiva afecta al cdigo que el compilador genera para las instrucciones de
entrada y salida. El mtodo standar de hacer I/O causar que el compilador genere
cdigo para hacer que un pin de I/O sea entrada o salida cada vez que se utiliza. En los
procesadores de la serie 5X esto necesita un byte de RAM para cada puerto
establecido como I/O estandar.
Ejemplo:
#use standard_io(A)
INPUT(pin)
Devuelve el estado '0' o '1' de la patilla indicada en pin. El mtodo de acceso de I/O
depende de la ltima directiva #USE *_IO utilizada. El valor de retorno es un entero
corto.
Ejemplo:
while ( !input(PIN_B1) );
Nota: El argumento para las funciones de entrada y salida es una direccin de bit. Por
ejemplo, para el bit 3 del port A (byte 5 de los SFR) tendra un valor direccin de
5*8+3=43.
Esto se puede definir como sigue: #define pin3_portA 43.
Los pines o patillas de los dispositivos estn definidos como PIN_XX en los archivos de
cabecera *.H. stos, se pueden modificar para que los nombres de los pines sean ms
significativos para un proyecto determinado.
OUTPUT_BIT(pin, value)
Esta funcin saca el bit dado en value(0 o 1) por la patilla de I/O especificada en pin. El
modo de establecer la direccin del registro, est determinada por la ltima directiva
Ing. Braulio Elas Chi Salavarra
#USE *_IO.
Ejemplo:
output_bit( PIN_B0, 0); // es lo mismo que output_low(pin_B0);
output_bit( PIN_B0,input( PIN_B1 ) ); // pone B0 igual que B1
output_bit( PIN_B0, shift_left(&data, 1, input(PIN_B1)));
// saca por B0 el MSB de 'data' y al mismo tiempo
// desplaza el nivel en B1 al LSB de data.
OUTPUT_FLOAT(pin)
Esta funcin pone la patilla especificada como pin en el modo de entrada. Esto
permitir que la patilla est flotante para representar un nivel alto en una conexin de
tipo colector abierto.
Ejemplo:
// guardamos la lectura del port A en dato
if( (dato & 0x80)==0 ) // comprobamos si es '1' el MSB
output_low(pin_A0); // si es '1' ponemos a cero el pin A0
else
output_float(pin_A0); // de lo contrario, ponemos el pin A0 a uno
OUTPUT_HIGH(pin)
Pone a 'uno' el pin indicado. El mtodo de acceso de I/O depende de la ltima directiva
#USE *_IO utilizada.
Ejemplo:
output_high(PIN_A0);
OUTPUT_LOW(pin)
Pone a 'cero' el pin indicado. El mtodo de acceso de I/O depende de la ltima
directiva
#USE *_IO.
Ejemplo:
output_low(PIN_A0);
PORT_B_PULLUPS(flag)
Esta funcin activa/desactiva las resistencias pullups en las entradas del puerto B. Flag
puede ser TRUE (activa) o FALSE (desactiva).
Ejemplo:
port_b_pullups(FALSE);
SET_TRIS_A(value)
SET_TRIS_B(value)
SET_TRIS_C(value)
SET_TRIS_D(value)
SET_TRIS_E(value)
Estas funciones permiten escribir directamente los registros tri-estado para la
configuracin de los puertos.
Esto debe usarse con FAST_IO() y cuando se accede a los puertos de I/O como si fueran
memoria, igual que cuando se utiliza una directiva #BYTE. Cada bit de value representa
una patilla. Un '1' indica que la patilla es de entrada y un '0' que es de salida.
Ejemplo:
Ing. Braulio Elas Chi Salavarra
Funciones de retardos
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);
Edicin de un programa en C
1. leer NOMBRE
2. leer NOTA
3. si no hay mas notas, ir al punto 5
4. ir al punto 2
5. calcular la MEDIA
6. imprimir NOMBRE
7. imprimir MEDIA
Diagrama de Flujo
Ing. Braulio Elas Chi Salavarra
Estructura de un programa en C
declaraciones globales
prototipos de funciones
main() {
variables locales;
bloque de sentencias;
llamadas a las funciones;
}
funcin_1() {
variables locales a 17uncin_1;
bloque de sentencias;
llamada a otra/s funciones;
}
funcin_n() {
}
Ing. Braulio Elas Chi Salavarra
CAPITULO 3
Instrucciones de instalacin
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.
Ing. Braulio Elas Chi Salavarra
Una vez creado el proyecto, pegamos el contenido que copiamos anteriormente (sin
modificar nada) y pegamos en el compilador
Segundo paso
Cuando nuestro programa est bien terminado, y simulado previamente, nos
disponemos a programar fsicamente nuestro microcontrolador de una manera muy
sencilla y rpida.
Una vez compilado nuestro programa, se crear un archivo programa.hex el cual es
el que necesitamos para poder cargarlo al microcontrolador.
Al cargar el programa con la opcin Load Hex File, nos saldr una ventana como esta
CAPITULO 4
PRACTICAS DE LABORATORIO
Ing. Braulio Elas Chi Salavarra
Gua de Prcticas
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
Ing. Braulio Elas Chi Salavarra
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.
enciende(A0);
delay_ms(1000);
apaga(A0);
delay_ms(1000);
Ing. Braulio Elas Chi Salavarra
Practica #2
Manejo de un puerto de entrada y salida
Objetivo
Manejar un puerto completo del microcontrolador, as como el manejo
de entrada de datos, por medio de un pulsador, haremos una
introduccin a nuevas instrucciones al compilador para poder testear el
puerto A como entrada.
Esquemtico de la prctica
Ing. Braulio Elas Chi Salavarra
if(entrada(A0)){
enciende(B7);
}else{
Enapaga(B7);
este programa agregamos una condicin if, asi ya podemos tomar decisiones
dependiendo
} de las condiciones creados por nuestras entradas.
En la tabla de arriba, podemos ver los valores que necesitamos tener en las salidas del
puerto que activar el display de 7 segmentos.
PIN D0 = g
PIN D1 = f
PIN D2 = e
PIN D4 = d
PIN D5 = c
PIN D6 = b
PIN D7 = a
for(;;){
output_d(0xf6);
delay_ms(500);
output_d(0x60);
delay_ms(500);
output_d(0xd9);
delay_ms(500);
output_d(0xf1);
delay_ms(500);
}
Ing. Braulio Elas Chi Salavarra
Practica #5
Motores paso a paso
Objetivo: La siguiente prctica mostrar el conexionado bsico para
usar un motor a pasos unipolar.
Agregando a nuestro circuito de prueba un driver ULN2803 al puerto M
y un motor a pasos unipolar a la salida del driver podremos crear un
programa que genere uno de los 3 tipos de movimientos generalizados
para este tipo de motores.
Introduccin:
Los motores paso a paso son ideales para la construccin de mecanismos en donde se
requieren movimientos muy precisos.
La caracterstica principal de estos motores es el hecho de poder moverlos un paso a la
vez por cada pulso que se le aplique. Este paso puede variar desde 90 hasta pequeos
movimientos de tan solo 1.8, es decir, que se necesitarn 4 pasos en el primer caso
(90) y 200 para el segundo caso (1.8), para completar un giro completo de 360.
Estos motores poseen la habilidad de poder quedar enclavados en una posicin o bien
totalmente libres. Si una o ms de sus bobinas estn energizadas, el motor estar
enclavado en la posicin correspondiente y por el contrario quedar completamente
libre si no circula corriente por ninguna de sus bobinas.
Secuencias para manejar motores paso a paso Unipolares
Existen tres secuencias posibles para este tipo de motores, las cuales se detallan a
continuacin. Todas las secuencias comienzan nuevamente por el paso 1 una vez
alcanzado el paso final (4 u 8). Para revertir el sentido de giro, simplemente se deben
ejecutar las secuencias en modo inverso.
1 ON ON OFF OFF
2 OFF ON ON OFF
Ing. Braulio Elas Chi Salavarra
3 OFF OFF ON ON
4 ON OFF OFF ON
2 ON ON OFF OFF
4 OFF ON ON OFF
6 OFF OFF ON ON
8 ON OFF OFF ON
En tal sentido el motor debe alcanzar el paso antes que la prxima secuencia de pulsos
comience. Si la frecuencia de pulsos es muy elevada, el motor puede reaccionar en
alguna de las siguientes formas:
Puede que no realice ningn movimiento en absoluto.
Puede comenzar a vibrar pero sin llegar a girar.
Puede girar errticamente.
O puede llegar a girar en sentido opuesto.
Para obtener un arranque suave y preciso, es recomendable comenzar con una
frecuencia de pulso baja y gradualmente ir aumentndola hasta la velocidad deseada
sin superar la mxima tolerada. El giro en reversa debera tambin ser realizado
previamente bajando la velocidad de giro y luego cambiar el sentido de rotacin.
Conexin ULN2803
0
U1
2 11
RA0/AN0 RC0/T1OSO/T1CKI
3 12
0 4
RA1/AN1
RA2/AN2/VREF-/CVREF
RC1/T1OSI/CCP2/UOE
RC2/CCP1
13
5 15
RA3/AN3/VREF+ RC4/D-/VM
6 16
RA4/T0CKI/C1OUT/RCV RC5/D+/VP
7 17
RA5/AN4/SS/LVDIN/C2OUT RC6/TX/CK
10 18
RA6/OSC2/CLKO RC7/RX/DT/SDO
21
U2 RB0/AN12/INT0/FLT0/SDI/SDA
22
RB1/AN10/INT1/SCK/SCL
10 23
COM RB2/AN8/INT2/VMO
18 1 24 9
1C 1B RB3/AN9/CCP2/VPO OSC1/CLKI
17 2 25
2C 2B RB4/AN11/KBI0/CSSPP
16 3 26 14
3C 3B RB5/KBI1/PGM VUSB
15 4 27
4C 4B RB6/KBI2/PGC
14 5 28 1
5C 5B RB7/KBI3/PGD RE3/MCLR/VPP
13 6
6C 6B
+88.8 12 7 PIC18F2550
7C 7B
11 8
8C 8B
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);
Ing. Braulio Elas Chi Salavarra
delay_ms(500);
output_b(0xFD);
delay_ms(500);
output_b(0xFE);
delay_ms(500);
}
Estas son funciones que vamos a llamar dentro de nuestro men principal, para que no
tengamos que poner todo, cuando queramos hacer la misma accin.
Programa principal
///////////poner programa desde aqui////////////
if(entrada(A0)){
secuencia();
}
if(entrada(A1)){
secuencia2();
}
//////////fin de programa///////
Ing. Braulio Elas Chi Salavarra
Practica #6
Motor CD con puente H
Objetivo
Conocer el funcionamiento de un Motor CD y dar una explicacin de
cmo poner a funcionarlo en ambas direcciones con una lgica de
control avanzada, en la cual ser controlada por variables la direccin
de un motor mediante un puente H.
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,
Ing. Braulio Elas Chi Salavarra
Integrado L293D
Este integrado, es un puente H en el cual, ya no tenemos que hacer todo ese arreglo
de transistores y diodos, esto nos facilita a la hora de armar nuestro circuito, evitando
errores de cableado.
L293D
L293
Esquemtico
0
U1
2 11
0 3
RA0/AN0
RA1/AN1
RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2/UOE
12
4 13
U2 RA2/AN2/VREF-/CVREF RC2/CCP1
8 16 5 15
RA3/AN3/VREF+ RC4/D-/VM
6 16
RA4/T0CKI/C1OUT/RCV RC5/D+/VP
3 2 7 17
OUT1 VS VSS IN1 RA5/AN4/SS/LVDIN/C2OUT RC6/TX/CK
6 7 10 18
OUT2 IN2 RA6/OSC2/CLKO RC7/RX/DT/SDO
1
EN1
21
RB0/AN12/INT0/FLT0/SDI/SDA
22
RB1/AN10/INT1/SCK/SCL
9 23
EN2 RB2/AN8/INT2/VMO
11 10 24 9
OUT3 IN3 RB3/AN9/CCP2/VPO OSC1/CLKI
14 15 25
OUT4 GND GND IN4 RB4/AN11/KBI0/CSSPP
26 14
RB5/KBI1/PGM VUSB
27
RB6/KBI2/PGC
L293D 28 1
RB7/KBI3/PGD 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);
Ing. Braulio Elas Chi Salavarra
enciende(B6);
apaga(B7);
}
if (entradas==0x01){
enciende(B0);
apaga(B5);
enciende(B1);
apaga(B2);
enciende(B6);
apaga(B7);
}
if (entradas==0x02){
apaga(B0);
enciende(B5);
enciende(B1);
apaga(B2);
enciende(B6);
apaga(B7);
}
if(entradas==0x03){
enciende(B0);
enciende(B5);
enciende(B2);
enciende(B7);
apaga(B1);
apaga(B6);
}
//////////fin de programa///////
Como podemos ver, en nuestro programa, tenemos que habilitar nuestro driver, y
hacer una combinacin de bits de habilitacin para poder ir en la direccin que
deseemos ya sea adelante o atrs.
Ing. Braulio Elas Chi Salavarra
Practica #7
ADC Convertidor analgico digital
Objetivo
Ensear el funcionamiento de sensores, los cuales son una parte importante en el
funcionamiento de un sistema automatizado, y como adaptar estas seales a un
microcontrolador.
Introduccin
El CNY70 es un sensor ptico reflexivo que tiene una construccin compacta dnde el
emisor de luz y el receptor se colocan en la misma direccin para detectar la presencia
de un objeto utilizando la reflexin del infrarrojo sobre el objeto.
La longitud de onda de trabajo es 950nm. El detector consiste en un fototransistor.
CNY70
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 :
#int_timer0
void int_tiempo0(void){
++contRTCC;
if(contRTCC==30){
contRTCC=0;
if (val==1){
val=0;
}else{
val=1;
}
Ing. Braulio Elas Chi Salavarra
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.
if(val==1){
output_high(pin_a0);
}else{
output_low(pin_a0);
}
Introduccin
D es el ciclo de trabajo
T es el perodo de la funcin
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.
Ing. Braulio Elas Chi Salavarra
Esquemtico a realizar
if (valor>100){
enciende(B0);
}else{
apaga(B0);
}
Y con esto tendremos una lectura parecida a esta en nuestro osciloscopio virtual
Introduccin
Para renombrar los pines del puerto B con respecto a nuestra librera flex_lcd.c que se
encuentra en la carpeta.
Inicializamos nuestra funcin lcd
lcd_init();
lcd_gotoxy(1,1); /////con este comando, le decimos en que fila y que columna
queremos colocar nuestro mensaje
printf(lcd_putc,"PRACTICA 11");///imprimimos mensaje en la pantalla
delay_ms(1500);
lcd_putc('\f');///////borramos el mensaje
lcd_gotoxy(1,1);
printf(lcd_putc,"EJEMPLO LCD");
Ing. Braulio Elas Chi Salavarra
toma_adc();
lcd_gotoxy(1,1);
printf(lcd_putc,"VALOR ADC:%Lu",valor);
Introduccin
El LM35 es un sensor de temperatura con una precisin calibrada de 1C. Puede medir
temperaturas en el rango que abarca desde -55 a + 150C. La salida es muy lineal y
cada grado centgrado equivale a 10 mV en la salida.
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;
void toma_adc(void){
set_adc_channel(0);
delay_ms(1);
temp=read_adc();
}
toma_adc();
tempreal=temp/2;
lcd_gotoxy(1,1);
Ing. Braulio Elas Chi Salavarra
printf(lcd_putc,"VALOR ADC:%f",tempreal);
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.
El conector DB9 es
Ing. Braulio Elas Chi Salavarra
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){
Ing. Braulio Elas Chi Salavarra
putchar(keypress);
flag_print=1;
}
}
}
if (flag_print==1){
if(Keypress=='T'){
printf("VALOR ADC:%f\r",tempreal);
}
flag_print=0;
}
Asi es que sin importar que carcter le pongamos, no va a responder, solo con el
carcter T.
Ing. Braulio Elas Chi Salavarra
Practica #13
Memoria EEPROM 24C02 (protocolo I2C)
Objetivo
Las dos primeras lneas son drenador abierto, por lo que necesitan resistencias de pull-
up. Los dispositivos conectados al bus IC tienen una direccin nica para cada uno.
Tambin pueden ser maestros o esclavos. El dispositivo maestro inicia la transferencia
de datos y adems genera la seal de reloj, pero no es necesario que el maestro sea
siempre el mismo dispositivo, esta caracterstica se la pueden ir pasando los
dispositivos que tengan esa capacidad. Esta caracterstica hace que al bus IC se le
denomine bus multimaestro.
Ing. Braulio Elas Chi Salavarra
La siguiente practica nos enseara como utilizar la memoria EEPROM externa 24C02,
estaremos monitoreando un sensor LM35 y el valor calculado se guardar en la
memoria EEPROM, el tiempo ser determinado por la interrupcin del timer 0.
La memoria eeprom cuenta con 2Kb de memoria, suficiente para 2000 muestras de 8
bits. Aqu vemos sus caractersticas tcnicas:
Para poder llamar a la librera, necesitamos incluir el archivo 2402.c el cual nos da las
funciones que veremos a continuacin:
Ing. Braulio Elas Chi Salavarra
if(flag_timer){
flag_timer=0;
output_toggle(C0);
temp=valor/2;
puntero++;
if(puntero>254)puntero=0;
toma_adc();
write_ext_eeprom(puntero,temp);
}
//////////fin de programa///////
En donde primero necesitamos llamar a la funcin init_ext_eeprom(); antes de llamar
a cualquier otra funcin de la librera. Es importante mencionar que el protocolo I2C
funciona con resistencias pull up. En la simulacin podemos ver como se guardan los
datos en la memoria externa.
Ing. Braulio Elas Chi Salavarra
Practica #14
Frecuencimetro (Interrupcin Externa)
Objetivo:
Introduccin
Las interrupciones externas nos sirven para poder testear un entrada, sin tener que
estarlo haciendo todo el tiempo, solo cuando detecta un cambio lgico en su entrada,
as podemos realizar diversas funciones en nuestro programa, haciendo ms eficiente
nuestro cdigo.
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
Ing. Braulio Elas Chi Salavarra
segundo, debemos saber que no es del todo exacto debido a que la interrupcin del
timer0 no llega a 1 segundo exacto para tener un periodo de muestro exacto.
#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);
Ing. Braulio Elas Chi Salavarra
http://www.elrincondelc.com/cursoc/cursoc7.html
http://www.todorobot.com.ar/informacion/tutorial%20stepper/stepper-tutorial.htm
http://www.terra.es/personal/fremiro/Archivos/CNY70%20web.pdf
http://www.picmania.net