La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

EAR EMTIIB Curso-Taller programación en Lenguaje C para microcontroladores PIC PIC18F452.

Presentaciones similares


Presentación del tema: "EAR EMTIIB Curso-Taller programación en Lenguaje C para microcontroladores PIC PIC18F452."— Transcripción de la presentación:

1 EAR EMTIIB Curso-Taller programación en Lenguaje C para microcontroladores PIC
PIC18F452

2 Que es un Microcontrolador?
Circuito Integrado que contiene en su interior las tres unidades básicas de una computadora: CPU Memoria RAM y ROM Puertos de entrada y salida (I/O)

3 Microchip Technologies
PIC 18F452

4 Características Velocidad de operación: hasta 40 MHz de reloj.
32K de memoria Flash (ROM). 1536 bytes de memoria RAM. 10 bit A/D.

5 Características (2) 14 fuentes de interrupciones
Memoria de pila (stack) de 8 niveles de profundidad Protecciones: Power-on Reset (POR) Power-up Timer (PWRT) Oscillator Start-up Timer (OST) Watchdog Timer (WDT) independiente del cristal.

6 Puertos de entrada y salida
PORTA ( RA5, RA4, RA3, RA2, RA1, RA0 ) PORTB ( RB7, RB6, RB5, RB4, RB3, RB2, RB1, RB0 ) PORTC ( RC7, RC6, RC5, RC4, RC3, RC2, RC1, RC0 ) PORTD ( RD7, RD6, RD5, RD4, RD3, RD2, RD1, RD0 ) PORTE ( RE2, RE1, RE0 )

7 Arquitectura interna Arquitectura HARVARD.
Buses separados (datos e instrucciones). Memoria de programa : 16 bits. Memoria de datos: 8 bits.

8

9 Terminales fisicas

10 Tipos de datos Tipo bytes Rango (unsigned) char 1 0 .. 255
(signed) short (int) unsigned short (int) (signed) int unsigned (int) (signed) long (int) unsigned long (int)

11 Tipos de datos 2 Tipo bytes Rango float 4 ± x ± x 1038 double 4 ± x ± x 1038 long double 4 ± x ± x 1038

12 Asignación de datos Decimal Hexadecimal int i = 10; /* decimal 10 */
int j = -10; /* decimal -10 */ int p = 0; /* decimal 0 */ Hexadecimal short x = 0x37; /* decimal 55 */ short y = 0x7F; /* decimal 127 */ int z = 0x125; /* decimal 293 */

13 Asignación de datos Octal Binario ASCII char dat = ‘a’; char m = ‘5’;
int m = 023; /* 19 */ short n = 016; /* 14 */ Binario char dato = 0b ; short dat = 0b ; unsigned char sig = 0b ; ASCII char dat = ‘a’; char m = ‘5’;

14 Registros asociados Entrada/salida Configuración PORTA TRISA
PORTB TRISB PORTC TRISC PORTD TRISD PORTE TRISE

15 Entrada o salida SALIDA DE DATOS : 0 ENTRADA DE DATOS: 1
La asignación es individual correspondiente a cada terminal del puerto.

16 Acceso individual de bits 1
mikroC te permite acceso individual en variables de 8 bits (char and unsigned short). Simplemente usando el selector (.) seguido de uno de los identificadores F0, F1, … , F7. Siendo F7 el bit mas significativo. Ejemplo: PORTC.F0 = 1; PORTD.F5 = 0; PORTB.F7 = 1; Los identificadores F0–F7 no se reconocen en minúsculas. NOTA: Entre dos accesos a bits se debe tener un retardo mínimo de 2 microsegundos.

17 Entrada o salida Si deseamos configurar el puerto C con la siguiente asignación: RC0 entrada RC1 entrada RC2 entrada RC3 entrada RC4 salida RC5 salida RC6 salida RC7 salida Posibles instrucciones a utilizar TRISC = 0b’ ’; o TRISC = 0x0F; o TRISC = 15;

18 Entrada o salida Si deseamos configurar el puerto D con la siguiente asignación: RD0 entrada RD1 salida RD2 entrada RD3 salida RD4 entrada RD5 salida RD6 entrada RD7 salida Debemos utilizar cualquiera de las siguientes instrucciones TRISD = 0b’ ’; o TRISD = 0x55; o TRISD = 85;

19 Entrada o salida Si deseamos configurar el puerto A con la siguiente asignación: RA0 salida RA1 salida RA2 salida RA3 salida RA4 entrada RA5 entrada RA6 entrada Posibles instrucciones a utilizar ADCON1 = 6; \\ instrucción indispensable para usar el puerto A y el puerto E como entrada o salida de datos digitales TRISA = 0b’ ’; o TRISA = 0x70; o TRISA = 112;

20 ADCON1 ADCON1 = ADCON1 = 6 ;

21 Delay_ms (retardo por software)
Descripción: Crea un retardo por software dado el tiempo en milisegundos (constante). El rango de constantes aplicables a la función depende de la frecuencia del oscilador. Es una función interna; El código es generado en el lugar donde se hace la llamada, así que la llamada de esta función no cuenta dentro del limite de llamadas anidadas. void Delay_ms(const time_in_ms) Ejemplo: Generar un retardo de 1 segundo Delay_ms(1000); /* Pausa de un segundo */

22 Estructura de un programa en C ( ciclo while )
// Definición de variables globales // Definición de funciones void main(void) { // Definición de variables locales // Configuración de registros (recursos y puertos) // ciclo infinito while ( 1 ) // Programa de usuario }

23 Estructura de un programa en C ( ciclo for )
// Definición de variables globales // Definición de funciones void main(void) { // Definición de variables locales // Configuración de registros (recursos y puertos) // ciclo infinito for ( ; ; ) // Programa de usuario }

24 Estructura de un programa en C ( ciclo do - while )
// Definición de variables globales // Definición de funciones void main(void) { // Definición de variables locales // Configuración de registros (recursos y puertos) // ciclo infinito do // Programa de usuario } while ( 1 ) ; }

25 1.- Encendido de LED Crear un programa que encienda y apague un led, ubicado en la terminal RD7 del puerto D. El tiempo de encendido es de milisegundo y el de apagado de 300 milisegundos.

26 Encendido de LED (algoritmo)
Configurar el bit 7 del puerto D como salida de datos Encendido del led Retardo por software de 1000 milisegundos. Apagado del led Retardo por software de 300 milisegundos Repetir el paso 2

27 Encendido de LED (diagrama de flujo)
Configura bit del puerto como salida Apaga bit Enciende bit Retardo de 300 ms Retardo de 1000ms

28 Encendido de LED (esquemático)

29 Encendido de LED (programa)
void main ( void ) { TRISD.F7 = 0; while( 1 ) PORTD.F7 = 1; Delay_ms( 1000 ); PORTD.F7 = 0; Delay_ms( 300 ); }

30 Encendido de LED (programa 2)
void main ( void ) { TRISD = 0; while( 1 ) PORTD = 0x80; Delay_ms( 1000 ); PORTD = 0; Delay_ms( 300 ); }

31 Ejercicios propuestos 1
El alumno encenderá y apagara en forma alternada dos led’s ubicados en los bit’s 2 y 3 del puerto B. Los retardos serán de 500 milisegundos (ambos). Usando asignación directa a bits. El alumno encenderá y apagara un led ubicado en el bit 5 del puerto C. Los retardos serán de 100 milisegundos y 2 segundos, respectivamente. Usando asignación de byte.

32 2.- Luces secuenciales Programa que envíe la siguiente secuencia de datos al puerto de salida D. Secuencia :

33 Luces secuenciales (algoritmo)
Configuración de puerto como salida de datos. Envío de primer dato al puerto de salida Envío de segundo dato al puerto de salida Envío de tercer dato al puerto de salida . 9. Envío de ultimo dato al puerto de salida 10. Regresar a 2

34 Luces secuenciales (diagrama de flujo)
Configura puerto como salida Envía Envía Envía Envía Envía Envía Envía Envía

35 Luces secuenciales (esquemático)

36 Luces secuenciales (programa)
void main(void) { TRISD = 0; // CONFIGURACION COMO PUERTO DE SALIDA while ( 1 ) // CICLO INFINITO PORTD = 0b ; // ENVIA PRIMER DATO Delay_ms(500); PORTD = 0b ; // ENVIA SEGUNDO DATO PORTD = 0b ; // ENVIA TERCER DATO PORTD = 0b ; PORTD = 0b ; PORTD = 0b ; PORTD = 0b ; PORTD = 0b ; }

37 Ejercicios propuestos 2
El alumno enviara una secuencia de datos distinta por el puerto B, utilizando retardos por software de distintas duraciones, con incrementos de 100 milisegundos entre si. El alumno enviara la secuencia de datos por el puerto A, utilizando retardos por software con duración de 800 milisegundos. 100001 010010 001100

38 Arreglos (definiciones)
#define MAX 50 int vector_one[10]; /* arreglo de 10 enteros */ float vector_two[MAX]; /* arreglo 50 flotantes */ float vector_three[MAX - 20]; /* arreglo 30 flotantes */ char numero[5]; short dato[8]; long temperatura[15]; unsigned peso[7]; unsigned short d[3];

39 Arreglos (Inicializando)
/* Arreglo el cúal contiene el número de días de cada mes */ int days[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; /* La declaraciones es identica a la anterior */ int *days = {31,28,31,30,31,30,31,31,30,31,30,31}; /* Las dos declaraciones son identicas */ const char msg1[ ] = {'T', 'e', 's', 't', '\0'}; const char msg2[ ] = "Test";

40 Condicionante if if (expresión) conjunto 1 [else conjunto 2]
Cuando la expresión evaluada es verdadera, Las instrucciones del conjunto 1 son ejecutadas. Si la expresión es falso, las instrucciones del conjunto 2 es ejecutada. La expresión debe ser evaluada a un valor entero. Los paréntesis que encierra la expresión son obligatorios. La palabra especial “else conjunto 2” es opcional.

41 Símbolos de condición Operador Operación == igual != no igual > mayor que < menor que >= mayor que o igual a <= menor que o igual a

42 3.- Luces con arreglo (algoritmo)
Configuración de puerto como salida. Inicializa apuntador. Envío de dato apuntado. Incrementa apuntador. Si apuntador es mayor que o igual a 8 inicia el apuntador. Regresa a 3.

43 Luces con arreglo (diagrama de flujo)
Configura puerto como salida Incrementa apuntador Limpia apuntador apuntador ≥ 8 si Limpia apuntador Envía dato apuntado no

44 Luces con arreglo (programa)
short dato [ 8 ] = {1, 2, 4, 8, 16, 32, 64, 128}; short apunta; void main(void) { TRISB = 0; // Configura puerto apunta = 0; // Limpia apuntador while(1) // Ciclo infinito PORTB = dato [ apunta ]; // Envía dato Delay_ms(1000); apunta ++; // Incrementa apuntador if ( apunta > = 8 ) // Si apuntador ≥ 8 apunta = 0; // Limpia apuntador }

45 Ejercicios propuestos 3
El alumno enviara una secuencia por el puerto B usando los valores almacenado en un arreglo.

46 Operadores a nivel de bits
operacion & AND; compara pares de bits y regresa 1 si ambos son 1’s, de otra manera regresa 0. | OR (inclusive); compara pares de bits y regresa 1 si uno o ambos son 1’s, de otra manera regresa 0. ^ OR (exclusiva); compara pares de bits y regresa 1 si los bits son complementarios, de otra manera regresa 0. ~ Complemento (unitario); invierte cada bit << Corrimiento hacia la izquierda; mueve los bits hacia la izquierda, descartando el bit mas a la izquierda y asignando ceros al bit a la derecha. >> Corrimiento hacia la derecha; mueve los bits hacia la derecha, descartando el bit mas a la derecha y asignando ceros al bit a la izquierda.

47 Ejemplos operadores lógicos
0x1234 & 0x5678 /* Igual 0x1230 */ porque... 0x1234 : x5678: & : esto es, 0x1230 /* De forma similar: */ 0x1234 | 0x5678; /* Igual 0x567C */ 0x1234 ^ 0x5678; /* Igual 0x444C */ ~ 0x1234; /* Igual 0xEDCB */

48 Ejemplos a nivel de bits
<< 5; /* Igual */ 0x3801 << 4; /* Igual 0x8010, sobreflujo! */ 0x02F6 >> 4; /* Igual 0x002F */ 0xFF56 >> 4; /* Igual 0x0FF5 */ Corrimiento a la derecha division entre 2n. Corrimiento a la izquierda producto por 2n.

49 4.- Luces con desplazamiento (algoritmo)
Configuración de puerto como salida. Inicializa variable. Envía valor de la variable al puerto. Modifica la variable. Si variable es cero, Inicializa la variable. Regresa a 3.

50 Luces con desplazamiento (diagrama de flujo)
Configura puerto como salida Modifica variable Inicializa variable variable = 0 si Inicializa variable Envía variable al puerto no

51 Luces con desplazamiento (programa 1)
void main ( void ) { unsigned short dato; TRISD = 0; dato = 0b ; while ( 1 ) { PORTD = dato; Delay_ms ( 300 ); dato = dato << 1; if ( dato == 0 ) dato = 0x01; }

52 Operaciones aritméticas
Operador Operación + Suma - Resta * Multiplicación / División % Resto, regresa el residuo de la división entera (no puede ser usado con variables flotantes ++ Como prefijo Incrementa en uno el valor de la variable antes de evaluar la expresión. Como Postfijo suma en uno la variable después de ser evaluado la expresión. -- Como prefijo decrementa en uno el valor de la variable antes de evaluar la expresión. Como Postfijo resta en uno la variable después de ser evaluado la expresión.

53 Luces con desplazamiento (programa 2)
void main ( void ) { unsigned short dato; TRISD = 0; dato = 1; while ( 1 ) { PORTD = dato; Delay_ms (250); dato = dato * 2; if ( dato == 0 ) dato = 0x01; }

54 Ejercicios propuestos 4
El alumno realizara un programa que envíe al puerto C los siguientes valores utilizando para generarlas, las instrucciones de desplazamiento y/o aritméticas. 1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45 Lo mismo que el ejercicio anterior con la siguiente secuencia: 3, 6, 12, 24, 48, 92, 172, 1, 3, 6, 9, 12, 15, 18, 21, 24

55 Acceso a bits individual
mikroC te permite acceso individual en variables de 8 bits (char and unsigned short). Simplemente usando el selector (.) seguido de uno de los identificadores F0, F1, … , F7, siendo F7 el bit mas significativo. Ejemplo: // Si RB0 es uno, colocar en uno la terminal RC0: if ( PORTB.F0 ) PORTC.F0 = 1; Los Identificadores F0–F7 no se reconocen en minúsculas.

56 5.- Secuencias condicionadas ( problema )
Realizar un programa que envíe secuencias distintas al puerto D, dependiendo del valor de la terminal RA0. Si RA0 es igual a cero se envía la serie de dos bits desplazados hacia la izquierda, mientras que si RA0 es igual a 1 entonces se envía la serie de tres bits desplazados hacia la derecha.

57 Secuencias condicionadas (algoritmo)
Configuración de puertos Inicia contador Si RA0 es igual a 0 entonces envía secuencia_izquierda De lo contrario envía secuencia_derecha Incrementa contador Si contador es igual a 8 entonces contador igual a 0 Regresa a 3

58 Secuencias condicionadas (diagrama de flujo)
Luces Envía secuencia_izquierda Configura puertos RD salida, RA entrada Incrementa contador Limpia contador Contador = 10 si RA0 = 0 si Limpia contador no Envía Secuencia_derecha no

59 Secuencias condicionadas(programa)
short izquierda[10] = { 0, 1, 3, 6, 12, 24, 48, 96, 192, 128 }; short derecha[10] = { 128, 192, 226, 102, 56, 28, 14, 7, 3, 1 }; void main ( void ) { TRISD = 0; ADCON1 = 6; TRISA = 0x7F; Contador = 0; for ( ; ; ) Delay_ms ( 500 ); if ( PORTA.F0 = = 0 ) PORTD = izquierda [ contador]; else PORTD = derecha [ contador]; contador + + ; If ( contador = = 10 ) contador = 0; }

60 Ejercicios propuestos 5
El alumno desarrollara un programa que envíe una secuencia de números BCD a un display de 7 segmentos ubicados en el puerto D. Si la terminal RA1 ubicada en el puerto A, es igual a 0, la numeración debe ser incremental; en caso contrario debe decrementarse.

61 Ejercicios propuestos5(esquemático)

62 MOTOR A PASOS 1 Unipolar.- Tiene 4 bobinas independientes (A, B, C, D) y una terminal común a todas ellas.

63 MOTOR A PASOS 2 Unipolar.- Tiene 4 bobinas independientes (A, B, C, D) y dos terminales comunes.

64 MOTOR A PASOS 2 Bipolar.- Tiene 2 bobinas (A – C, B – D)

65 Secuencias de activación 1
Unipolar.- Movimiento de 1 paso por pulso (mayor torque). Paso A B C D 1 2 3 4

66 Secuencias de activación 2
Unipolar.- Movimiento de 1 paso por pulso (mayor velocidad). Paso A B C D 1 2 3 4

67 Secuencias de activación 3
Unipolar.- Movimiento de 1/2 paso por pulso. Paso A B C D 0.5 1 1.5 2 2.5 3 3.5 4

68 Secuencias de activación 4
Bipolar.- Movimiento de un paso Paso A C B D 1 2 3 4

69 Secuencia de activación 5
Bipolar.- Movimiento de medio paso Paso A C B D 0.5 1 1.5 2 2.5 3 3.5 4

70 Circuito de potencia 1 (motorunipolar )

71 Circuito de potencia 2 (motor unipolar )

72 Circuito de potencia 3 (motor bipolar )
Este mismo diagrama se repetiría para manejar la segunda bobina

73 Circuito de potencia x (motor a pasos )
Circuito integrado UCN Circuito integrado SAA1042

74 Circuito de potencia x1 (motor unipolar )

75 Circuito de potencia x2 (motor bipolar )

76 Ejercicios propuestos 5
2.- El alumno desarrollara un programa que envíe la secuencia de activación de un motor a pasos ubicado en el puerto D. Si la terminal ubicada en el puerto A, RA6, sea igual a 0, el motor debe girar a la derecha, en caso contrario debe girar a la izquierda.

77 Ejercicios propuestos 5 (esquemático)

78 6.- Display de 7 segmentos Realizar un programa en donde se implemente un contador de desplegando en un par de display’s de 7 segmentos. El programa debe realizar la visualización utilizando el multiplexaje de los datos, utilizando el puerto B como bus de datos y las terminales RC0 y RC1 como terminales de habilitación de display.

79 Display de 7 segmentos (algoritmo)
Configurar los puertos, inicialización de variables (unidades = ‘0’ decenas = ‘0’) Envío de decenas Habilitación de decenas Envío de unidades Habilitación de unidades Incremento de unidades Si unidades mayor de ‘9’ entonces 9 Sigue 2 Unidades = ‘0’ Incrementa decenas Si decenas mayor de ‘9’ entonces 12 Decenas=‘0’

80 Display de 7 segmentos (diagrama de flujo)
Limpia unidades Incrementa decenas Configura puertos Inicia variables Decenas>’9’ si Envía decena Envía unidad Incrementa unidad no Limpia decenas Unidades>’9’ si no

81 Display de 7 segmentos(programa)
short numero[ ] = { 0x3F, 0x06, 0x1B, 0x4F, 0x66, 0x6D, 0x5E, 0x07, 0x7F, 0x67 }; void main ( void ) // Programa principal { TRISB = 0; // Configuración de puertos TRISC = 0; unidades = decenas = ‘0’; // Inicialización de variables while ( 1 ) // Programa de usuario PORTB = numero [ decenas ]; // Envía decenas PORTC.F0 = 1; // Habilita el display de decenas delay-ms( 10 ); PORTC.F0 = 0; PORTB = numero [ unidades ]; // Envía unidades PORTC.F1 = 1; // Habilita el display de decenas PORTC.F1 = 0; unidades++; // Incrementa unidades if ( unidades > ’9’ ) unidades = ‘0’; // Reinicia unidades decenas++; // Incrementa decenas if ( decenas > ’9’ ) decenas = ‘0’; // Reinicie decenas }

82 Display de 7 segmentos ( esquemático )

83 Ejercicio propuesto 6 (d7seg)
El alumno modificara el programa elaborado de tal forma que se cambie el incremento por decremento, al usar un interruptor. Si el interruptor esta apagado el conteo será incremental, en caso contrario, el conteo será decremental. El interruptor estará ubicado en la terminal RE0 del puerto E.

84 Ejercicio propuesto 6 (esquemático)

85 Display de cristal liquido

86 LCD (funciones bus 8 bits)
Lcd8_Config Lcd8_Init Lcd8_Out Lcd8_Out_Cp Lcd8_Chr Lcd8_Chr_Cp Lcd8_Cmd

87 Lcd8_Config Descripción: Inicializa el LCD usando un bus de datos de 8 bits. Los puertos de Control (ctrlport) y Datos (dataport) usan la asignación de terminales especificada. void Lcd8_Config( unsigned short *ctrlport, unsigned short *dataport, unsigned short RS, unsigned short EN, unsigned short WR, unsigned short D7, unsigned short D6, unsigned short D5, unsigned short D4, unsigned short D3, unsigned short D2, unsigned short D1, unsigned short D0 );

88 Lcd8_Config 2 Ejemplo: Lcd8_Config(&PORTC,&PORTD,0,1,2,0,1,2,3,4,5,6,7);

89 Lcd8_Init Descripción: Inicializa el LCD usando un bus de 8 bits. Los puertos de Control (ctrlport) y Datos (dataport) usan la siguiente asignación de terminales.- E → ctrlport.3 RS → ctrlport.2 R/W → ctrlport.0 D7 → dataport.7 D6 → dataport.6 D5 → dataport.5 D4 → dataport.4 D3 → dataport.3 D2 → dataport.2 D1 → dataport.1 D0 → dataport.0 void Lcd8_Init(unsigned short *ctrlport, unsigned short *dataport);

90 Lcd8_Init 2 Ejemplo: Lcd8_Init(&PORTB, &PORTC);

91 Lcd8_Out Descripción: Imprime mensaje en el LCD en la fila y columna especificada (row y col). void Lcd8_Out( unsigned short row, unsigned short col, char *text ); Ejemplo: -Imprime “Hello!” en el LCD en la linea 1, columna 3 Lcd8_Out(1, 3, "Hello!");

92 Lcd8_Out_Cp Descripción: Imprime mensaje en el LCD en la posición actual del cursor. void Lcd8_Out_Cp(char *text); Ejemplo: Imprime “Here!” en la posición actual del cursor Lcd8_Out_Cp("Here!");

93 Lcd8_Chr Descripción: Imprime un caracter en el LCD en la fila y columna especificada (row y col). void Lcd8_Chr( unsigned short row, unsigned short col, char character ); Ejemplo: Imprime la letra “i” en el LCD en la línea 2,y columna 3 Lcd8_Out(2, 3, 'i');

94 Lcd8_Chr_Cp Descripción: Imprime un caracter en el LCD en la posición actual del cursor. void Lcd8_Chr_Cp(char character); Ejemplo: Imprime la letra “e” en la posición actual del cursor Lcd8_Chr_Cp('e');

95 Lcd8_Cmd Descripción: Envía un comando al LCD. Se puede pasar a la función una de las constantes predefinidas. void Lcd8_Cmd(unsigned short command); Ejemplo: Limpia el LCD Lcd8_Cmd(LCD_CLEAR);

96 Comandos predefinidos
Función LCD_FIRST_ROW Mueve el cursor a la 1a. fila. LCD_SECOND_ROW Mueve el cursor a la 2a. fila. LCD_THIRD_ROW Mueve el cursor a la 3a. fila. LCD_FOURTH_ROW Mueve el cursor a la 4a. fila. LCD_CLEAR Limpia el display. LCD_RETURN_HOME Regresa el cursor a la posición 1,1. Los datos de la RAM no son afectados. LCD_CURSOR_OFF Apaga el cursor. LCD_UNDERLINE_ON Coloca el caracter subrayado. LCD_BLINK_CURSOR_ON Parpadeo del cursor. LCD_MOVE_CURSOR_LEFT Mueve el cursor hacia la izquierda sin cambiar la RAM LCD_MOVE_CURSOR_RIGHT Mueve el cursor hacia la derecha sin cambiar el contenido de la RAM LCD_TURN_ON Enciende el display LCD_TURN_OFF Apaga el display LCD_SHIFT_LEFT Mueve el display hacia la izquierda sin cambiar el contenido de la RAM LCD_SHIFT_RIGHT Mueve el display hacia la derecha sin cambiar el contenido de la RAM

97 7.- LCD 8 BITS Diseñar el programa que inicialice un LCD, usando un bus de datos de 8 bits, y a continuación mande un mensaje de bienvenida. El mensaje debe desplazarse hacia la izquierda en forma continua.

98 LCD 8 BITS (algoritmo) Inicialice los puertos de datos y control.
Envía mensaje a desplegar. Envía comando de desplazamiento hacia la izquierda. Repite el paso 3.

99 LCD 8 BITS (diagrama de flujo)
Inicializa puertos de datos y control Envía mensaje Envía comando de Corrimiento a la izq.

100 LCD 8 BITS (esquemático)

101 LCD 8 BITS (programa 1) Void main(void) { TRISB = 0; TRISC = 0; Lcd8_Config(&PORTC,&PORTB,0,2,1,7,6,5,4,3,2,1,0); Lcd8_Out(1,1,”Hola mundo cruel”); while(1) { Lcd8_Cmd(LCD_SHIFT_LEFT); Delay_ms(100); }

102 LCD 8 BITS (programa 2) char mensaje[ ] = “Programa numero 2”;
void main(void) { TRISB = 0; TRISC = 0; Lcd8_Config(&PORTC,&PORTB,0,2,1,7,6,5,4,3,2,1,0); Lcd8_Out(1,1,mensaje); while(1) { Lcd8_Cmd(LCD_SHIFT_LEFT); Delay_ms(500); }

103 LCD 8 BITS (esquemático)

104 LCD 8 BITS (programa 3) char *mensaje3 = “mensaje tres”;
void main(void) { TRISB = 0; TRISC = 0; Lcd8_Init(&PORTC,&PORTB); Lcd8_Out(1,1,mensaje3); Lcd8_Out(2,1,”segunda fila”); while(1) { Lcd8_Cmd(LCD_SHIFT_LEFT); Delay_ms(50); }

105 Ejercicios propuestos 7
Programa que forme la palabra ‘HOLA’ en un LCD, configurado para utilizar un bus de 8 bits. Las letras deben desplazarse de derecha a izquierda. Primero debe aparecer la H, moviendose desde la derecha a la primer columna a la izquierda. Enseguida debe aparecer la O, tambien saliendo de la derecha y terminando a la derecha de la letra H. Lo mismo debe suceder para las letras L y A. El programa debe ser ciclico.

106 Ejercicio propuesto 8 H H O HO L . H H O H H O H O L A

107 LCD (funciones bus 4 bits)
Lcd_Config Lcd_Init Lcd_Out Lcd_Out_Cp Lcd_Chr Lcd_Chr_Cp Lcd_Cmd

108 Lcd_Config Descripción: Inicializa LCD usando un bus de datos de 4 bits. El puerto de Control (ctrlport) y Datos (dataport) tiene las asignaciones de terminales especificadas. void Lcd_Config( unsigned short *ctrl_data_port, unsigned short RS, unsigned short EN, unsigned short WR, unsigned short D7, unsigned short D6, unsigned short D5, unsigned short D4 );

109 Lcd_Config 2 Ejemplo: Lcd_Config(&PORTC,0,1,2,4,5,6,7);

110 Lcd_Init Descripción: Inicializa el LCD usando un bus de 4 bits. El puerto de Control (ctrlport) y Datos (dataport) tiene la siguiente asignación de terminales.- E → ctrl_data_port.3 RS → ctrl_data_port.2 D7 → ctrl_data_port.7 D6 → ctrl_data_port.6 D5 → ctrl_data_port.5 D4 → ctrl_data_port.4 void Lcd_Init(unsigned short *ctrl_data_port);

111 Lcd_Init 2 Ejemplo: Lcd_Init(&PORTB);

112 Lcd_Out Descripción: Imprime mensaje en el LCD en la fila y columna especificada (row y col). void Lcd_Out( unsigned short row, unsigned short col, char *text ); Ejemplo: -Imprime “Hello!” en el LCD en la línea 1, columna 3 Lcd_Out(1, 3, "Hello!");

113 Lcd_Out_Cp Descripción: Imprime mensaje en el LCD en la posición actual del cursor. void Lcd_Out_Cp(char *text); Ejemplo: - Imprime “Here!” en la posición actual del cursor Lcd_Out_Cp("Here!");

114 Lcd_Chr Descripción: Imprime un caracter en el LCD en la fila y columna especificada (row y col). void Lcd_Chr( unsigned short row, unsigned short col, char character ); Ejemplo: - Imprime la letra ‘i’ en el LCD en la línea 2,y columna 3 Lcd_Out(2, 3, 'i');

115 Lcd_Chr_Cp Descripción: Imprime un caracter en el LCD en la posición actual del cursor. void Lcd_Chr_Cp(char character); Ejemplo: - Imprime la letra ‘e’ en la posición actual del cursor Lcd_Chr_Cp('e');

116 Lcd_Cmd Descripción: Envía un comando al LCD. Se puede pasar a la función una de las constantes predefinidas. Los comandos son los mismos para ambos modos de manejo del LCD (bus 8 o 4 bits). void Lcd_Cmd(unsigned short command); Ejemplo: - Apaga el cursor, no aparece en el LCD Lcd_Cmd(LCD_CURSOR_OFF);

117 8.- LCD 4 BITS Diseñar el programa que inicialice un LCD, usando un bus de datos de 4 bits, y a continuación mande un mensaje cualquiera de bienvenida. El mensaje debe desplazarse hacia la derecha en forma continua.

118 LCD 4 BITS (algoritmo) Inicialice los puertos de datos y control.
Envía mensaje a desplegar. Envía comando de desplazamiento hacia la derecha. Repite el paso 3.

119 LCD 4 BITS (diagrama de flujo)
Inicializa puertos de datos y control Envía mensaje Envía comando de Corrimiento a la der.

120 LCD 4 BITS (esquemático Config)

121 LCD 4 BITS (programa 1) void main(void) { TRISD = 0; Lcd_Config(&PORTD,0,2,1,7,6,5,4); Lcd_Out(1,1,”Envio de datos”); Lcd_Out(2,1,”Usando bus de 4 bits”); while(1) { Lcd_Cmd(LCD_SHIFT_RIGHT); Delay_ms(200); }

122 LCD 4 BITS (programa 2) char mensaje[11]={‘B’, ‘u’, ‘s’, ‘ ’, ‘4’, ‘ ’, ‘b’, ‘i’, ‘t’, ‘s’, ‘\0’}; void main(void) { TRISD = 0; Lcd_Config(&PORTD,0,2,1,7,6,5,4); Lcd_Out(1, 6, mensaje); while(1) { Lcd_Cmd(LCD_SHIFT_RIGHT); Delay_ms(200); }

123 LCD 4 BITS (esquemático Init)

124 LCD 4 BITS (programa 3) char *mensaje3 = “programa 3 usando bus 4 bits”; void main(void) { TRISB = 0; TRISC = 0; Lcd8_Init(&PORTC,&PORTB); Lcd8_Out(1,16,mensaje3); Lcd8_Out(2,1,”fila=2 columna=5”); while(1) { Lcd8_Cmd(LCD_SHIFT_LEFT); Delay_ms(50); }

125 Conversión de tipo de datos
Tipo de dato a cadena ByteToStr ShortToStr WordToStr IntToStr LongToStr FloatToStr

126 ByteToStr Descripcion: Crea una cadena de salida de un pequeño numero sin signo (valor numérico menos a 0x100). La cadena esta ajustada a un ancho de 3 caracteres; Las posiciones a la izquierda que no se usan en la conversión se rellenan con espacios. void ByteToStr(unsigned short number, char *output); Ejemplo: unsigned short t = 24; char *txt=“ “; //se inicializa un apuntador a 4 espacios ByteToStr(t, txt); // txt es " 24" (un espacio en blanco)

127 ShortToStr void ShortToStr(short number, char *output);
Descripción: Crea una cadena de salida de un numero pequeño con signo (valor numérico menor a 0x100). La cadena esta ajustada a un ancho de 4 caracteres; Las posiciones a la izquierda que no se usan en la conversión se rellenan con espacios. void ShortToStr(short number, char *output); Ejemplo: short t = -4; char *txt=“ “; // Se inicializa un apuntador de 5 espacios ShortToStr(t, txt); // txt es " -4" (dos espacio en blanco)

128 WordToStr Descripción: Crea una cadena de salida de un numero sin signo (Valor numérico de una variable unsigned). La cadena esta ajustada a un ancho de 5 caracteres; Las posiciones a la izquierda que no se usan en la conversión se rellenan con espacios. void WordToStr(unsigned number, char *output); Ejemplo: unsigned t = 437; char *txt=“ “; // Inicializa un apuntador con 6 espacios WordToStr(t, txt); // txt es “ 437" (dos espacios vacios)

129 IntToStr void IntToStr(int number, char *output);
Descripción: Crea una cadena de salida de un numero con signo (Valor numérico de una variable int). La cadena esta ajustada a un ancho de 6 caracteres; Las posiciones a la izquierda que no se usan en la conversión se rellenan con espacios. void IntToStr(int number, char *output); Ejemplo: int j = -4220; char *txt=“ “; // Inicializa un apuntador con 6 espacios IntToStr(j, txt); // txt es " -4220" (un espacio en blanco)

130 LongToStr void LongToStr(long number, char *output);
Descripción: Crea una cadena de salida de un numero largo con signo (Valor numérico de una variable long). La cadena esta ajustada a un ancho de 11 caracteres; Las posiciones a la izquierda que no se usan en la conversión se rellenan con espacios. void LongToStr(long number, char *output); Ejemplo: long jj = ; char *txt=“ “; // Inicializa un apuntador con 12 espacios LongToStr(jj, txt); // txt es “ " (3 espacios en blanco)

131 FloatToStr void FloatToStr(float number, char *output);
Descripción: Crea una cadena de salida de un numero de punto flotante. La cadena contiene un formato normalizado de un numero (mantisa entre 0 y 1) con signo en la primera posición. La mantisa esta ajustada a un formato de 6 dígitos, 0.ddddd; Hay siempre 5 dígitos a continuación del punto decimal. void FloatToStr(float number, char *output); Ejemplo: float ff = ; char *txt=“ “; // Inicializa un apuntador con 14 espacios FloatToStr(ff, txt); // txt es " e3"

132 9.- Contador 0-9 (problema)
Se quiere un programa que visualice un conteo de 0 a 9 en un LCD.

133 Contador 0-9 (algoritmo)
Configura el LCD Inicializa el contador Convierte a ASCII el valor del contador Envía valor en ASCII al LCD Incrementa el contador Regresa a 3

134 Contador 0-9 (diagrama de flujo)
teclado Inicializa puertos (LCD) Convierte contador a ASCII Envía a LCD ASCII Incrementa contador Inicializa contador

135 Contador 0-9 (programa) void main(void) { unsigned short contador; char cadena[ 5 ] = “ “; TRISD = 0; Lcd_Config(&PORTD,0,2,1,7,6,5,4); contador = 0; Lcd_Out(1,1,”Contador 0-9”); while(1) { ShortToStr ( contador , cadena ); Lcd_Out ( 2 , 8 , cadena ); contador ++; Delay_ms(500); }

136 Contador 0-9 (esquemático)

137 Contador 0-9 (funcionamiento)
Contador 0-9 : 1 Contador 0-9 : 2 Contador 0-9 : 3 Contador 0-9 : 4 Contador 0-9 : 5 Contador 0-9 : 6 Contador 0-9 : 9 . . .

138 Ejercicio propuesto 8 Programa que utilice un LCD, configurado para usar un bus de 8 bits. En el LCD deben aparecer en forma secuencial, los números de la secuencia 1 – 2 – 4 – 8 – 16 – 32 – 64 – 128 – 256 – 512 – 1024 – 2048 – 4096 – 8192 – Los numero deben ser generados por operaciones aritméticas. El desplegado debe hacerse de la forma mostrada en las siguientes figuras. Se utiliza la segunda fila, presentando hasta 3 numeros consecutivos, un numero a la izquierda, uno mas al centro y otro a la derecha.

139 Ejercicio propuesto 8 . . . Serie de numeros Serie de numeros 1
1 2 Serie de numeros 1 2 4 Serie de numeros 8 Serie de numeros 8 16 Serie de numeros Serie de numeros . . .

140 Ejercicio propuesto 9 El alumno diseñara un programa en donde se muestre en un LCD los números desde 00 hasta el 99. Con un intervalo de tiempo entre cambio igual a 500 milisegundos.

141 Ejercicio propuesto 9 . . . Contador 00-99 cada 500 mseg 00
01 Contador cada 500 mseg 02 Contador cada 500 mseg 03 Contador cada 500 mseg 04 Contador cada 500 mseg 05 Contador cada 500 mseg 06 Contador cada 500 mseg 99 . . .

142 Teclado matricial (esquemático)

143 Teclado matricial (funciones)
Keypad_Init Keypad_Read Keypad_Released

144 Keypad_Init void Keypad_Init(unsigned *port);
Descripción: Inicializa el puerto para trabajar con el teclado. Las terminales del teclado deben estar conectadas de la siguiente forma: port.F0 columna 1 port.F1 columna 2 port.F2 columna 3 port.F3 columna 4 port.F4 fila 1 port.F5 fila 2 port.F6 fila 3 port.F7 fila 4 void Keypad_Init(unsigned *port);

145 Keypad_Init 2 Ejemplo: Keypad_Init(&PORTB);

146 Keypad_Read Descripción: Verifica si alguna tecla fue presionada. La función regresa 1 a 12, dependiendo la tecla presionada, o 0 si no existe tecla presionada. 1 1 2 2 … … 9 9 * 10 0 11 # 12 unsigned short Keypad_Read(void); Ejemplo: kp = Keypad_Read();

147 Keypad_Released Descripción: La llamada a la función Keypad_Released es una función blocking call: La función espera hasta que cualquier tecla sea presionada y liberada. Cuando se libera, la función regresa de 1 a 12, dependiendo de la tecla presionada. unsigned short Keypad_Released(void); Ejemplo: Keypad_Released();

148 10.- Teclado matricial (problema)
Se desea un programa con el cual se muestre en un LCD (bus 8 bits en puerto B y puerto C como control) la tecla presionada en un teclado matricial (puerto D).

149 Teclado matricial (algoritmo)
Configuración de puertos (teclado y lcd). Lectura de teclado Conversión a ASCII Envío al LCD Regresar a 2

150 Teclado matricial(diagramas de flujo)
Inicializa puertos (LCD y teclado) Lee teclado Convierte a ASCII Envía a LCD

151 Teclado matricial (esquemático)

152 Teclado matricial (programa)
unsigned short kp, cnt; char txt[5]; void main() { cnt = 0; Keypad_Init(&PORTD); Lcd8_Init(&PORTC, &PORTB, 0, 2, 1, 7, 6, 5, 4, 3, 2, 1, 0); // Inicializa LCD en puerto B y puerto C Lcd8_Cmd(LCD_CLEAR); // Limpia display Lcd8_Cmd(LCD_CURSOR_OFF); // Cursor apagado Lcd8_Out(1, 1, "Key :"); Lcd8_Out(2, 1, "Times:"); do { kp = 0; // Espera a que se presione una tecla pressed do kp = Keypad_Read(); while (!kp); // Prepara valor para salida switch (kp) { case 10: kp = 42; break; // '*' case 11: kp = 48; break; // '0' case 12: kp = 35; break; // '#' default: kp += 48; } cnt++; Lcd9_Chr(1, 10, kp); if (cnt == 255) { cnt = 0; Lcd8_Out(2, 10, " "); } // Imprime en LCD WordToStr(cnt, txt); Lcd8_Out(2, 10, txt); } while (1);

153 Ejercicio propuesto 9 El alumno realizara un programa que tome 3 números desde un teclado matricial, los guarde en un arreglo, los convierta a un numero que se guarde en una variable tipo entera. Con este numero el alumno deberá proporcionar el producto por 2 y división entre 2 resultantes. Visualizando los resultados en un LCD.

154 Ejercicio propuesto 9 Cual es el numero de 3 cifras:
025 Cual es el numero de 3 cifras: 025 El producto por 2 es: 050 Cual es el numero de 3 cifras: 025 El producto por 2 es: 050 La división entre 2 es: 012


Descargar ppt "EAR EMTIIB Curso-Taller programación en Lenguaje C para microcontroladores PIC PIC18F452."

Presentaciones similares


Anuncios Google