TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: daniermac en 26 de Julio de 2017, 22:40:08
-
consulta, tengo que realizar un TP con las siguientes características:
- realizar botón que funcione como un contador ascendente para la unidad y la decena,
- con un botón de selección entre la unidad y la decena, un botón de play y pausa, de modo decreciente, que al llegar a 0, suene el buzzer por 500ms y accione un relé, el cual
- enciende un led, luego de los 500ms se apague.
- Tienes que ingresar para ver archivos adjuntos -
acá el código
#include <18f2550.h>
#use Delay (clock=4M)
#fuses XT
#fuses cpudiv1
#byte TRISA = 0xf92
#byte TRISB = 0xf93
#byte TRISC = 0xf94
#byte PORTA = 0xf80
#byte PORTB = 0xf81
#byte PORTC = 0xf82
#bit Ps_Incremento = 0xf80.0
#bit Ps_Inicio = 0xf80.1
#bit Ps_Seleccion = 0xf80.2
#bit TR_Display_1 = 0xf82.0
#bit TR_Display_2 = 0xf82.1
#bit TR_Display_3 = 0xf82.2
#bit TR_Display_4 = 0xf82.4
#bit TR_Rele_5 = 0xf82.5
#bit TR_Buzzer_6 = 0xf82.6
BYTE CONST Display_Tabla[10] =
{
0b11000000, //0
0b11111001, //1
0b10100100, //2
0b10110000, //3
0b10011001, //4
0b10010010, //5
0b10000010, //6
0b11111000, //7
0b10000000, //8
0b10011000}; //9 tabla dada vuelta
signed int Unidad = 0, Decena = 0;
int flag = 0; // bandera de Inicio-Pausa
void Escribir_displays()
{
int t = 100;// tiempo exagerado
IF (Decena != 0)
{
PORTB = Display_Tabla[Unidad];
TR_Display_1 = 0;
Delay_ms (t);
TR_Display_1 = 1;
PORTB = Display_Tabla[Decena];
TR_Display_2 = 0;
Delay_ms (t);
TR_Display_2 = 1;
}
ELSE
{
PORTB = Display_Tabla[Unidad];
TR_Display_1 = 0;
Delay_ms (t);
TR_Display_1 = 1;
}
}
void Play()
{
{
WHILE (Ps_Inicio == 0); // Esperamos a que se suelte el pulsador
{
delay_ms (50); // Generamos un retardo de 50mSeg para evitar el rebote
}
flag = !flag;
while (flag == 1)
{
delay_ms (250);
Escribir_displays ();
TR_Rele_5 = 1;// el relé se cierra
unidad = Unidad -1;
if (Unidad < 0)
{
Decena = Decena - 1;
Unidad = 9;
}
if (Ps_Inicio == 0)
{
delay_ms (50);
flag = !flag;
TR_Rele_5 = 0; // relay se abre
}
if (Decena == 0 && Unidad == 0)
{
flag = !flag;
TR_Rele_5 = 0; // relay abierto
TR_Buzzer_6 = 1;
delay_ms (500);
TR_Buzzer_6 = 0;
}
}
}
}
void main()
{
TRISA = 255;
TRISB = 0;
TRISC = 0;
PORTB = 255;
PORTC = 0b00010111;
WHILE (true)
{
IF (Ps_Incremento == 0)
{
Unidad = Unidad + 1;
IF (Unidad == 10)
{
Unidad = 0;
}
WHILE (Ps_Incremento == 0); // Esperamos a que suelte el pulsador
{
delay_ms (50); // Generamos un retardo de 50mSeg para evitar el rebote
}
TR_Buzzer_6 = 1;
delay_ms (300);
TR_Buzzer_6 = 0;
}
if (Ps_Seleccion == 0)
{
Decena = Unidad;
Unidad = 0;
WHILE (Ps_Seleccion == 0); // Esperamos a que suelte el pulsador
{
delay_ms (50); // Generamos un retardo de 50mSeg para evitar el rebote
}
TR_Buzzer_6 = 1;
delay_ms (20); // Doble bip
TR_Buzzer_6 = 0;
delay_ms (10);
TR_Buzzer_6 = 1;
delay_ms (20);
TR_Buzzer_6 = 0;
}
Escribir_displays ();
IF (Ps_Inicio == 0 && ( Decena != 0 || Unidad != 0))
{
Play();
}
}
}
el tema es que no me muestran los displays, creo que el error debe estar el los BC337 que no están alimentados, si alguno me puede dar una mano, les agradecería, saludos
Daniel
-
creo que el código de los displays están para ánodo y no para cátodo, y me parece que eso también hace que dé error, y más de ahí no tengo idea, saludos
-
Si los colectores de los transistores van al terminal que enciende los puntos de los displays entonces estos deben de ser de anodo comun.
Lo mismo sucede si ese pin es el de alimentacion.
-
Debe ser entonces ese el error, lo único es q no me deja subir el archivo en dsn de proteus 7