Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

05/11/2010 #1

Avatar de vootha33

Reloj Binario con Microcontrolador PIC 16f877a
Hola, estoy haciendo un reloj binario con un microcontrolador PIC. El reloj expresará la hora en código binario a continuacion inserto el diagrama en ISIS


y el código que se me viene a la mente es este:

Código:
#include <16F877A.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected

#use delay(clock=20000000)

void main()
{

int horas, minutos, segundero;


set_tris_b(0);  // Solo para limpiar las salidas
set_tris_c(0);
output_b(0x00);
output_c(0x00);

while(true){

   for(horas=1;horas<=12;horas++) {  // empieza el ciclo para contar las horas transcurridas
   
     for(minutos=0;minutos<60;minutos++){ // empieza el ciclo para los minutos
     output_c(minutos);  
     delay_ms(1000);  //un retardo de un segundo
     }
      
      switch(horas) {   // se evalua la variable horas y dependiendo de su valor sera la salida
         case 1: output_high(pin_b0);
               break;                 
         case 2:output_high(pin_b1);  
               break;
         case 3:output_high(pin_b0);  // esta parte es la del problema
                  output_high(pin_b1);
               break;
         case 4:output_high(pin_b2);
               break;
         case 5:output_high(pin_b0);
                output_high(pin_b2);
               break;
         case 6:output_high(pin_b1);
                output_high(pin_b2);
               break;
         case 7:output_high(pin_b0);
                output_high(pin_b1);
                output_high(pin_b2);
               break;
         case 8:output_high(pin_b4);              
               break;
         case 9:output_high(pin_b0);
                output_high(pin_b4);
               break;
         case 10:output_high(pin_b1);
                 output_high(pin_b4);
               break;
         case 11:output_high(pin_b0);
                  output_high(pin_b1);
                  output_high(pin_b4);
               break;
         case 12:output_high(pin_b3);
                  output_high(pin_b4);
               break;
            
     }
     }
   

}

}
Bien pues, aparentemente todo está bien, sin embargo cuando llega a la hora 3 es decir 0011 en binario solo se pone la salida del puerto b como 0010. ¿Cómo puedo lograr que se mantenga en alto una salida? Es decir que si yo activé el pin B0 un ciclo atrás, que en el siguiente ciclo permanesca encendido y se encienda el pin B1 solamente sin afectar el B0.

Tambien se me habia ocurrido imprimir el valor de la variable horas justo como lo hice con "minutos" pero el problema es que debía mantenerlo encendido y en el compilador CSS que es el que uso, no encontré alguna funcion que me permita imprimir algo(por asi decirlo) y mantenerlo hasta que decida imprimir otra cosa.

De antemano muchas gracias
05/11/2010 #2

Avatar de ByAxel

Que tal:
No seria más fácil poner la variable horas directamente en el PORTB?, no entiendo porque usas el switch y activas individualmente cada pin del PORTB...
El conteo es totalmente en binario y lo único que hace es copiar el valor de las variables (minuto y hora) y pegarlo en los PORTx (son también registros, que son también variables que mantienen el dato)...

saludos
05/11/2010 #3

Avatar de vootha33

Hola ByAxel, pero como podría hacerlo? output_b(horas); ? Lo intenté asi pero no mantenía el valor.
05/11/2010 #4

Avatar de ByAxel

El tipo de las variables cambia a char o int8 ya que int es mayor de 8 bits. Use este code y me fucniona.

Código:
#use fast_io(b)
#use fast_io(c)

char hora, minuto;

//---
void main()
{
   set_tris_b(0);
   set_tris_c(0);
   output_b(0);
   output_c(0);
      
   while(TRUE){   
      for(hora=0 ; hora<=12 ; hora++){
         output_b(hora);
         for(minuto=0 ; minuto<60 ; minuto++){
            output_c(minuto);
            delay_ms(1000);
         }
      }
   }
}
05/11/2010 #5

Avatar de vootha33

aaah ok.. ya entendí.. si algo asi esperaba que fuera un código corto, pero me andaba fallando lo del tipo de variable. Gracias
06/11/2010 #6

Avatar de snakewather

vootha33 dijo: Ver Mensaje
aaah ok.. ya entendí.. si algo asi esperaba que fuera un código corto, pero me andaba fallando lo del tipo de variable. Gracias

Esta padre por que lo pongo en mi cuarto solo yo sabre la hora jajajajaj te quedo bien.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.