Documente Academic
Documente Profesional
Documente Cultură
INTRODUCCIÓN
La tecnología…..
CAPITULO 1
Definición de microcontroladores
Aplicaciones
Esquema de microcontrolador
Esquema microcontrolador
Ing. Braulio Elías Chi Salavarría
Clasificación
Familia PIC18F4550
CAPITULO 2
Introducción a lenguaje C
Operandos
Operadores de asignación
Es en las expresiones complejas, y no en una tan simple como la del ejemplo, donde se
puede apreciar la conveniencia de usar esta notación. La siguiente tabla resume los
operadores de asignación compuesta y su significado.
Operador Descripción
+= Asignación de suma
-= Asignación de resta
*= Asignación de multiplicación
/= Asignación de división
%= Asignación de resto de división
<<= Asignación de desplazamiento a la izquierda
>>= Asignación de desplazamiento a la derecha
&= Asignación de AND de bits
|= Asignación de OR de bits
^^= Asignación de OR exclusivo de bits
~= Asignación de negación de bits
Operadores aritméticos
Ing. Braulio Elías Chi Salavarría
Operadores relacionales
Operadores lógicos
Al igual que los operadores relacionales, éstos devuelven 1 (verdadero), 0 (falso) tras la
evaluación de sus operandos. La tabla siguiente ilustra estos operadores.
Operador Descripción
! NO lógico
&& Y lógico
|| O lógico
Estos operadores permiten actuar sobre los operandos a nivel de bits y sólo pueden
ser de tipo entero (incluyendo el tipo char). Son los que siguen:
Operador Descripción
~ Negación de bits (complemento a 1)
& Y de bits (AND)
^^ O exclusivo de bits (EXOR)
| O de bits (OR)
Operador Descripción
Librerías 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
estándar 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 carácter.
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 Elías Chi Salavarría
Permite velocidades de transmisión bajas en chips (uC's, memorias, etc) que tienen
problemas de transmisión.
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 transmisión.
FORCE_SW
Usa una UART software en lugar del hardware aun cuando se especifican los pines del
hardware.
La definición 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 sólo 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 código que el compilador genera para las instrucciones de
entrada y salida. El método standar de hacer I/O causará que el compilador genere
código 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 método 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 dirección de bit. Por
ejemplo, para el bit 3º del port A (byte 5 de los SFR) tendría un valor dirección de
5*8+3=43.
Esto se puede definir como sigue: #define pin3_portA 43.
Los pines o patillas de los dispositivos están definidos como PIN_XX en los archivos de
cabecera *.H. Éstos, se pueden modificar para que los nombres de los pines sean más
significativos para un proyecto determinado.
OUTPUT_BIT(pin, value)
Esta función saca el bit dado en value(0 o 1) por la patilla de I/O especificada en pin. El
modo de establecer la dirección del registro, está determinada por la última directiva
Ing. Braulio Elías Chi Salavarría
#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 función 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 conexión 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 método 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 método de acceso de I/O depende de la última
directiva
#USE *_IO.
Ejemplo:
output_low(PIN_A0);
PORT_B_PULLUPS(flag)
Esta función 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
configuración 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 Elías Chi Salavarría
Funciones de retardos
DELAY_CYCLES(count)
Esta función realiza retardos según el número de ciclos de instrucción especificado en
count; los valores posibles van desde 1 a 255. Un ciclo de instrucción es igual a cuatro
periodos de reloj.
Ejemplo:
delay_cycles( 3 ); // retardo de 3ciclos instrucción; es igual que un NOP
DELAY_MS(time)
Esta función realiza retardos del valor especificado en time. Dicho valor de tiempo es
en milisegundos y el rango es 0-65535.
Para obtener retardos más largos así como retardos 'variables' es preciso hacer
llamadas a una función separada; véase el ejemplo siguiente.
Es preciso utilizar la directiva #use delay(clock=frecuencia) antes de la llamada a esta
función, 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 función 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 función para que el compilador sepa la frecuencia de
reloj.
Ejemplos:
#use delay(clock=20000000)
delay_us(50);
int espera = 10;
delay_us(espera);
Edición 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 Elías Chi Salavarría
Estructura de un programa en C
declaraciones globales
prototipos de funciones
main() {
variables locales;
bloque de sentencias;
llamadas a las funciones;
}
función_1() {
variables locales a 17unción_1;
bloque de sentencias;
llamada a otra/s funciones;
}
función_n() {
…
}
Ing. Braulio Elías Chi Salavarría
CAPITULO 3
Instrucciones de instalación
Para empezar a programar nuestro microcontrolador daremos los pasos muy sencillos
de cómo hacerlo a continuación
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 Elías Chi Salavarría
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 físicamente nuestro microcontrolador de una manera muy
sencilla y rápida.
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 opción Load Hex File, nos saldrá una ventana como esta
CAPITULO 4
PRACTICAS DE LABORATORIO
Ing. Braulio Elías Chi Salavarría
Guía de Prácticas
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
Interrupción timer
Practica #9
PWM (modulación 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
Frecuencímetro
Ing. Braulio Elías Chi Salavarría
Ejercicio #1
Encender un led
Objetivo
En esta práctica podremos comenzar a familiarizarnos con los entornos
del compilador, programador, simulación y finalmente programación
física y montaje de nuestro microcontrolador.
enciende(A0);
delay_ms(1000);
apaga(A0);
delay_ms(1000);
Ing. Braulio Elías Chi Salavarría
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
introducción a nuevas instrucciones al compilador para poder testear el
puerto A como entrada.
Esquemático de la práctica
Ing. Braulio Elías Chi Salavarría
if(entrada(A0)){
enciende(B7);
}else{
Enapaga(B7);
este programa agregamos una condición 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 Elías Chi Salavarría
Practica #5
Motores paso a paso
Objetivo: La siguiente práctica mostrará el conexionado básico 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.
Introducción:
Los motores paso a paso son ideales para la construcción de mecanismos en donde se
requieren movimientos muy precisos.
La característica 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 pequeños
movimientos de tan solo 1.8°, es decir, que se necesitarán 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 posición o bien
totalmente libres. Si una o más de sus bobinas están energizadas, el motor estará
enclavado en la posición 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
continuación. 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 Elías Chi Salavarría
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 próxima 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 ningún movimiento en absoluto.
Puede comenzar a vibrar pero sin llegar a girar.
Puede girar erráticamente.
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 aumentándola hasta la velocidad deseada
sin superar la máxima tolerada. El giro en reversa debería también ser realizado
previamente bajando la velocidad de giro y luego cambiar el sentido de rotación.
Conexión 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
Conexión practica 5
Código
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 Elías Chi Salavarría
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 acción.
Programa principal
///////////·······poner programa desde aqui········////////////
if(entrada(A0)){
secuencia();
}
if(entrada(A1)){
secuencia2();
}
//////////··········fin de programa···········///////
Ing. Braulio Elías Chi Salavarría
Practica #6
Motor CD con puente H
Objetivo
Conocer el funcionamiento de un Motor CD y dar una explicación de
cómo poner a funcionarlo en ambas direcciones con una lógica de
control avanzada, en la cual será controlada por variables la dirección
de un motor mediante un puente H.
Introducción
Un Puente H o Puente en H es un circuito electrónico que permite a un motor eléctrico
DC girar en ambos sentidos, avance y retroceso. Son ampliamente usados en robótica
y como convertidores de potencia. Los puentes H están disponibles como circuitos
integrados, pero también pueden construirse a partir de componentes discretos.
Funcionamiento puente H
Estructura de un puente H (marcado en rojo)
Puente H
Los 2 estados básicos del circuito.
El término "puente H" proviene de la típica representación gráfica del circuito. Un
puente H se construye con 4 interruptores (mecánicos o mediante transistores).
Cuando los interruptores S1 y S4 (ver primera figura) están cerrados (y S2 y S3
abiertos) se aplica una tensión positiva en el motor, haciéndolo 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 podrán
estar cerrados al mismo tiempo, porque esto cortocircuitaría la fuente de tensión. Lo
mismo sucede con S3 y S4.
Como hemos dicho el puente H se usa para invertir el giro de un motor, pero también
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 Elías Chi Salavarría
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
Esquemático
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
Código
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 Elías Chi Salavarría
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 combinación de bits de habilitación para poder ir en la dirección que
deseemos ya sea adelante o atrás.
Ing. Braulio Elías Chi Salavarría
Practica #7
ADC Convertidor analógico digital
Objetivo
Enseñar el funcionamiento de sensores, los cuales son una parte importante en el
funcionamiento de un sistema automatizado, y como adaptar estas señales a un
microcontrolador.
Introducción
El CNY70 es un sensor óptico reflexivo que tiene una construcción compacta dónde el
emisor de luz y el receptor se colocan en la misma dirección para detectar la presencia
de un objeto utilizando la reflexión del infrarrojo sobre el objeto.
La longitud de onda de trabajo es 950nm. El detector consiste en un fototransistor.
CNY70
Introducción
La interrupción 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 cómputo 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 configuración son :
#int_timer0
void int_tiempo0(void){
++contRTCC;
if(contRTCC==30){
contRTCC=0;
if (val==1){
val=0;
}else{
val=1;
}
Ing. Braulio Elías Chi Salavarría
Lo que realizara esta función 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);
}
Introducción
D es el ciclo de trabajo
T es el período de la función
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 alimentación.
Ing. Braulio Elías Chi Salavarría
Esquemático a realizar
if (valor>100){
enciende(B0);
}else{
apaga(B0);
}
Y con esto tendremos una lectura parecida a esta en nuestro osciloscopio virtual
Introducción
Para renombrar los pines del puerto B con respecto a nuestra librería flex_lcd.c que se
encuentra en la carpeta.
Inicializamos nuestra función 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 Elías Chi Salavarría
toma_adc();
lcd_gotoxy(1,1);
printf(lcd_putc,"VALOR ADC:%Lu",valor);
Introducción
El LM35 es un sensor de temperatura con una precisión calibrada de 1ºC. Puede medir
temperaturas en el rango que abarca desde -55º a + 150ºC. La salida es muy lineal y
cada grado centígrado 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 precisión es muy importante, exponemos el código:
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 Elías Chi Salavarría
printf(lcd_putc,"VALOR ADC:%f",tempreal);
Introducción
RS-232 (también 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
Comunicación de datos), aunque existen otras situaciones en las que también se utiliza
la interfaz RS-232.
El conector DB9 es
Ing. Braulio Elías Chi Salavarría
Diagrama
PROGRAMA
Declaramos la directiva para nuestra interrupción RDA, y nuestra función que hara un
eco a lo que escribamos, y activara una bandera para que cuando detecte el carácter
‘T’ imprima la temperatura.
#int_rda
void serial_isr() {
Keypress=0x00;
if(kbhit()){
Keypress=getc();
if(Keypress!=0x00){
Ing. Braulio Elías Chi Salavarría
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 carácter le pongamos, no va a responder, solo con el
carácter T.
Ing. Braulio Elías Chi Salavarría
Practica #13
Memoria EEPROM 24C02 (protocolo I2C)
Objetivo
La principal característica de I²C es que utiliza dos líneas para transmitir la información:
una para los datos y por otra la señal de reloj. También es necesaria una tercera línea,
pero esta sólo es la referencia (masa). Como suelen comunicarse circuitos en una
misma placa que comparten una misma masa esta tercera línea no suele ser necesaria.
Las líneas se llaman:
* SDA: datos
* SCL: reloj
* GND: masa
Las dos primeras líneas son drenador abierto, por lo que necesitan resistencias de pull-
up. Los dispositivos conectados al bus I²C tienen una dirección única para cada uno.
También pueden ser maestros o esclavos. El dispositivo maestro inicia la transferencia
de datos y además genera la señal de reloj, pero no es necesario que el maestro sea
siempre el mismo dispositivo, esta característica se la pueden ir pasando los
dispositivos que tengan esa capacidad. Esta característica hace que al bus I²C se le
denomine bus multimaestro.
Ing. Braulio Elías Chi Salavarría
La siguiente practica nos enseñara 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 interrupción del timer 0.
La memoria eeprom cuenta con 2Kb de memoria, suficiente para 2000 muestras de 8
bits. Aquí vemos sus características técnicas:
Pueden ponerse más de una memoria en serie, hasta 4 memorias, y estas se controlan
mediante las líneas A0,A1,A2 de la memoria.
Para poder llamar a la librería, necesitamos incluir el archivo 2402.c el cual nos da las
funciones que veremos a continuación:
Ing. Braulio Elías Chi Salavarría
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 función init_ext_eeprom(); antes de llamar
a cualquier otra función de la librería. Es importante mencionar que el protocolo I2C
funciona con resistencias pull up. En la simulación podemos ver como se guardan los
datos en la memoria externa.
Ing. Braulio Elías Chi Salavarría
Practica #14
Frecuencimetro (Interrupción Externa)
Objetivo:
Introducción
Las interrupciones externas nos sirven para poder testear un entrada, sin tener que
estarlo haciendo todo el tiempo, solo cuando detecta un cambio lógico en su entrada,
así podemos realizar diversas funciones en nuestro programa, haciendo más eficiente
nuestro código.
Aquí podemos ver el diagrama lógico de todas las interrupciones soportados por
nuestro microcontrolador.
Programa
Nuestro programa capturara una señal desde nuestra interrupción externa, la cual se
incrementará hasta que la interrupción del timer0 llegue a aproximadamente 1
Ing. Braulio Elías Chi Salavarría
segundo, debemos saber que no es del todo exacto debido a que la interrupción 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 Elías Chi Salavarría
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