Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Cursodelenguajecparamicrocontroladorespic Dia1222222 111013092647 Phpapp02
Cursodelenguajecparamicrocontroladorespic Dia1222222 111013092647 Phpapp02
en lenguaje C para
microcontroladores PIC
PIC16F877
Características
• Velocidad de operación: hasta 20 MHz de
reloj
• 8K x 14 bits por palabra de memoria de
programa FLASH
• 368 x 8 bytes de memoria de datos (RAM)
• 256 x 8 bytes de memoria de datos
EEPROM
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.
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 )
Características (periféricos)
• Timer 0: timer/counter de 8 bits con un pre-
escalador de 8 valores.
• Timer 1: 16-bit timer/counter con pre-escalador
• Timer 2: 8-bit timer/counter con registro de
estado de 8-bit, pre-escalador y post-escalador
• Dos módulos de Capture, Compare, PWM
– Capture es de 16-bit, max. resolución es 12.5 ns
– Compare es de 16-bit, max. resolución es 200 ns
– PWM max. resolución de 10-bit
Características (periféricos 2)
• Convertidor analógico a digital de 10-bit
multi-canal
• Puerto serial síncrono (SSP) con SPI. (modo
maestro) e I2C (maestro/esclavo)
• Transmisor-Receptor síncrono-asíncrono
universal (USART/SCI) con 9-bit
• Puerto paralelo esclavo (PSP) con 8-bits de
ancho, con terminales de control RD, WR y
CS
Arquitectura interna
• Arquitectura HARVARD.
• Buses separados (datos e instrucciones).
• Memoria de programa : 14 bits.
• Memoria de datos: 8 bits.
• Recursos mapeados en memoria de
datos.
Arquitectura interna
Terminales fisicas
PUERTOS
Puerto # funciones Funciones
PORTA 3 Entradas digital
Salidas digital
Entradas analógicas
PORTB 2 Entradas digital
Salidas digital
• 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
• SALIDA DE DATOS : 0
• ENTRADA DE DATOS: 1
• La asignación es individual
correspondiente a cada terminal del
puerto.
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;
ADCON1 = 6 ;
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.
• Ejemplo:
Generar un retardo de 1 segundo
// Definición de funciones
void main(void)
{
// Definición de variables locales
// ciclo infinito
while ( 1 )
{
// Programa de usuario
}
}
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
// ciclo infinito
for ( ; ; )
{
// Programa de usuario
}
}
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
// ciclo infinito
do
{
// Programa de usuario
} while ( 1 ) ;
}
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 1000 milisegundo y el de apagado de
300 milisegundos.
Encendido de LED (algoritmo)
1. Configurar el bit 7 del puerto D como salida de
datos
2. Encendido del led
3. Retardo por software de 1000 milisegundos.
4. Apagado del led
5. Retardo por software de 300 milisegundos
6. Repetir el paso 2
Encendido de LED (diagrama de flujo)
Led
Retardo de 1000ms
Encendido de LED (esquemático)
Encendido de LED (programa)
void main ( void )
{
TRISD.F7 = 0;
while( 1 )
{
PORTD.F7 = 1;
Delay_ms( 1000 );
PORTD.F7 = 0;
Delay_ms( 300 );
}
}
Encendido de LED (programa 2)
void main ( void )
{
TRISD = 0;
while( 1 )
{
PORTD = 0x80;
Delay_ms( 1000 );
PORTD = 0;
Delay_ms( 300 );
}
}
Ejercicios propuestos 1
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.
Secuencia :
– 00000001
– 00000010
– 00000100
– 00001000
– 00010000
– 00100000
– 01000000
– 10000000
Luces secuenciales (algoritmo)
1. Configuración de puerto como salida de datos.
2. Envío de primer dato al puerto de salida
3. Envío de segundo dato al puerto de salida
4. 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
Configura puerto
como salida Envía 00000100 Envía 00100000
Limpia apuntador si
apuntador ≥ 8 Limpia
apuntador
Envía dato
no
apuntado
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
}
}
Ejercicios propuestos 3
1. El alumno enviara 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
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
Luces con desplazamiento (programa 1)
void main ( void )
{ unsigned short dato;
TRISD = 0;
dato = 0b00000001;
while ( 1 )
{
PORTD = dato;
Delay_ms ( 300 );
dato = dato << 1;
if ( dato == 0 )
dato = 0x01;
}
}
Operaciones aritméticas
Operador Operación
+ Suma
- Resta
* Multiplicación
/ División
TRISD = 0;
dato = 1;
while ( 1 )
{
PORTD = dato;
Delay_ms (250);
dato = dato * 2;
if ( dato == 0 )
dato = 0x01;
}
}
Ejercicios propuestos 4
1. 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.
• Ejemplo:
// Si RB0 es uno, colocar en uno la terminal RC0:
if ( PORTB.F0 )
PORTC.F0 = 1;
Incrementa
Limpia contador contador
si
si Contador = 10 Limpia
RA0 = 0 contador
Envía no
no Secuencia_derecha
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;
}
}
Ejercicios propuestos 5
1. 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.
Ejercicios propuestos 5 (esquemático)
MOTOR A PASOS 1
• Unipolar.- Tiene 4 bobinas independientes (A, B, C,
D) y una terminal común a todas ellas.
MOTOR A PASOS 2
• Unipolar.- Tiene 4 bobinas independientes (A, B,
C, D) y dos terminales comunes.
MOTOR A PASOS 2
• Bipolar.- Tiene 2 bobinas (A – C, B – D)
Secuencias de activación 1
• 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
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 )
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 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.
Ejercicio propuesto 6 (esquemático)
Display de cristal liquido
LCD (funciones bus 8 bits)
• Lcd8_Config
• Lcd8_Init
• Lcd8_Out
• Lcd8_Out_Cp
• Lcd8_Chr
• Lcd8_Chr_Cp
• Lcd8_Cmd
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.
• Ejemplo:
-Imprime “Hello!” en el LCD en la linea 1, columna 3
Lcd8_Out(1, 3, "Hello!");
Lcd8_Out_Cp
• Descripción: Imprime mensaje en el LCD
en la posición actual del cursor.
Inicializa puertos de
datos y control
Envía mensaje
Envía comando de
Corrimiento a la izq.
LCD 8 BITS (esquemático)
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);
while(1)
{
Lcd8_Cmd(LCD_SHIFT_LEFT);
Delay_ms(100);
}
}
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);
}
}
LCD 8 BITS (esquemático)
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);
}
}
Ejercicios propuestos 7
1. 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.
Ejercicio propuesto 8
H H O HO L
.
H H O
.
.
H H O H O LA
LCD (funciones bus 4 bits)
• Lcd_Config
• Lcd_Init
• Lcd_Out
• Lcd_Out_Cp
• Lcd_Chr
• Lcd_Chr_Cp
• Lcd_Cmd
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.
• Ejemplo:
-Imprime “Hello!” en el LCD en la línea 1, columna 3
Lcd_Out(1, 3, "Hello!");
Lcd_Out_Cp
• Descripción: Imprime mensaje en el LCD en la
posición actual del cursor.
• Ejemplo:
- Imprime “Here!” en la posición actual del cursor
Lcd_Out_Cp("Here!");
Lcd_Chr
• Descripción: Imprime un caracter en el LCD en
la fila y columna especificada (row y col).
Ejemplo:
- Imprime la letra ‘i’ en el LCD en la línea 2,y columna 3
Lcd_Out(2, 3, 'i');
Lcd_Chr_Cp
• Descripción: Imprime un caracter en el LCD en
la posición actual del cursor.
• Ejemplo:
- Imprime la letra ‘e’ en la posición actual del cursor
Lcd_Chr_Cp('e');
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).
• Ejemplo:
- Apaga el cursor, no aparece en el LCD
Lcd_Cmd(LCD_CURSOR_OFF);
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.
LCD 4 BITS (algoritmo)
1. Inicialice los puertos de datos y control.
2. Envía mensaje a desplegar.
3. Envía comando de desplazamiento hacia
la derecha.
4. Repite el paso 3.
LCD 4 BITS (diagrama de flujo)
LCD 8 bits
Inicializa puertos de
datos y control
Envía mensaje
Envía comando de
Corrimiento a la der.
LCD 4 BITS (esquemático Config)
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);
}
}
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);
}
}
LCD 4 BITS (esquemático Init)
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);
}
}
Conversión de tipo de datos
Tipo de dato a cadena
• ByteToStr
• ShortToStr
• WordToStr
• IntToStr
• LongToStr
• FloatToStr
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.
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
Inicializa puertos
(LCD)
Convierte contador
a ASCII
Inicializa contador
Envía a LCD
ASCII
Incrementa
contador
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);
}
}
Contador 0-9 (esquemático)
Contador 0-9 (funcionamiento)
Contador 0-9 : Contador 0-9 : Contador 0-9 :
0 1 2
Contador 0-9 :
6
. . . Contador 0-9 :
9
Ejercicio propuesto 8
1. 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 – 16384 -
32768. 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.
Ejercicio propuesto 8
Serie de numeros
8 16 32
. . . Serie de numeros
8192 16384 32768
Ejercicio propuesto 9
1. 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.
Ejercicio propuesto 9
Contador 00-99 cada 500 mseg Contador 00-99 cada 500 mseg Contador 00-99 cada 500 mseg
00 01 02
Contador 00-99 cada 500 mseg Contador 00-99 cada 500 mseg Contador 00-99 cada 500 mseg
03 04 05
• Keypad_Init
• Keypad_Read
• Keypad_Released
Keypad_Init
• 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
• Ejemplo:
kp = Keypad_Read();
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.
• Ejemplo:
Keypad_Released();
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).
Teclado matricial (algoritmo)
1. Configuración de puertos (teclado y lcd).
2. Lectura de teclado
3. Conversión a ASCII
4. Envío al LCD
5. Regresar a 2
Teclado matricial (diagramas de flujo)
teclado
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
1. 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.
Ejercicio propuesto 9
Cual es el numero de 3 cifras: Cual es el numero de 3 cifras:
025