Академический Документы
Профессиональный Документы
Культура Документы
Programación en C
microcontroladores PIC
CCS C
PIC16F877A
Puertos de entrada y salida
Terminal Funciones
RA0 Ent. Digital Sal. Digital Ent. Analógica
Terminal Funciones
RB0 Ent. Digital Sal. Digital Ent. Interrupción 0
Terminal Funciones
RC0 Ent. Digital Sal. Sal. Osc timer 1 Ent. Contador 1
Digital
RC3 Ent. Digital Sal. Reloj sincrono SPI Reloj síncrono I2C
Digital
Terminal Funciones
RD0 Ent. Digital Sal. Digital Bit 0 puerto paralelo esclavo
Terminal Funciones
RE0 Ent. Digital Sal. Digital Ent. Analógica Lectura PSP
Decimal
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 */
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
Entrada/salida Configuración
PORTA TRISA
PORTB TRISB
PORTC TRISC
PORTD TRISD
PORTE TRISE
Entrada o salida
DECLARACIÓN DE PUERTOS
#byte REGISTRO=0xDIRECCIÓN
REGISTRO=0xDATO;
#byte PORTD=0x08
PORTD=0x00;
SALIDA DE DATOS :
output_PUERTO(DATO);
output_a(0x08);
Entrada o salida
ENTRADA DE DATOS:
value = input_a();
VAR=input(PIN_D7);
Acceso individual de bits 1
Ejemplo:
output_low(PIN_D0);
output_high(PIN_D1);
Entrada o salida
ADCON1 = 0 0 0 0 0 1 1 0
ADCON1 = 6 ;
Delay_ms (retardo por software)
Ejemplo:
Generar un retardo de 1 segundo
void main(void)
{
// Definición de variables locales
// ciclo infinito
while ( 1 )
{
// Programa de usuario
}
}
Estructura de un programa en C
void main(void)
{
// Definición de variables locales
// ciclo infinito
for ( ; ; )
{
// Programa de usuario
}
}
Estructura de un programa en C
// Definición de variables globales
// Definición de funciones
( ciclo do - while )
void main(void)
{
// Definición de variables locales
// ciclo infinito
do
{
// Programa de usuario
} while ( 1 ) ;
}
1.- Encendido de LED
Enciende bit
Retardo de 100ms
Apaga bit
Retardo de 100 ms
Encendido de LED (Programa)
Ejercicios propuestos 1
Secuencia :
00000001
00000010
00000100
00001000
00010000
00100000
01000000
10000000
Luces secuenciales (algoritmo)
Luces
Configura puerto
como salida Envía 00000100 Envía 00100000
#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];
Arreglos (Inicializando)
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)
Luces
Limpia apuntador si
apuntador ≥ 8 Limpia
apuntador
Envía dato
no
apuntado
Ejercicio propuesto
Operador operacion
AND; compara pares de bits y regresa 1 si ambos son 1’s,
& de otra manera regresa 0.
porque...
0x1234 : 0001 0010 0011 0100
0x5678: 0101 0110 0111 1000
-----------------------------------
&: 0001 0010 0011 0000 esto es, 0x1230
/* De forma similar: */
Luces
Inicializa variable si
variable = 0 Inicializa
variable
Envía variable
no
al puerto
Operaciones aritméticas
Operador Operación
+ Suma
- Resta
* Multiplicación
/ División
Ejemplo:
// Si RB0 es uno, colocar en uno la terminal RC0:
if ( PORTB.F0 )
PORTC.F0 = 1;
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
RD salida, RA entrada secuencia_izquierda
Incrementa
Limpia contador contador
si
si Contador = 10 Limpia
RA0 = 0 contador
Envía no
no Secuencia_derecha
Secuencias condicionadas (programa)
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
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
Secuencias de activación 2
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
Secuencias de activación 3
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
Secuencias de activación 4
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
Secuencia de activación 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
Circuito de potencia 1 (motor unipolar )
Circuito de potencia 2 (motor unipolar )
Circuito de potencia 3 (motor bipolar )
Display
Limpia unidades
Incrementa decenas
Configura puertos
Inicia variables
si
Envía decena Decenas>’9’
Envía unidad
Incrementa unidad no
si Limpia decenas
Unidades>’9’
no
Display de 7 segmentos (programa)
short numero[ ] = { 0x3F, 0x06, 0x1B, 0x4F, 0x66, 0x6D, 0x5E, 0x07, 0x7F, 0x67 };
}
Display de 7 segmentos ( esquemático )
Ejercicio propuesto
Ejemplo:
unsigned short t = 24;
char *txt=“ “; //se inicializa un apuntador a 4
espacios
Ejemplo:
short t = -4;
char *txt=“ “; // Se inicializa un apuntador de 5
espacios
Ejemplo:
unsigned t = 437;
char *txt=“ “; // Inicializa un apuntador con 6 espacios
Ejemplo:
int j = -4220;
char *txt=“ “; // Inicializa un apuntador con 6 espacios
Ejemplo:
long jj = -3700000;
char *txt=“ “; // Inicializa un apuntador con 12 espacios
Ejemplo:
float ff = -374.2;
char *txt=“ “; // Inicializa un apuntador con 14 espacios
Keypad_Init
Keypad_Read
Keypad_Released
Keypad_Init
Ejemplo:
Keypad_Init(&PORTB);
Keypad_Read
Ejemplo:
kp = Keypad_Read();
Keypad_Released
Ejemplo:
Keypad_Released();
10.- Teclado matricial (problema)
Inicializa puertos
(LCD y teclado)
Lee teclado
Convierte a ASCII
Envía a LCD
Teclado matricial (esquemático)
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);
Ejercicio propuesto 9