Go Down

Topic: Atascado en proyecto reloj. (Read 719 times) previous topic - next topic

_jose_

#15
Apr 04, 2018, 02:08 pm Last Edit: Apr 04, 2018, 02:08 pm by _jose_
Te digo como lo veo yo ,una vez modificada la libreria rtc para que no devuelva decimal ,si no bcd que es como trabaja el DS3231 y el 74141N,cada dato del rtc vendra en un byte ,8 bits.Por ejemplo ,imagina que los minutos son 23 ,y suponiendo que la primera cifra se guarda en los bits mas significantes (los mas a la izquierda)y la segunda cifra en los menos significantes(los de mas a la derecha) ,el byte resultante seria 00100011 (0010 del 2 y 0011 del 3) .con la funcion bitread() que te puse arriba puedes leer cualquier bit del byte o incluso usando el desplazamiento de bits https://www.arduino.cc/reference/en/language/structure/bitwise-operators/bitshiftleft/ y https://www.arduino.cc/reference/en/language/structure/bitwise-operators/bitshiftright/ separar el byte en las dos cifras que necesitas ,como es un proceso a repetir para cada byte del rtc (hora,minutos,dia,mes,etc) lo puedes meter en una funcion con dos parametros ,el byte a leer y las salidas a activar y dentro de la funcion ,solo seria leer los 4 primeros bits (primera cifra)  y asignarlos a sus salidas (entradas del 7414N) y los 4 siguientes a la segunda cifra.No si entiendes por donde voy,explicado parece complicado pero es muy facil.

_jose_

#16
Apr 04, 2018, 05:53 pm Last Edit: Apr 04, 2018, 05:54 pm by _jose_
Mas facil todavia ,lees el byte  en BCD del ds3231 y lo mandas directamente a las salidas correspondientes  mediante la manipulacion de los puertos: https://www.arduino.cc/en/Reference/PortManipulation
Luego pondre un ejemplo.

pikardaken

#17
Apr 04, 2018, 10:07 pm Last Edit: Apr 04, 2018, 11:53 pm by pikardaken
Hola,
Ya le pegue un vistazo a la librería y no se en que momento hace la conversión a decimal.
Voy a darle otro vistazo. ¿Donde debería buscar, en el archivo *.cpp o *.h?
Gracias por las pistas.
Saludos.

_jose_

#18
Apr 05, 2018, 12:08 am Last Edit: Apr 05, 2018, 12:27 am by _jose_
Bueno saque algunas funciones de un reloj binario y adapte un poco para hacer un ejemplo.No puedo probarlo ,los dos megas los tengo en impresoras 3d .Recuerda seleccionar el mega al compilar y verificar que la direccion I2C de tu ds3231 es la misma.Repito esta sin probar ,lo que deberia hacer es leer la hora cada segundo ,coger solo los minutos y activar los pines 22 al 25 correspondientes a la primera cifra en binario y idem con la segunda cifra en los pines 26 al 29 ,ademas de mostrar por serial el byte con las 2 cifras en binario:
Code: [Select]

// Librerias

#include <Wire.h>

//Constantes

#define RTC_DIR 0x68 // Direccion reloj DS3231
#define REFRESH 1000 // Cada segundo
 
//Variables globales

unsigned long lastTime; // Variable para comparar tiempo transcurrido.

//Estructuras

struct Date {
  byte seconds;
  byte minutes;
  byte hour24;
  byte dayOfWeek;
  byte dayOfMonth;
  byte month;
  byte year;
};
// funciones
Date getDate(){ // Consulta la hora y fecha y devuelve una variable tipo Date.
  Date date;
  Wire.beginTransmission(RTC_DIR);
  Wire.write(0); // Nos situamos en el primer registro
  Wire.endTransmission();
  Wire.requestFrom(RTC_DIR, 7); // Solicitamos los 7 bytes de informacion de la hora y fecha.
  if (Wire.available()) {
    date.seconds = (Wire.read()); // Lectura datos
    date.minutes = (Wire.read());
    date.hour24 = (Wire.read());
    date.dayOfWeek = (Wire.read());
    date.dayOfMonth = (Wire.read());
    date.month = (Wire.read());
    date.year = (Wire.read());
    return date;
  }
}
void setup() {
    DDRA = B11111111;  // Puerto A del mega como outputs ,va de los pines 22 a 29
    Serial.begin(9600);
    Wire.begin();
    lastTime = millis();

  // put your setup code here, to run once:

}

void loop() {
  if(millis() - lastTime > REFRESH) {
    Serial.println("Leyendo hora");
    Date dateNow = getDate(); // Ejemplo con los minutos.Las entradas del 74141N con primera cifra a los pines 22,23,24 y 25
    PORTA = dateNow.minutes;  // El otro 74141N de la segunda cifra a los pines 27,27,28,29
    Serial.println(PINA,BIN); // Estado de las salidas del puerto A.4 bits derecha la segunda cifra ,4 bits izquierda primera cifra.
    lastTime = millis();
  }
  // put your main code here, to run repeatedly:

}


pikardaken

#19
Apr 05, 2018, 11:42 am Last Edit: Apr 06, 2018, 06:58 pm by pikardaken
Hola,
@_jose_ Al final he optado por utilizar una librería para la conversión a bcd.
Las lecturas que he hecho por el monitor son satisfactorias, me devuelve el valor que corresponde en decimal.
Perfecto para utilizar los puertos o shift registers.
He estado viendo el uso de esos integrados y es muy fácil.
Haré pruebas y cuando lo tenga claro del todo os informo de como va.

Gracias.
Saludos.

_jose_

Tu mismo ,pero si vas a usar el 74141N no la necesitas ,lees bcd directo del ds3231 y activas salidas ,como puedes ver en el ejemplo.

pikardaken

#21
Apr 06, 2018, 03:34 pm Last Edit: Apr 06, 2018, 06:57 pm by pikardaken
Hola,
@_jose_ Me es mas cómodo utilizar la librería para la conversión, hay que escribir poco.
Code: [Select]

volatile byte BCDHor, BCDMin, BCDDia, BCDMes, BCDAno;
volatile int DECAno;
-----------------------------------------------------------------------
BCDHor = bcdlib::dec2bcd((byte)hora);
BCDMin = bcdlib::dec2bcd((byte)minuto);
BCDDia = bcdlib::dec2bcd((byte)dia);
BCDMes = bcdlib::dec2bcd((byte)mes);
BCDAno = bcdlib::dec2bcd((byte)DECAno);

Si una variable solo va a ser utilizada en una sección del código, que diferencia hay, en la practica, que tenga "volatile" o no?

Al final he optado por utilizar los integrados 74HC595 con la función shiftOut para liberar salidas de arduino para otros menesteres.
Ya he hecho una prueba con leds y todo perfecto. Ahora toca ponerme con los esquemas y diseñar la pcb, la primera vez que lo hago.
Después ya añadiré el código de los leds rgb con cambio de color por mando IR, iré depurando el código, agregando comentarios, etc.
Adjunto el código que tengo por ahora.

Saludos.

surbyte

volatile debe usarse cuando se comparte variables con rutinas de interrupción.

Go Up