domingo, enero 03, 2010

Propeller Clock





para la realizacion de este reloj se utilizo un motor de grabadora el cual se polariza con 9[v], un Pic 16F84A, una bateria de 3,6 [v], un sensor infrarojo y un emisor infrarojo que se utiliza para producir una entrada alta en el Pin_A2, el circuito es el comun utilizado para el Pic 16F84A.






el codigo del programa utilizando ccs, es el siguiente:


#include <16f84a.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //para cristal de 4MHz
#FUSES PUT //power up timer habilitado
#fuses XT,NOWDT,NOPROTECT,NOPUT // Configuracion
//lectura habilitada del codigo del pic
#use delay(clock=4000000)
#int_rtcc // Rutina que atiende interrupcion

#use fast_io(A)
#use fast_io(B)

int ss=0;
int i=1;
int s=0;
int m=0;
int mm=0;
int h=11;

char contador;
#int_rtcc // Rutina que atiende interrupcion

void interrupt(void)
{
contador++; // Incrementa la variable que cuenta las
set_rtcc(0x06); // interrupciones y recarga el timer
if(contador==250)
{
contador=0;
s++;
}

}


void cero (void){

OUTPUT_HIGH(PIN_A3);
OUTPUT_HIGH(PIN_B0);
OUTPUT_HIGH(PIN_B1);
OUTPUT_HIGH(PIN_B2);
OUTPUT_HIGH(PIN_B3);
delay_us(100);
OUTPUT_LOW(PIN_B0);
OUTPUT_LOW(PIN_B3);
OUTPUT_LOW(PIN_B1);
delay_us(1800);
OUTPUT_HIGH(PIN_A3);
OUTPUT_HIGH(PIN_B0);
OUTPUT_HIGH(PIN_B3);
OUTPUT_HIGH(PIN_B1);
OUTPUT_HIGH(PIN_B2);
delay_us(100);
OUTPUT_LOW(PIN_A3);
OUTPUT_LOW(PIN_B0);
OUTPUT_LOW(PIN_B1);
OUTPUT_LOW(PIN_B3);
OUTPUT_LOW(PIN_B2);
}

void uno (void) {; //uno

OUTPUT_HIGH(PIN_B2);
OUTPUT_HIGH(PIN_B0);
delay_us(100);
OUTPUT_LOW(PIN_B0);
delay_us(900);
OUTPUT_HIGH(PIN_B0); // este está 2 veces....
OUTPUT_HIGH(PIN_A3);
OUTPUT_HIGH(PIN_B1);

OUTPUT_HIGH(PIN_B3);
delay_us(100);
OUTPUT_LOW(PIN_A3);
OUTPUT_LOW(PIN_B0);
OUTPUT_LOW(PIN_B1);
OUTPUT_LOW(PIN_B3);
delay_ms(1);
OUTPUT_LOW(PIN_B2);
}

void dos (void){
OUTPUT_HIGH(PIN_A3);
OUTPUT_HIGH(PIN_B2);
OUTPUT_HIGH(PIN_B1);
OUTPUT_HIGH(PIN_B3);
delay_us(100);
OUTPUT_LOW(PIN_B3);
delay_us(1800);
OUTPUT_HIGH(PIN_B0); // este está 2 veces....
delay_us(100);


OUTPUT_LOW(PIN_A3);
OUTPUT_LOW(PIN_B0);
OUTPUT_LOW(PIN_B1);
OUTPUT_LOW(PIN_B3);
OUTPUT_LOW(PIN_B2);
}

void tres (void){OUTPUT_HIGH(PIN_A3);
OUTPUT_HIGH(PIN_B2);
OUTPUT_HIGH(PIN_B1);
delay_us(100);

delay_us(1800);
OUTPUT_HIGH(PIN_B0);
OUTPUT_HIGH(PIN_B3);
delay_us(100);


OUTPUT_LOW(PIN_A3);
OUTPUT_LOW(PIN_B0);
OUTPUT_LOW(PIN_B1);
OUTPUT_LOW(PIN_B3);
OUTPUT_LOW(PIN_B2);
}

void cuatro (void){
OUTPUT_HIGH(PIN_A3);
OUTPUT_HIGH(PIN_B0);
OUTPUT_HIGH(PIN_B1);
delay_us(100);
OUTPUT_LOW(PIN_A3);
OUTPUT_LOW(PIN_B0);
delay_us(1800);
OUTPUT_HIGH(PIN_B0);
OUTPUT_HIGH(PIN_B3);
OUTPUT_HIGH(PIN_A3);
OUTPUT_HIGH(PIN_B2);
delay_us(100);
OUTPUT_LOW(PIN_A3);
OUTPUT_LOW(PIN_B0);
OUTPUT_LOW(PIN_B1);
OUTPUT_LOW(PIN_B3);
OUTPUT_LOW(PIN_B2);}

void cinco(void){OUTPUT_HIGH(PIN_A3);
OUTPUT_HIGH(PIN_B2);
OUTPUT_HIGH(PIN_B1);
OUTPUT_HIGH(PIN_B0);
delay_us(100);
OUTPUT_LOW(PIN_B0);
delay_us(1800);
OUTPUT_HIGH(PIN_B3); // este está 2 veces....
delay_us(100);


OUTPUT_LOW(PIN_A3);
OUTPUT_LOW(PIN_B0);
OUTPUT_LOW(PIN_B1);
OUTPUT_LOW(PIN_B3);
OUTPUT_LOW(PIN_B2);
}

void seis (void){
OUTPUT_HIGH(PIN_A3);
OUTPUT_HIGH(PIN_B2);
OUTPUT_HIGH(PIN_B1);
OUTPUT_HIGH(PIN_B0);
OUTPUT_HIGH(PIN_B3);
delay_us(100);
OUTPUT_LOW(PIN_B0);
OUTPUT_LOW(PIN_B3);
delay_us(1800);
OUTPUT_HIGH(PIN_B3); // este está 2 veces....
delay_us(100);
OUTPUT_LOW(PIN_A3);
OUTPUT_LOW(PIN_B0);
OUTPUT_LOW(PIN_B1);
OUTPUT_LOW(PIN_B3);
OUTPUT_LOW(PIN_B2);}


void siete (void){
OUTPUT_HIGH(PIN_A3);
OUTPUT_HIGH(PIN_B0);
delay_us(100);
OUTPUT_LOW(PIN_B0);
delay_us(1800);
OUTPUT_HIGH(PIN_A3);
OUTPUT_HIGH(PIN_B0);
OUTPUT_HIGH(PIN_B3);
OUTPUT_HIGH(PIN_B1);
OUTPUT_HIGH(PIN_B2);
delay_us(100);
OUTPUT_LOW(PIN_A3);
OUTPUT_LOW(PIN_B0);
OUTPUT_LOW(PIN_B1);
OUTPUT_LOW(PIN_B3);
OUTPUT_LOW(PIN_B2);}

void ocho (void){
OUTPUT_HIGH(PIN_A3);
OUTPUT_HIGH(PIN_B0);
OUTPUT_HIGH(PIN_B1);
OUTPUT_HIGH(PIN_B2);
OUTPUT_HIGH(PIN_B3);
delay_us(100);
OUTPUT_LOW(PIN_B0);
OUTPUT_LOW(PIN_B3);
delay_us(1800);
OUTPUT_HIGH(PIN_A3);
OUTPUT_HIGH(PIN_B0);
OUTPUT_HIGH(PIN_B3);
OUTPUT_HIGH(PIN_B1);
OUTPUT_HIGH(PIN_B2);
delay_us(100);
OUTPUT_LOW(PIN_A3);
OUTPUT_LOW(PIN_B0);
OUTPUT_LOW(PIN_B1);
OUTPUT_LOW(PIN_B3);
OUTPUT_LOW(PIN_B2);}

void nueve (void){
OUTPUT_HIGH(PIN_A3);
OUTPUT_HIGH(PIN_B0);
OUTPUT_HIGH(PIN_B1);
OUTPUT_HIGH(PIN_B2);
delay_us(100);
OUTPUT_LOW(PIN_B0);
delay_us(1800);
OUTPUT_HIGH(PIN_A3);
OUTPUT_HIGH(PIN_B0);
OUTPUT_HIGH(PIN_B3);
OUTPUT_HIGH(PIN_B1);
OUTPUT_HIGH(PIN_B2);
delay_us(100);
OUTPUT_LOW(PIN_A3);
OUTPUT_LOW(PIN_B0);
OUTPUT_LOW(PIN_B1);
OUTPUT_LOW(PIN_B3);
OUTPUT_LOW(PIN_B2);}

void dospuntos (void){

delay_ms(3);

OUTPUT_HIGH(PIN_B3);
OUTPUT_HIGH(PIN_B0);
delay_us(100);
OUTPUT_LOW(PIN_B3);
OUTPUT_LOW(PIN_B0);
delay_ms(3);
}

void segundos (void){
if (ss==0) cero();
if (ss==1) uno();
if (ss==2) dos();
if (ss==3) tres();
if(ss==4) cuatro();
if (ss==5) cinco();
delay_ms(2);
if (s==0) cero();
if (s==1) uno();
if (s==2) dos();
if (s==3) tres();
if(s==4) cuatro();
if (s==5) cinco();
if (s==6) seis();
if (s==7) siete();
if (s==8) ocho();
if (s==9) nueve();}


void minutos(void){
if (mm==0) cero();
if (mm==1) uno();
if (mm==2) dos();
if (mm==3) tres();
if(mm==4) cuatro();
if (mm==5) cinco();
delay_ms(2);
if (m==0) cero();
if (m==1) uno();
if (m==2) dos();
if (m==3) tres();
if(m==4) cuatro();
if (m==5) cinco();
if (m==6) seis();
if (m==7) siete();
if (m==8) ocho();
if (m==9) nueve();}

void horas (void){
if (h==0) cero();
if (h==1) uno();
if (h==2) dos();
if (h==3) tres();
if(h==4) cuatro();
if (h==5) cinco();
if (h==6) seis();
if (h==7) siete();
if (h==8) ocho();
if (h==9) nueve();
if (h==10){uno();delay_ms(2);cero();}
if (h==11){uno();delay_ms(2);uno();}
if (h==12){uno();delay_ms(2);dos();}}


void main()

{
setup_counters (RTCC_INTERNAL, RTCC_DIV_16); // Programacion timer0
set_timer0(0x06); // Carga el valor del timer0
enable_interrupts(INT_RTCC); // Habilita interrupcion timer0.
enable_interrupts(GLOBAL); // Habilita todas las interrupciones.


SET_TRIS_a(0x02);
//todo el puerto A como salida
OUTPUT_a(0x00);
//limpiamos los pines del puerto A
set_tris_b(0x00);
output_b(0x00);




do
{


output_high(PIN_A2);


IF (INPUT(PIN_A1)==1)
{
horas();
dospuntos();
minutos();
dospuntos();
segundos();



}
if (s>9) {ss++;i++;s=0;}
if (ss>5){m++;i=0;ss=0;}
if (m>9) {mm++;m=0;}
if (mm>5){h++;mm=0;}

}
while(1);
}






cabe mencionar que todavia no se crea aqui un sistema para la puesta a la hora, y la posicion de los numeros simplemente se modifica variando la posicion del sensor.

12 comentarios:

Sebastian dijo...

Hola me interesa armar este proyecto.... podrias darme mas datos??? como lo podemos mejorar..

alguna imagen???


de todos los sitios en los que busque es el unico en donde me da animo a armarme el mio... ;)

severino el herbolario dijo...

holaa si, la verdad es que hay muchas formas de mejorarlo, una de ellas es ocupando leds RGB, para ello si habria que utilizar con micro mas grande con mayor numero de pines.

para armarlo te recomiendo que veas el programa en C como estan programados cada numero y tengas una idea ya que esto puede variar segun la velocidad de cada motor, el reloj se logra programando una interrupcion con el timer A del pic. Se ocupa un led infrarrojo para detectar cuando la helice pasa por una posicion predefinida y desplegar la secuencia.

Sebastian dijo...

Me podrias como puedo hacer para poner el reloj en hora.. como puedo variar la posicion de las letras sin tener que cambiar la posicion del sensor?? ... algo mas terminado no hay... es que me encanta.. y quiero armarlo desde 0.. esto es un gran comienzo...


muchas gracias

Sebastian dijo...

Ya entendi .. como se puede variar la posicion del reloj.. ( la hora ) variando la posicion del reloj con un pwm se podria lograr...


estoy tratando de simular.. tu circuito y en realidad lo he leido varias veces..

seria bueno que me digas o me detalles con cuales pines formas los numeros.. y explicar el porque de los microsegundos.. por ejemplo el numero 1 tiene por ahi un delay_us(900).. mientras que otros numeros solamente tiene delay_us(100)

seria mucho pedirte que me detalles bien el codigo???? porque.. ahi hasta donde interprete usas una pin.. para el emisor infrarrojo tambien...


bueno disculpa... saludos..

dejo mi correo.. por si las dudas...

calopsia@hotmail.com

Arte em Foto dijo...

Oi, show de bola teu projeto!
como faz para ajustar o relogio?
Tu tens o código para isso?
Obrigado.
paulor.gomes@pop.com.br

Anónimo dijo...

gracias por el aporte mas aun me agradria saber cual es el fin de sensro infrarojo tambien sobre el plano del circuito
graciass
atte viruxxxzz

Anónimo dijo...

oye me podrías decir como le hiciste para alimentar tu circuito y el motor al mismo tiempo que diagrama usaste, no entiendo como lo hacen en la pagina de bob blick y quisiera saber colo hiciste tu este es mi correo(fco_scor@hotmail.com)te lo agradecería mucho es para el proyecto final de la universidad

Anónimo dijo...

amigo nesesito ayude yo tengo uno de examen pero es sencillo solo saca una led x cada salida del puerto b pero nesesito el codigo y no ce como hacerlo

Eduardo aldana dijo...

amigo nesesito ayuda yo tengo uno pero es mi examen de tayer pero es sencillo solo saca una led x cada salida del puerto b pero nesesito el codigo y no ce como hacerlo mi pic es un 16f84a

Eduardo aldana dijo...

amigo nesesito ayuda yo tengo uno pero es mi examen de tayer pero es sencillo solo saca una led x cada salida del puerto b pero nesesito el codigo y no ce como hacerlo mi pic es un 16f84a

Juliana Rodriguez dijo...

Hola muy interesante esta cuestion del Propeller clock, ¿podrias por favor explicarme como haces para armar un numero cualquiera?, por ejemplo el numero 5, ¿porque se encienden y se apagan los leds en esa secuencia?. te agradezco una respuesta, mi correo es e.lizarazo29@hotmail.com(Y)

Anónimo dijo...

hola me interesa tu proyecto y quiero pedirte mas informacion sobre el propeller que construiste, ya sea todos los materias que usaste, tipos de integrados, etc. te dejo mi email andrees_siles@hotmail.com

Google