TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: ferfrepic en 23 de Mayo de 2012, 11:04:32
-
HOLA! soy nuevo en el foro y estoy iniciando la programación de microcontroladores PIC. Me gustaría que alguien pudiera guiarme para poder hacer un TEMPORIZADOR DESCENDENTE DE 20 MINUTOS para activar un relé, y visualizar en display la cuenta regresiva. ¿Qué microcontrolador PIC puedo usar? tenía pensado el pic16f84a pero no estoy seguro porque quiero hacer una rutina de minutos y segundos con restas de 60 y con 8 bits puedo contar hasta 255 osea 4 minutos y monedas.verdad? Espero puedan ayudarme, desde ya muchas gracias.
-
Hola Ferfrepic, antes de determinar el micro, deberías detallar bien las especificaciones de tu proyecto, para ver qué necesitas.
¿Qué tipo de display vas a usar?, ¿con cuántos voltios se alimenta el display, 5V o 3.3V, u otra?, ¿alguna otra tarea?
También deberías tener claro en qué lenguaje de programación te sientes cómodo.
Una vez aclaradas esas dudas, podrás seleccionar mejor el micro, aunque dudo mucho que un 16F84 sea el más adecuado.
-
Nocturno gracias por responder! Los display a utilizar son cátodo común 5v, y el lenguaje sería ensamblador que es el que estoy viendo ahora. No tiene tareas extras solamente setear el temporizador con un pulsador y que incremente cada 30 segundos y con otro pulsador cada 10 minutos. La salida activa un relé es todo.
-
Pues empieza por determinar cuántos pines del micro vas a necesitar para gestionar todo eso.
-
Pues serán tres pines de entrada supongo, uno para activar temporizador 30segundos otro para 10 minutos y uno de stop/reset. Para la salida uno al relé y para manejar los cuatro display no estoy seguro.
-
Dibuja el esquema y te irá saliendo. Deja el micro para el final.
-
Ok gracias, mi idea es que me vayan guiando porque recién empiezo con pic, no que me resuelvan el problema ja, a medida que avance voy a volver por acá, gracias de nuevo.
-
Claro, esa es la actitud con la que debes afrontar el problema. Será un placer poder ayudarte a medida que vayas avanzando.
-
Tengo el mismo problema. Stoy haciendo un marcador automático controlado por Android pero no consigo programar para que me haga el tiempo bien. Lo toy haciendo con un "for" pero se me atasca el programa es ese bucle . Yo kiero k haga eso y cuando le llegue otra instruccion que no pare o k pare pero cuando yo le mande parar. Nose si me explicao bien pero me vendria bien un poco de ayuda con la programación.
-
Bienvenido al foro!, tienes que colocar tu programa para que te podamos dar una ayuda :mrgreen:
Saludos!
Norberto
-
te ayudaria pero yo solo se asembler :/ y hago multitarea
pero en C u otro lenguaje si no se mucho , pero si en algo puedo ayudar cuenta conmigo
-
#include "C:\Users\Sergio\Desktop\Proyecto Marcador\Programacion entera\programamarcador.h"
#use I2C(MASTER,SDA=PIN_C4,SCL=PIN_C3)
int disp[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90};
long int t_uni,t_dec,t_cen,t_mil,tiempo=1000,a_uni,a_dec,a_cen,b_uni,b_dec,b_cen,tantoa,tantob;
int faltasa=0,faltasb=0,periodo=0;
char lectura;
void visualizardisplays() //Viualiza en el marcador la informacion
{
t_mil = tiempo/1000; //Ecuaciones para el temporizador
t_cen = (tiempo%1000)/100;
t_dec = ((tiempo%1000)%100)/10;
t_uni = ((tiempo%1000)%100)%10;
a_dec=tantoa/100; //Ecuaciones para los tantos equipo A
a_cen=(tantoa%100)/10;
a_uni=((tantoa%100)%10);
b_dec = tantob/100; //Ecuaciones para los tantos equipo B
b_cen = (tantob%100)/10;
b_uni = ((tantob%100)%10);
i2c_start();
i2c_write(0b01110000); // Dirección (Escritura. SAA nº1
i2c_write(0b00000000); // Direcciono registro de control
i2c_write(0b01000111); // Palabra de Control: Luminosidad +12mA,
i2c_write(disp[t_uni]);
i2c_write(disp[T_dec]);
i2c_write(disp[t_cen]);
i2c_write(disp[t_mil]);
i2c_stop();
i2c_start();
i2c_write(0b01110110); // Dirección (Escritura. SAA nº2
i2c_write(0b00000000); // Direcciono registro de control
i2c_write(0b01000111); // Palabra de Control: Luminosidad +12mA,
i2c_write(disp[periodo]);
i2c_write(disp[a_uni]);
i2c_write(disp[a_cen]);
i2c_write(disp[a_dec]);
i2c_stop();
i2c_start();
i2c_write(0b01110100); // Dirección (Escritura). SAA nº3
i2c_write(0b00000000); // Direcciono registro de control
i2c_write(0b01000111); // Palabra de Control: Luminosidad +12mA,
i2c_write(disp[0]);
i2c_write(disp[b_uni]);
i2c_write(disp[b_cen]);
i2c_write(disp[b_dec]);
i2c_stop();
}
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
visualizardisplays();
while(TRUE)
{
lectura = input(PIN_C7);
if(lectura=='a') //Comienza el tiempo
{
set_timer1(0); // es aqui donde tengo que poner el temporizador pero no sé como hacerlo
}
if(lectura=='b') //Para el tiempo
{
enable_interrupts(int_timer0);
}
if(lectura=='c') //Resetea el tiempo
{
}
if(lectura=='m') //Suma tanto equipo A
{
tantoa++;
}
if(lectura=='n') //Resta tanto equipo A
{
tantoa--;
}
if(lectura=='k') //Suma tanto equipo B
{
tantob++;
}
if(lectura=='l') //Resta tanto equipo B
{
tantob--;
}
if(lectura=='p') //Suma periodo
{
periodo++;
}
if(lectura=='r') //Suma falta equipo A
{
faltasa++;
}
if(lectura=='g') //Suma falta equipo B
{
faltasb++;
}
if(lectura=='h') //Reset Faltas
{
faltasa=0;
faltasb=0;
}
if(periodo>4) //Se poone el periodo a 0 cuando supera 4
{
periodo=0;
}
if(faltasa>5) //Se pone las faltas a 0 cuando superan 5
{
faltasa=0;
}
if(faltasb>5)
{
faltasb=0;
}
delay_ms(50);
// manda las faltas que tiene el equipo A:
switch(faltasa)
{
case 0:
output_bit(PIN_B0,0);
output_bit(PIN_B1,0);
output_bit(PIN_B2,0);
output_bit(PIN_B3,0);
output_bit(PIN_B4,0);
break;
case 1:
output_bit(PIN_B0,1);
output_bit(PIN_B1,0);
output_bit(PIN_B2,0);
output_bit(PIN_B3,0);
output_bit(PIN_B4,0);
break;
case 2:
output_bit(PIN_B0,1);
output_bit(PIN_B1,1);
output_bit(PIN_B2,0);
output_bit(PIN_B3,0);
output_bit(PIN_B4,0);
break;
case 3:
output_bit(PIN_B0,1);
output_bit(PIN_B1,1);
output_bit(PIN_B2,1);
output_bit(PIN_B3,0);
output_bit(PIN_B4,0);
break;
case 4:
output_bit(PIN_B0,1);
output_bit(PIN_B1,1);
output_bit(PIN_B2,1);
output_bit(PIN_B3,1);
output_bit(PIN_B4,0);
break;
case 5:
output_bit(PIN_B0,1);
output_bit(PIN_B1,1);
output_bit(PIN_B2,1);
output_bit(PIN_B3,1);
output_bit(PIN_B4,1);
break;
}
// manda las faltas que tiene el equipo B:
switch(faltasb)
{
case 0:
output_bit(PIN_B5,0);
output_bit(PIN_B6,0);
output_bit(PIN_B7,0);
output_bit(PIN_C0,0);
output_bit(PIN_C1,0);
break;
case 1:
output_bit(PIN_B5,1);
output_bit(PIN_B6,0);
output_bit(PIN_B7,0);
output_bit(PIN_C0,0);
output_bit(PIN_C1,0);
break;
case 2:
output_bit(PIN_B5,1);
output_bit(PIN_B6,1);
output_bit(PIN_B7,0);
output_bit(PIN_C0,0);
output_bit(PIN_C1,0);
break;
case 3:
output_bit(PIN_B5,1);
output_bit(PIN_B6,1);
output_bit(PIN_B7,1);
output_bit(PIN_C0,0);
output_bit(PIN_C1,0);
break;
case 4:
output_bit(PIN_B5,1);
output_bit(PIN_B6,1);
output_bit(PIN_B7,1);
output_bit(PIN_C0,1);
output_bit(PIN_C1,0);
break;
case 5:
output_bit(PIN_B5,1);
output_bit(PIN_B6,1);
output_bit(PIN_B7,1);
output_bit(PIN_C0,1);
output_bit(PIN_C1,1);
break;
}
visualizardisplays();
}
}