Sei sulla pagina 1di 96

Sistemas Embebidos

Sistemas Embebidos Programación en C microcontroladores PIC C C S C P I C 1 6

Programación en C microcontroladores PIC

C C S

C

P I C 1 6 F 8 7 7 A

Puertos de entrada y salida

Puertos de entrada y salida  PORTA ( RA5, RA4, RA3, RA2, RA1, RA0 ) 

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 )

PUERTOS

PUERTOS Puerto # funciones Funciones PORTA 3 Entradas digital Salidas digital Entradas analógicas

Puerto

# funciones

Funciones

PORTA

3

Entradas digital Salidas digital Entradas analógicas

PORTB

2

Entradas digital Salidas digital

PORTC

3

Entradas digital Salidas digital

Medios de comunicación

PORTD

3

Entradas digital Salidas digital Puerto paralelo esclavo

PORTE

4

Entradas digital Salidas digital Entradas analógicas Control del puerto paralelo esclavo

esclavo PORTE 4 Entradas digital Salidas digital Entradas analógicas Control del puerto paralelo esclavo

FUNCIONES PORTA

FUNCIONES PORTA Terminal   Funciones   RA0 Ent. Digital Sal. Digital Ent. Analógica  

Terminal

 

Funciones

 

RA0

Ent. Digital

Sal. Digital

Ent. Analógica

 

RA1

Ent. Digital

Sal. Digital

Ent. Analógica

 

RA2

Ent. Digital

Sal. Digital

Ent. Analógica

V REF -

RA3

Ent. Digital

Sal. Digital

Ent. Analógica

V REF +

RA4

Ent. Digital

Sal. Digital

Ent. contador 1

 

RA5

Ent. Digital

Sal. Digital

Ent. Analógica

 
Digital Sal. Digital Ent. contador 1   RA5 Ent. Digital Sal. Digital Ent. Analógica  

FUNCIONES PORTB

FUNCIONES PORTB Terminal   Funciones RB0 Ent. Digital Sal. Digital Ent. Interrupción 0 RB1

Terminal

 

Funciones

RB0

Ent. Digital

Sal. Digital

Ent. Interrupción 0

RB1

Ent. Digital

Sal. Digital

 

RB2

Ent. Digital

Sal. Digital

 

RB3

Ent. Digital

Sal. Digital

PGM ( función LVP )

RB4

Ent. Digital

Sal. Digital

 

RB5

Ent. Digital

Sal. Digital

 

RB6

Ent. Digital

Sal. Digital

PGC ( función LVP )

RB7

Ent. Digital

Sal. Digital

PGD ( función LVP )

Ent. Digital Sal. Digital PGC ( función LVP ) RB7 Ent. Digital Sal. Digital PGD (
 

FUNCIÓN PORTC

 
 
 

Terminal

 

Funciones

RC0

Ent. Digital

Sal.

Sal. Osc timer 1

Ent. Contador 1

Digital

RC1

Ent. Digital

Sal.

Ent. Osc Timer 1

Captura/Comp/PWM 1

Digital

RC2

Ent. Digital

Sal.

 

Captura/Comp/PWM 2

Digital

RC3

Ent. Digital

Sal.

Reloj sincrono SPI

Reloj síncrono I2C

Digital

RC4

Ent. Digital

Sal.

Datos entrada SPI

Datos I2C

Digital

RC5

Ent. Digital

Sal.

Datos salida SPI

 

Digital

RC6

Ent. Digital

Sal.

Transmisión USART

 

Digital

RC7

Ent. Digital

Sal.

Recepción USART

 

Digital

FUNCIONES PORTD

FUNCIONES PORTD Terminal   Funciones RD0 Ent. Digital Sal. Digital Bit 0 puerto paralelo esclavo

Terminal

 

Funciones

RD0

Ent. Digital

Sal. Digital

Bit 0 puerto paralelo esclavo

RD1

Ent. Digital

Sal. Digital

Bit 1 puerto paralelo esclavo

RD2

Ent. Digital

Sal. Digital

Bit 2 puerto paralelo esclavo

RD3

Ent. Digital

Sal. Digital

Bit 3 puerto paralelo esclavo

RD4

Ent. Digital

Sal. Digital

Bit 4 puerto paralelo esclavo

RD5

Ent. Digital

Sal. Digital

Bit 5 puerto paralelo esclavo

RD6

Ent. Digital

Sal. Digital

Bit 6 puerto paralelo esclavo

RD7

Ent. Digital

Sal. Digital

Bit 7 puerto paralelo esclavo

Sal. Digital Bit 6 puerto paralelo esclavo RD7 Ent. Digital Sal. Digital Bit 7 puerto paralelo

FUNCIONES PORTE

FUNCIONES PORTE Terminal   Funciones   RE0 Ent. Digital Sal. Digital Ent. Analógica Lectura

Terminal

 

Funciones

 

RE0

Ent. Digital

Sal. Digital

Ent. Analógica

Lectura PSP

RE1

Ent. Digital

Sal. Digital

Ent. Analógica

Escritura PSP

RE2

Ent. Digital

Sal. Digital

Ent. Analógica

Habilitación PSP

Ent. Analógica Escritura PSP RE2 Ent. Digital Sal. Digital Ent. Analógica Habilitación PSP
 

Tipos de datos

 
  Tipos de datos   Tipo bytes Rango ( unsigned ) char 1 0 255 signed

Tipo

bytes

Rango

(unsigned) char

1

0

255

signed char (signed) short (int) unsigned short (int)

1

- 128

127

1

- 128

127

1

0

255

(signed) int

2

-32768

32767

unsigned (int)

2

0

65535

(signed) long (int)

4

-2147483648

2147483647

unsigned long (int)

4

0

4294967295

Tipos de datos 2

Tipos de datos 2 Tipo bytes Rango float 4 ±1.17549435082 x 10 - 3 8 ±6.80564774407

Tipo

bytes

Rango

float

4

±1.17549435082 x 10 -38

±6.80564774407 x 10 38

double

4

±1.17549435082 x 10 -38

±6.80564774407 x 10 38

long double

4

±1.17549435082 x 10 -38

±6.80564774407 x 10 38

Asignación de datos

Asignación de datos  Decimal  int i = 10;  int j = -10; 

Decimal

int i = 10;

int j = -10;

int p = 0;

/* decimal 10 */

/* decimal -10 */

/* decimal 0 */

Hexadecimal

short

short

int

/* decimal 55 */ /* decimal 127 */ /* decimal 293 */

x = 0x37;

y = 0x7F;

z = 0x125;

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

Registros asociados

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

Entrada/salida

PORTA

Configuración

TRISA

asociados Entrada/salida  PORTA Configuración TRISA  PORTB TRISB  PORTC TRISC  PORTD TRISD 

PORTB

TRISB

Entrada/salida  PORTA Configuración TRISA  PORTB TRISB  PORTC TRISC  PORTD TRISD  PORTE

PORTC

TRISC

Entrada/salida  PORTA Configuración TRISA  PORTB TRISB  PORTC TRISC  PORTD TRISD  PORTE

PORTD

TRISD

Entrada/salida  PORTA Configuración TRISA  PORTB TRISB  PORTC TRISC  PORTD TRISD  PORTE

PORTE

TRISE

Entrada/salida  PORTA Configuración TRISA  PORTB TRISB  PORTC TRISC  PORTD TRISD  PORTE

Entrada o salida

Entrada o salida  DECLARACIÓN DE PUERTOS #byte REGISTRO=0xDATO; REGISTRO=0xDIRECCIÓN #byte PORTD=0x00; PORTD=0x08

DECLARACIÓN DE PUERTOS

#byte

REGISTRO=0xDATO;

REGISTRO=0xDIRECCIÓN

#byte

PORTD=0x00;

PORTD=0x08

SALIDA DE DATOS :

output_PUERTO(DATO);

output_a(0x08);

Entrada o salida

Entrada o salida  ENTRADA DE DATOS: value = input_a();  La asignación es individual correspondiente

ENTRADA DE DATOS:

value = input_a();

La asignación es individual correspondiente a cada terminal del puerto.

VAR=input(PIN_D7);

Acceso individual de bits 1

Acceso individual de bits 1  CCS te permite acceso individual en variables de 8 bits

CCS te permite acceso individual en variables de 8 bits

(char and unsigned short).

Ejemplo:

output_low(PIN_D0);

output_high(PIN_D1);

 

Entrada o salida

  Entrada o salida  Si deseamos configurar el puerto A con la siguiente asignación:  

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’01110000’; TRISA = 0x70;

o

o

TRISA = 112;

 
ADCON1 ADCON1 = 0 0 0 0 0 1 1 0 ADCON1 = 6 ;
ADCON1
ADCON1 =
0
0
0
0
0
1
1
0
ADCON1 = 6 ;

Delay_ms (retardo por software)

Delay_ms ( retardo por software )  Descripción: Crea un retardo por software dado el tiempo

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

void Delay_ms(const time_in_ms)

Ejemplo:

Generar un retardo de 1 segundo

Delay_ms(1000);

/* Pausa de un segundo */

Estructura de un programa en C

Estructura de un programa en C ( ciclo while ) // Definición de variables globales //

( 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

}

}

Estructura de un programa en C

Estructura de un programa en C ( ciclo for ) // Definición de variables globales //

( 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

}

}

Estructura de un programa en C

Estructura de un programa en C ( ciclo do - while ) // Definición de variables

( 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 ) ;

}

1.- Encendido de LED

1. - Encendido de LED  Crear un programa que encienda y apague un led, ubicado

Crear un programa que encienda y apague un led,

ubicado en la terminal RD0 del puerto D. El tiempo

de encendido y apagado es de 100 milisegundos.

Encendido de LED (algoritmo)

Encendido de LED ( algoritmo ) Configurar el bit 0 del puerto D como salida de

Configurar el bit 0 del puerto D como salida de

datos

Encendido del led

Retardo por software de 100 milisegundos.

1.

2.

3.

4.

5.

6.

Apagado del led

Retardo por software de 100 milisegundos

Repetir el paso 2

Encendido de LED (diagrama de flujo)

Encendido de LED ( diagrama de flujo ) Led Configura bit del puerto como salida Enciende

Led

Led Configura bit del puerto como salida Enciende bit Retardo de 100ms Apaga bit Retardo de

Configura bit del puerto como salida

Led Configura bit del puerto como salida Enciende bit Retardo de 100ms Apaga bit Retardo de
Enciende bit Retardo de 100ms Apaga bit Retardo de 100 ms
Enciende bit
Retardo de 100ms
Apaga bit
Retardo de 100 ms
de flujo ) Led Configura bit del puerto como salida Enciende bit Retardo de 100ms Apaga
Encendido de LED (Programa)
Encendido de LED (Programa)

Ejercicios propuestos 1

Ejercicios propuestos 1 1. El alumno encenderá y apagará en forma alternada dos led’s ubicados en

1. El alumno encenderá y apagará 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.

2. 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.

2.- Luces secuenciales

2.- Luces secuenciales  Programa que envíe la siguiente secuencia de datos al puerto de salida

Programa que envíe la siguiente secuencia de datos al puerto de salida D.

Secuencia :

00000001

00000010

00000100

00001000

00010000

00100000

01000000

10000000

:  00000001  00000010  00000100  00001000  00010000  00100000  01000000 

Luces secuenciales (algoritmo)

Luces secuenciales ( algoritmo ) 1. 2. 3. 4. Configuración de puerto como salida de datos.

1.

2.

3.

4.

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

Luces secuenciales (diagrama de flujo)

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

Luces

Configura puerto como salida
Configura puerto como salida
Configura puerto como salida

Configura puerto como salida

Configura puerto como salida
Configura puerto como salida
Configura puerto como salida
Configura puerto como salida
Configura puerto como salida
Configura puerto como salida
Configura puerto como salida
Configura puerto como salida
Configura puerto como salida
Configura puerto como salida
Configura puerto como salida
Configura puerto como salida
Configura puerto como salida
Configura puerto como salida
Configura puerto como salida
Configura puerto como salida
Envía 00000100 Envía 00001000 Envía 00010000
Envía 00000100
Envía 00001000
Envía 00010000
Envía 00100000

Envía 00100000

Envía 00100000
00000100 Envía 00001000 Envía 00010000 Envía 00100000 Envía 00000001 Envía 00000010 Envía 01000000

Envía 00000001

Envía 00000010

Envía 00000001 Envía 00000010 Envía 01000000 Envía 10000000
Envía 00000001 Envía 00000010 Envía 01000000 Envía 10000000
Envía 00000001 Envía 00000010 Envía 01000000 Envía 10000000
Envía 01000000

Envía 01000000

Envía 01000000
Envía 00000001 Envía 00000010 Envía 01000000 Envía 10000000
Envía 00000001 Envía 00000010 Envía 01000000 Envía 10000000

Envía 10000000

Envía 00000001 Envía 00000010 Envía 01000000 Envía 10000000
Envía 00000001 Envía 00000010 Envía 01000000 Envía 10000000
Envía 00010000 Envía 00100000 Envía 00000001 Envía 00000010 Envía 01000000 Envía 10000000

Luces secuenciales (esquemático)

Luces secuenciales ( esquemático )
Luces secuenciales ( esquemático )

Luces secuenciales (programa)

Luces secuenciales ( programa ) void main(void) { TRISD = 0; DE SALIDA while ( 1

void main(void)

{

TRISD = 0;

DE SALIDA

while ( 1 )

{

PORTD = 0b00000001;

Delay_ms(500);

PORTD = 0b00000010;

Delay_ms(500);

PORTD = 0b00000100;

Delay_ms(500);

PORTD = 0b00001000;

Delay_ms(500);

PORTD = 0b00010000;

Delay_ms(500);

PORTD = 0b00100000;

Delay_ms(500);

PORTD = 0b01000000;

Delay_ms(500);

PORTD = 0b10000000;

Delay_ms(500);

}

}

// CONFIGURACION COMO PUERTO

// CICLO INFINITO

// ENVIA PRIMER DATO

// ENVIA SEGUNDO DATO

// ENVIA TERCER DATO

Arreglos (definiciones)

Arreglos ( definiciones ) #define MAX 50 int float float char short long unsigned peso[7]; unsigned

#define

MAX

50

int

float

float

char

short

long

unsigned peso[7]; unsigned short d[3];

vector_one[10];

vector_two[MAX];

/* arreglo de 10 enteros */ /* arreglo 50 flotantes */ /* arreglo 30 flotantes */

vector_three[MAX - 20];

numero[5];

dato[8];

temperatura[15];

Arreglos (Inicializando)

Arreglos ( Inicializando ) /* Arreglo el cúal contiene el número de días de cada mes

/* 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";

Condicionante if

Condicionante if if ( expresión ) conjunto 1 [ else conjunto 2 ]  Cuando la

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.

Símbolos de condición

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

Operador

==

!=

>

Operación

igual no igual mayor que menor que

mayor que o igual a

menor que o igual a

<

>=

<=

3.- Luces con arreglo (algoritmo)

3.- Luces con arreglo ( algoritmo ) Configuración de puerto como salida. Inicializa apuntador. Envío de

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.

1.

2.

3.

4.

5.

6.

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

Ejercicio propuesto

Ejercicio propuesto 1. Enviar una secuencia por el puerto B usando los valores almacenado en un

1. Enviar una secuencia por el puerto B usando los

valores almacenado en un arreglo.

00000011

00000110

00001100

00011000

00110000

01100000

11000000

 

Operadores a nivel de bits

  Operadores a nivel de bits Operador operacion & AND; compara pares de bits y regresa

Operador

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.

Ejemplos operadores lógicos

Ejemplos operadores lógicos /* Igual 0x1230 */ 0x1234 & 0x5678 porque 0x1234 : 0x5678: 0001 0010

/* Igual 0x1230 */

0x1234 & 0x5678

porque 0x1234 :

0x5678:

0001 0010 0011 0100 0101 0110 0111 1000

-----------------------------------

0001 0010 0011 0000

& :

esto es, 0x1230

/* De forma similar: */

0x1234 | 0x5678; 0x1234 ^ 0x5678; ~ 0x1234;

/* Igual 0x567C */ /* Igual 0x444C */ /* Igual 0xEDCB */

Ejemplos a nivel de bits

Ejemplos a nivel de bits /* Igual 000040 */ /* Igual 0x8010, sobreflujo! */ 000001 <<

/* Igual 000040 */

/* Igual 0x8010, sobreflujo! */

000001 << 5;

0x3801 << 4;

0x02F6 >> 4;

0xFF56 >> 4;

/* Igual 0x002F */

/* Igual 0x0FF5 */

Corrimiento a la derecha division entre 2 n . Corrimiento a la izquierda producto por 2 n .

 

4.- Luces con desplazamiento (algoritmo)

  4.- Luces con desplazamiento ( algoritmo ) 1. Configuración de puerto como salida. 2. Inicializa

1.

Configuración de puerto como salida.

2.

Inicializa variable.

3.

Envía valor de la variable al puerto.

4.

Modifica la variable.

5.

Si variable es cero, Inicializa la variable.

6.

Regresa a 3.

Luces con desplazamiento (diagrama de

flujo) Luces Configura puerto como salida Modifica variable Inicializa variable si Inicializa variable = 0
flujo)
Luces
Configura puerto
como salida
Modifica
variable
Inicializa variable
si
Inicializa
variable = 0
variable
Envía variable
al puerto
no
 

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.

Ejercicios propuestos

Ejercicios propuestos 1. Realizar un programa que envíe al puerto C los siguientes valores utilizando para

1. Realizar 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

2. 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

Acceso a bits individual

Acceso a bits individual  mikroC te permite acceso individual en variables de 8 bits (char

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 F0F7 no se reconocen en minúsculas.

5.- Secuencias condicionadas ( problema )

5.- Secuencias condicionadas ( problema )  Realizar un programa que envíe secuencias distintas al puerto

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.

 

Secuencias condicionadas (algoritmo)

  Secuencias condicionadas ( algoritmo ) 1. Configuración de puertos 2. Inicia contador 3. Si RA0

1.

Configuración de puertos

2.

Inicia contador

3.

Si RA0 es igual a 0 entonces envía secuencia_izquierda

4.

De lo contrario envía secuencia_derecha

5.

Incrementa contador

6.

Si contador es igual a 8 entonces contador igual a

0

7.

Regresa a 3

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

Secuencias condicionadas (programa)

Secuencias condicionadas ( programa ) short izquierda[10] = { 0, 1, 3, 6, 12, 24, 48,

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;

}

}

Ejercicio propuesto

Ejercicio propuesto 1. Desarrollar un programa que envíe una secuencia de números BCD a un display

1. Desarrollar 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.

MOTOR A PASOS 2

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

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

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

Ejercicios propuestos 5 (esquemático)

Ejercicios propuestos 5 ( esquemático )
Ejercicios propuestos 5 ( esquemático )

MOTOR A PASOS 1

MOTOR A PASOS 1  Unipolar.- Tiene 4 bobinas independientes (A, B, C, D) y una

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

MOTOR A PASOS 1  Unipolar.- Tiene 4 bobinas independientes (A, B, C, D) y una

MOTOR A PASOS 2

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

Bipolar.- Tiene 2 bobinas (A C, B D)

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

Secuencias de activación 1

Secuencias de activación 1  Unipolar.- Movimiento de 1 paso por pulso (mayor torque). Paso A

Unipolar.- Movimiento de 1 paso por pulso (mayor torque).

Paso

A

B

C

D

1

1

1

0

0

2

0

1

1

0

3

0

0

1

1

4

1

0

0

1

A B C D 1 1 1 0 0 2 0 1 1 0 3 0

Secuencias de activación 2

Secuencias de activación 2  Unipolar.- Movimiento de 1 paso por pulso (mayor velocidad). Paso A

Unipolar.- Movimiento de 1 paso por pulso (mayor velocidad).

Paso

A

B

C

D

1

1

0

0

0

2

0

1

0

0

3

0

0

1

0

4

0

0

0

1

A B C D 1 1 0 0 0 2 0 1 0 0 3 0

Secuencias de activación 3

Secuencias de activación 3  Unipolar.- Movimiento de 1/2 paso por pulso. Paso A B C

Unipolar.- Movimiento de 1/2 paso por pulso.

Paso

A

B

C

D

0.5

1

0

0

0

1

1

1

0

0

1.5

0

1

0

0

2

0

1

1

0

2.5

0

0

1

0

3

0

0

1

1

3.5

0

0

0

1

4

1

0

0

1

1 1 0 2.5 0 0 1 0 3 0 0 1 1 3.5 0 0

Secuencias de activación 4

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

Bipolar.- Movimiento de un paso

Paso

A

C

B

D

1

1

0

1

0

2

1

0

0

1

3

0

1

0

1

4

0

1

1

0

A C B D 1 1 0 1 0 2 1 0 0 1 3 0

Secuencia de activación 5

Secuencia de activación 5 • Bipolar.- Movimiento de medio paso Paso A C B D 0.5

Bipolar.- Movimiento de medio paso

Paso

A

C

B

D

0.5

1

0

1

0

1

1

0

0

0

1.5

1

0

0

1

2

0

0

0

1

2.5

0

1

0

1

3

0

1

0

0

3.5

0

1

1

0

4

0

0

1

0

0 0 1 2.5 0 1 0 1 3 0 1 0 0 3.5 0 1
Circuito de potencia 1 (motor unipolar )
Circuito de potencia 1 (motor unipolar )
Circuito de potencia 2 (motor unipolar )
Circuito de potencia 2 (motor unipolar )

Circuito de potencia 3 (motor bipolar )

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

Este mismo diagrama se repetiría para manejar la segunda bobina

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

Circuito de potencia x (motor a pasos )

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

Circuito integrado UCN 5804

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

Circuito integrado SAA1042

Circuito de potencia x ( motor a pasos ) Circuito integrado UCN 5804 Circuito integrado SAA1042
Circuito de potencia x1 (motor unipolar )
Circuito de potencia x1 (motor unipolar )
Circuito de potencia x2 (motor bipolar )
Circuito de potencia x2 (motor bipolar )

Ejercicio propuesto

Ejercicio propuesto 2.- Desarrollar un programa que envíe la secuencia de activación de un motor a

2.- Desarrollar 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.

Ejercicios propuestos 5 (esquemático)
Ejercicios propuestos 5 (esquemático)

6.- Display de 7 segmentos

6.- Display de 7 segmentos  Realizar un programa en donde se implemente un contador de

Realizar un programa en donde se implemente un contador de 00-99 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.

 

Display de 7 segmentos (algoritmo)

  Display de 7 segmentos ( algoritmo ) 1. Configurar los puertos, inicialización de variables (unidades

1.

Configurar los puertos, inicialización de variables (unidades = ‘0’

decenas = ‘0’)

2.

Envío de decenas

3.

Habilitación de decenas

4.

Envío de unidades

5.

Habilitación de unidades

6.

Incremento de unidades

7.

Si unidades mayor de ‘9’ entonces 9

8.

Sigue 2

9.

Unidades = ‘0’

10.

Incrementa decenas

11.

Si decenas mayor de ‘9’ entonces 12

12.

Sigue 2

13.

Decenas=‘0’

14.

Sigue 2

Display de 7 segmentos (diagrama de flujo)

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

Limpia decenas

Display de 7 segmentos (programa)

Display de 7 segmentos ( programa ) short numero[ ] = { 0x3F, 0x06, 0x1B, 0x4F,

short numero[ ] = { 0x3F, 0x06, 0x1B, 0x4F, 0x66, 0x6D, 0x5E, 0x07, 0x7F, 0x67 };

void main ( void )

{

TRISB = 0;

TRISC = 0; unidades = decenas = ‘0’;

while ( 1 )

{

PORTB = numero [ decenas ]; PORTC.F0 = 1;

decenas

delay-ms( 10 );

PORTC.F0 = 0; PORTB = numero [ unidades ]; PORTC.F1 = 1;

decenas

delay-ms( 10 ); PORTC.F1 = 0;

unidades++;

if ( unidades > ’9’ )

{

unidades = ‘0’;

decenas++;

if ( decenas > ’9’ )

}

{

decenas = ‘0’;

}

// Programa principal

// Configuración de puertos

// Inicialización de variables

// Programa de usuario

// Envía decenas // Habilita el display de

// Envía unidades // Habilita el display de

// Incrementa unidades

//

// Incrementa decenas

Reinicia unidades

// Reinicie decenas

}

}

Display de 7 segmentos ( esquemático )
Display de 7 segmentos ( esquemático )

Ejercicio propuesto

Ejercicio propuesto  Modificar el programa elaborado de tal forma que se cambie el incremento por

Modificar 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.

Ejercicio propuesto 6 (esquemático)
Ejercicio propuesto 6 (esquemático)

Conversión de tipo de datos

Conversión de tipo de datos Tipo de dato a cadena  ByteToStr  ShortToStr  WordToStr

Tipo de dato a cadena

ByteToStr

ShortToStr

WordToStr

IntToStr LongToStr

FloatToStr

ByteToStr

ByteToStr Descripcion: Crea una cadena de salida de un pequeño numero sin signo (valor numérico menos

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)

ShortToStr

ShortToStr Descripción: Crea una cadena de salida de un numero pequeño con signo (valor numérico menor

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)

WordToStr

WordToStr Descripción: Crea una cadena de salida de un numero sin signo (Valor numérico de una

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)

IntToStr

IntToStr Descripción: Crea una cadena de salida de un numero con signo (Valor numérico de una
IntToStr Descripción: Crea una cadena de salida de un numero con signo (Valor numérico de una

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)

“; // Inicializa un apuntador con 6 espacios IntToStr(j, txt); // txt es " -4220" (un

LongToStr

LongToStr Descripción: Crea una cadena de salida de un numero largo con signo (Valor numérico de

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 = -3700000;

char *txt=“

“;

// Inicializa un apuntador con 12 espacios

LongToStr(jj, txt);

// txt es “

-3700000" (3 espacios en blanco)

FloatToStr

FloatToStr Descripción: Crea una cadena de salida de un numero de punto flotante. La cadena contiene

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 = -374.2;

char *txt=“

“;

// Inicializa un apuntador con 14 espacios

FloatToStr(ff, txt);

// txt es "-0.37420e3"

Teclado matricial (esquemático)
Teclado matricial (esquemático)

Teclado matricial (funciones)

Teclado matricial ( funciones )  Keypad_Init  Keypad_Read  Keypad_Released

Keypad_Init

Keypad_Read Keypad_Released

Keypad_Init

Keypad_Init  Descripción: Inicializa el puerto para trabajar con el teclado. Las terminales del teclado deben

Descripción: Inicializa el puerto para trabajar con el teclado. Las terminales del teclado deben estar conectadas de la siguiente forma:

port.F0

port.F1

port.F2

port.F3

port.F4

port.F5

port.F6

port.F7

columna 1

columna 2 columna 3

columna 4 fila 1

fila 2

fila 3

fila 4

void Keypad_Init(unsigned *port);

Keypad_Init 2

Keypad_Init 2 Ejemplo: Keypad_Init(&PORTB);

Ejemplo:

Keypad_Init(&PORTB);

Keypad_Init 2 Ejemplo: Keypad_Init(&PORTB);

Keypad_Read

Keypad_Read  Descripción: Verifica si alguna tecla fue presionada. La función regresa 1 a 12, dependiendo
Keypad_Read  Descripción: Verifica si alguna tecla fue presionada. La función regresa 1 a 12, dependiendo

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();

1 1 2 2 … … 9 9 * 10 0 11 # 12  unsigned

Keypad_Released

Keypad_Released  Descripción: La llamada a la función Keypad_Released es una función blocking call: La función

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();

10.- Teclado matricial (problema)

10.- Teclado matricial ( problema )  Se desea un programa con el cual se muestre

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).

Teclado matricial (algoritmo)

Teclado matricial ( algoritmo ) Configuración de puertos (teclado y lcd). Lectura de teclado Conversión a

Configuración de puertos (teclado y lcd).

Lectura de teclado

Conversión a ASCII

Envío al LCD

Regresar a 2

1.

2.

3.

4.

5.

Teclado matricial (diagramas de flujo)

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

Teclado matricial (programa)

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); y puerto C

// Inicializa LCD en puerto B

Lcd8_Cmd(LCD_CLEAR);

 

// Limpia display // Cursor apagado

Lcd8_Cmd(LCD_CURSOR_OFF);

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); switch (kp)

 

// Prepara valor para salida

{ case 10:

kp = 42;

 

break;

// '*'

 

case 11:

kp = 48; break; kp = 35; break; kp += 48;

 
   

// '0'

 

case 12:

 
   

// '#'

 

default:

 

}

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);

 

}

Ejercicio propuesto 9

Ejercicio propuesto 9 1. Realizar un programa que tome 3 números desde un teclado matricial, los

1. Realizar un programa que tome 3 números desde

un teclado matricial, los guarde en un arreglo, los

convierta a un número que se guarde en una

variable tipo entera. Con este número el alumno

deberá proporcionar el producto por 2 y división

entre 2 resultantes. Visualizando los resultados en

un LCD.

Ejercicio propuesto 9

Ejercicio propuesto 9 Cual es el numero de 3 cifras: Cual es el numero de 3
Cual es el numero de 3 cifras:
Cual es el numero de 3 cifras:
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
Cual es el numero de 3 cifras: 025
Cual es el numero de 3 cifras:
025
Cual es el numero de 3 cifras: 025 El producto por 2 es: 050 La
Cual es el numero de 3 cifras:
025
El producto por 2 es: 050
La división entre 2 es: 012