Contactos

El plan de reloj en el microcontrolador AVR. Reloj simple en el microcontrolador. Dispositivos de operación de video en el canal de YouTube

A veces, es útil tener un reloj en el tiempo de conteo del sistema en segundos, e incluso con alta precisión. A menudo, el RTC (reloj en tiempo real) se utiliza para estos fines. Pero este es un caso adicional, y a veces es de alguna manera como Mk mismo, aunque puedes hacerlo sin él. Además, muchos MK tienen una unidad RTC incorporada. No hay verdad en AVR, pero hay un temporizador asíncrono, que sirve como un producto semiacabado para la fabricación de accesos.

En primer lugar, necesitamos un cuarzo de reloj a 32768 aquí.

¿Por qué el cuarzo sólo 32768Hz y por qué es su nombre para los relojes? Sí, todo es muy simple, 32768 es un grado de dos. Dos en el quince. Por lo tanto, un quince metro de descarga que tictac con una frecuencia de 32768 Hz se aplastará una vez por segundo. Esto hace posible construir un reloj en la dispersión lógica habitual sin ningún problema. Una B. microcontrolador avr. Es posible organizar horas con segundos casi sin el uso del cerebro, en los reflejos de la periferia.

Modo de temporizador asíncrono
¿Recuerdas cómo funcionan los temporizadores? La frecuencia del reloj desde el generador de reloj principal (RC externo o interno, externo, generador de cuarzo o externo) ingresa a los delincuentes, y desde la salida de las ofertas ya hace clic en los valores del registro TCNT. La señal de entrada proviene de la entrada de conteo de TN y también hace clic en el registro TCNT

Para hacer esto, las conclusiones de TOSC2 y TOSC1 cuelgan un resonador de cuarzo. Baja frecuencia, generalmente cuarzo de reloj a 32768Hz. Está montado a la derecha del controlador y se conecta con saltadores. es más frecuencia de reloj El procesador debe ser superior a cuatro veces. Tenemos un clum del generador interno de 8 MHz, para que esta condición no se preocupe en absoluto :)

Y no cuente la cantidad de relojes básicos de cuarzo, y si no lo es, está molestando la frecuencia flotante del generador RC incorporado. La hora de cuarzo tiene mucho más. tamaños compactos que el cuarzo ordinario, y es más barato.


También es importante el hecho de que un temporizador asíncrono se puede marcar por sí mismo, desde el cuarzo de la hora, ya que no se necesita la frecuencia del reloj del procesador, y esto significa que el reloj del kernel del controlador (la cosa más ansiosa que tiene) se puede volver. Desactivado, el procesador en la hibernación reduce significativamente el consumo de energía y se despierta solo por el temporizador de desbordamiento (1-2 veces por segundo) para registrar nuevas lecturas de tiempo.

Configuración
Para habilitar, solo necesita instalar los bits AS2 ASSR, y todos, el temporizador funciona en modo asíncrono. Pero hay una característica que valía un montón de cachorros a la vez. El hecho es que al trabajar desde su cuarzo, todos los registros de temporizador interno comienzan a sincronizarse en su propio cuarzo. Y él tiene un programa lento y básico, puede cambiar el valor ya ingresado mucho más rápido de lo que se trata con un temporizador.

Esos, por ejemplo, preinstaló el valor de TCNT2, el temporizador en su 32 kHz, la garganta ni siquiera tuvo tiempo de fumarlo, y ya me había unido a su algoritmo, y algo lo grabó de nuevo, como resultado, la basura probablemente será Caer en TCNT2. Que esto no sucede para grabar buffers. Esos. Cree que usted anotó los datos en TCNT2, pero de hecho, se dividen en un registro temporal y, en el conteo, solo caerán a través de tres tacto de un generador lento.

Los registros de comparación de OCR2 y los registros de configuración de TCCR2 también están bufferizados.

¿Cómo descubrir los datos ya ingresados \u200b\u200ben el temporizador o colgar en celdas intermedias? Sí, muy simple - en banderas en el registro de Assr. Estos son bits TCN2UB, OCR2UB y TCR2UB: todos son responsables de su registro. Cuando, por ejemplo, escriba un valor en TCNT2, entonces TCNUB se convierte en 1, y tan pronto como nuestro número del registro intermedio pasó al registro de conteo real TCNT2 y el comienzo ya está marcando, entonces esta bandera se reinicia por la máquina.

Por lo tanto, en el modo asíncrono, al escribir en los registros TCNT2, OCR2 y TCCR2, primero debe verificar las banderas TCN2UB, OCR2UB y TCR2UB y escribir solo si son cero. De lo contrario, el resultado puede ser impredecible.

Si otro momento importante - Cuando se cambia entre modo síncrono y asíncrono, el valor en el registro de conteo de TCNT se puede romper. Así que para los conmutadores de fiabilidad, por lo que:

  • Prohibir las interrupciones de este temporizador
  • Cambie al modo deseado (síncrono o asíncrono)
  • Re-ajuste el temporizador como necesitamos. Esos. Exhibe el ajuste preestablecido TCNT2 si necesita reinstalar TCCR2
  • Si cambia al modo asíncrono, esperamos hasta que se restablecen todas las banderas TCN2UB, OCR2UB y TCR2UB. Esos. La configuración aplicada y lista para trabajar.
  • Deje caer las banderas de las interrupciones del temporizador / contador. Porque Con todas estas perturbaciones, pueden establecer accidentalmente.
  • Permitir interrupciones de este temporizador.

El incumplimiento de esta secuencia conduce a fallas impredecibles y difíciles de detectar.

Modos de dormir y temporizador asíncrono
Porque El temporizador asíncrono se usa a menudo en diferentes modos de ahorro, entonces hay una característica que pone todo el campo del rastrillo.

La línea inferior es que un temporizador que funciona desde un cuarzo lento no tiene tiempo para el procesador principal, y en la DOFIGA de las dependencias en la periferia, las mismas interrupciones, por ejemplo. Y cuando el porcentaje está durmiendo, estas dependencias no se pueden realizar, como resultado, los fallos parecen ser interrumpidos o valores dañados en los registros. Por lo tanto, la lógica de trabajar con un temporizador asíncrono y un modo de dormir debe construirse de tal manera que un temporizador asíncrono haya logrado resolver algunos de sus relojes entre el despertar y el dumping en la hibernación y cumplió con todos sus asuntos.

Ejemplos:
El controlador utiliza el modo de ahorro de energía y apaga el kernel, y se despierta las interrupciones de temporizador asíncrono. Es necesario considerar el hecho de que si cambiamos los valores de los registros TCNT2, OCR2 y TCCR2, entonces el cuidado de la hibernación es necesario solo después de que caigan las indicadoras TCN2UB, OCR2UB y TCR2UB caerán. De lo contrario, resulta que dicha basura, un temporizador asíncrono aún no ha logrado recoger datos de los registros intermedios (es lento, cientos de veces el núcleo), y el kernel ya se ha cortado. Y la nueva configuración no habría aplicado, es una tontería.

Es peor que en el momento de las modificaciones de los registros de TCNT o OCR, el funcionamiento de la unidad de comparación está bloqueada, lo que significa que el kernel se empapa antes, entonces la unidad de comparación no comenzará, no habrá nadie que lo convertirá. en. Y tenemos interrupción en comparación. Lo que se usa en ese evento que estamos estallando y los perderemos hasta que el próximo despertar de la hibernación.
¿Y si el controlador se rompe al interrumpir en comparación? Luego caerá finalmente. ¡UPS!
Así que atrapa tal falla más tarde.

Entonces, antes de partir en los modos de ahorro de energía, es necesario dar un temporizador asíncrono para presentar los valores ingresados \u200b\u200b(si se introdujeron) y esperar a las banderas de cero.

Otra broma con un régimen asíncrono y un ahorro de energía es que el subsistema de interrupción al salir de la hibernación comienza para 1 tacto de un generador lento. Así que incluso si no cambiamos nada, es imposible retroceder en la hibernación: no se despierte, porque Las interrupciones no tendrán tiempo para comenzar.

Por lo tanto, la salida de la hibernación y la caída dormida en la interrupción del temporizador asíncrono debe estar en este formulario:

  • Despertó
  • Que hizo lo deseado
  • Sonar

Y la duración de la operación entre despertada y quedó dormida no debería ser inferior a un temporizador asíncrono de garrapatas. De lo contrario, la anabiosis será eterna. Puede retrasar, y usted puede hacer como informes de datos:

  • Despertó
  • Que hizo lo deseado
  • Por el bien de la broma, se registró algo en cualquiera de los registros bufferizados. Por ejemplo, TCNT fue 1, y una vez más grabamos 1. Nada ha cambiado, pero se ha producido el registro, la bandera TCN2UB aumentó que tres embragues del generador lento durarán.
  • Esperado hasta que caiga la bandera.
  • Se quedó dormido.

Tampoco se recomienda para dejar la hibernación para leer inmediatamente los valores de TCNT, puede considerar Laude. Es mejor esperar un temporizador asíncrono de garricata. O haga una broma con un registro en el registro y la expectativa mientras la bandera caerá, ya que se escribió arriba.

Bueno, el último, pero importante, momento, después de suministrar energía, o salir de la hibernación profunda, con deshabilitar no solo el kernel, sino en general la periferia completa, use el generador lento se recomienda encarecidamente antes de a través de 1 segundo (¡No es un milisegundo, sino un segundo!). De lo contrario, el generador aún puede ser inestable y en registros habrá más papilla y basura.

Y, al final del artículo, un pequeño accesorio. Ejecutar un temporizador asíncrono en ATMEGA16 (como se usa un relleno sanitario)

El proyecto es típico, sobre la base del despachador, una diferencia es una de las diferencias: el despachador se mueve al TIMER0 para liberar el TIMER2.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 INT principal (vacío) (initall (); // inicializar la periferia Initrtos (); // inicializar el kernel Runtos (); // Iniciar kernel. Udr \u003d "r"; // inicio marcador, para depurar Settimertask (inicasass_timer, 1000); // Dado que el temporizador en modo asíncrono // comienza lentamente, entonces hazlo // Exposición para iniciar la inicialización del temporizador. Mientras (1) // Ciclo principal del despachador (Wdt_reset (); // dumping un temporizador de perro Administrador de tareas (); // desafiar despachador ) Devuelva 0; )

iNT principal (vacío) (inicial (); // inicializando la periferia de initrtros (); // Inicialice el kernel Runcos (); // Inicie del kernel. Udr \u003d "R"; // Marker Iniciar, para depurar la SettimerTask (InicasS_timer, 1000); // Dado que el temporizador en modo asíncrono // comienza lentamente, entonces hacemos // velocidad de obturación para ejecutar la inicialización del temporizador. Mientras (1) // Ciclo principal del despachador (WDT_RESET (); // Dumping Un TaskManager (); // desafiar despachador) devuelva 0;)

El procedimiento para inicializar un temporizador en modo asíncrono se realiza en forma de automatón finito. Cuando comience por primera vez, se confirma el bit de modo asíncrono y se convierte en cocción, después de que se inicie de nuevo, a través del despachador para permitir que algo más se deslice en la cola sin bloquear el sistema para esperar.

En las entradas posteriores, se verifican bits de bandera de la preparación de los registros de temporizador. Si todos están en los ceros, estamos en caso de que sean banderas de interrupción de temporizador para que no haya fallas y falsos positivos, y luego nos permiten interrumpirnos. Y salir.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Void ininagass_timer (vacío) (si (assr & (1<< AS2) ) // si esta es la segunda entrada (Si (Assr & (1<< TCN2UB | 1 << OCR2UB | TCR2UB) ) // verificando si hay al menos un bit de un bit (CESTASK (inicasass_timer); // Si lo hay, enviamos un ciclo repetido de espera. ) DEMÁS. // si todo está limpio, entonces puedes ejecutar interrupciones (TIFR | \u003d 1<< OCF2 | 1 << TOV2; // recargue las banderas de interrupción, por si acaso. Timsk | \u003d 1<< TOIE2; // Permitir la interrupción del desbordamiento Regreso; )) TIMSK & \u003d ~ (1<< OCIE2 | 1 << TOIE2) ; // prohibir las interrupciones del temporizador 2 Asr \u003d 1.<< AS2; // enciende el modo asíncrono TCNT2 \u003d 0; TCCR2 \u003d 5.<< CS20; // Oferta 128 al 32768 dará 256 garrapatas por segundo // ¿Qué le dará a 1 interrupción de desbordamiento por segundo? Colonos (inicasass_timer); // Ejecutar a través del despachador para ir de nuevo. }

void ininagass_timer (vacío) (si (assr & (1<

Isr (timer2_ovf_vect) // interrupción sobre el desbordamiento del temporizador 2 (udr \u003d i; i ++;)

Podría hacer variables que contengan horas: minutos: segundos y haga clic en estas variables con toda su lógica de desbordamiento del reloj, pero era perezoso. Y así todo está claro.

Actualizado el 23/07/2018. Hola a todos. Para trabajar con el reloj, en el último artículo, se consideró la interfaz TWI, en la que nos referiremos hoy. Bueno, vamos a empezar. Estos relojes son compatibles con TWI, es decir,. El principio del intercambio de datos sobre el neumático será el mismo que considerado.

La siguiente figura muestra la ubicación de las conclusiones, la descripción y la forma misma de nuestro reloj o cómo se llamarán RTC (reloj en tiempo real): el reloj en tiempo real o el generador de pulsos de tiempo. Este dispositivo" DS1307. Considera segundos, minutos, horas, día del mes, mes, día de la semana y año junto con saltos. El calendario es válido hasta las 2100. Creo que por nuestra edad suficiente :).

Como se puede ver en la descripción, hay una entrada de nutrición interna de la batería cuando se apaga la alimentación externa. En este modo, RTC admite solo su propósito principal: cuenta regresiva, sin solicitudes externas. El voltaje de la batería debe ser 2 - 3.5V. La descripción técnica está escrita que al cargar más de 48 MA / H, a una temperatura de 25 grados Celsius, nuestro esquema durará unos 10 años. Mas que necesario. La siguiente figura muestra la "tableta" CR2032 y su fijación que usaremos.

Ahora pasamos por la nutrición externa. Voltaje de operación del reloj 5B con un pequeño rango de 4.5 -5.5V. Voltaje de la batería 3B (mínimo 2, máximo 3.5V) El funcionamiento de RTC se divide en tres modos de voltaje:

1. VCC \u003d 5B - Lectura, grabación, contando;
2. VCC \u003d por debajo de 1.25 * VBAT, pero sobre VBAT + 0.2V, solo contando la batería de los alimentos externos.
3. VCC debajo de VBAT: RTC y RAM se encienden de la batería. Consumo en el estado activo de 1,5 mA, desde la batería de 500-800.
Voltaje para la transmisión / recepción de información:
Lógica 0: -0.5b - + 0.8V
Lógica 1: 2.2 V - VCC + 0.3B

Como en las publicaciones anteriores, comencemos a empezar en Proteus. Código de salida. Y transferiremos todo al hierro. A continuación se muestra un esquema de conexión.

Donde SQW / OUT es una salida del reloj que se puede programar para derivar la frecuencia de 1Hz, 4.096Hz, 8.192Hz y 32,768Hz. Esos. Puede usar la interrupción externa del controlador con una frecuencia de 1 s. Característica muy útil. Pero no seremos útiles. Por cierto, también es con un colector abierto, por lo que se requiere una resistencia de pull-up. Nominal 4.7 com.

Conclusiones X1 y X2: conectan un resonador de cuarzo con una frecuencia de 32.768 kHz. O puede aplicar un generador de reloj externo con la misma frecuencia. Pero con esta salida X1 se conecta a la señal, y X2 permanece desconectado (colgando en el aire).

Bueno, los hallazgos de la SDA y el SCL con los que conocimos el último artículo.

Nos detendremos un poco en el resonador (dibujando a continuación). Que se puede llamar el corazón del reloj, y en el que depende la exactitud del curso. La calidad del resonador mismo se encuentra en la conciencia del fabricante, pero por su parte, podemos reducir el error que contribuyen los factores externos si nos adherimos a las siguientes recomendaciones para la colocación del resonador:

2. El ancho de la pista también es menos posiblemente hacer para reducir la probabilidad de interferencia de otras fuentes.

3. El contorno en forma de un anillo protector debe colocarse alrededor del cristal, lo que ayuda a aislar el cristal del ruido.

4. Los conductores colocan en el anillo y se conectan a la conexión a tierra.

5. Envío del resonador al suelo. Si la tierra se divorcia verdadera y hay confianza.

La siguiente figura muestra el contorno y el lugar se soldaba al suelo.

Cómo conectarse a ordenar. Vamos más lejos, lo resolveremos cómo trabajar con él. RTC es programable y tiene 8 bytes de registros especiales para su configuración de configuración estática y no volátil de 56 bytes. Para el intercambio de información requiere un bus de datos de 2 por cable, es decir, Autobús de datos secuenciales, que buscamos el último artículo. Así que para el trabajo podríamos en la hoja de datos. Qué necesitamos:

Tabla de registro. La siguiente figura. Los primeros ocho registros son para la retirada y la programación de nuestro reloj. Cuando se pone en contacto con 00h hasta el 7º bit (CH) y la instalación de ella en 0: dejando que el reloj. Me gustaría señalar que la configuración de los registros puede ser, por lo que cuando se inicie primero es necesario configurarlo en sus requisitos. Los siete trozos restantes de unidades y docenas de segundos.

01h - minutos.
02h - Relojes que están configurados:
- Bit 6 - con 1 formato de salida de 12 horas, 0 - 24.
- Bit 5 - a 1 (en formato de las 12 en punto) PM, 0-AM
- bit 5 - (a las 24 horas de formato), se retira de la segunda decenas de horas (20-23 horas).
- Bit4 - La primera tienda de campaña del reloj, el resto de los bits son unidades de horas.
03h - día de la semana;
04h - fecha;
05h - mes del año
06h - año.

Bueno, el último registro 07h. Este registro es el gerente. Donde fuera responsable de administrar la salida SQW / OUT. A continuación se muestra el encendido en la tabla de salida.

Fuera.
Sqwe
Sqw / out.
1
0
1
0
0
0

SQWE - Al instalar este bit B, 1 a las salidas, los pulsos están fuera de la frecuencia especificada, que se instala, RS1 y RS0 bits.

Esta conclusión no es útil para nosotros en el proyecto. Aunque para él distribuí la pista en la pizarra. A medida que los experimentos pueden estar en algún lugar en el futuro y aplicar, porque aquí puede hacer interrupciones en 1 segundos.

Ahora, tener toda la información necesaria, escriba funciones para trabajar con el reloj. Y también lanzar el proyecto en Proteo. . Que tendrá la siguiente forma:

Tenga en cuenta que el resonador en Proteus no se puede conectar al reloj (colapsado en rojo).

La figura eliminó el terminal de reloj, que muestra la hora, que a su vez se adjunta a la hora del sistema. El terminal de depurador de protocolos I2C o TWI, que muestra el tiempo de envío y recepción, donde D0 es el comando transmitido, la recepción D1. A continuación, mostraré las capturas de pantalla del terminal con el resultado del programa.

Programa. Habiendo considerado la configuración básica del reloj, escriba la función de inicialización.

/ * La función de inicialización incluye configurar el tipo de cambio de datos por la fórmula (en el artículo anterior), instalando un distribuidor y girando en el módulo TWI * /
void init_ds1307 (vacío)
{
TWBR \u003d 2; / * A una frecuencia de 1 MHz * /
TWSR \u003d (0<< TWPS1)|(0 << TWPS0); / * Preheer en 64 * /
TWCR | \u003d (1<< TWEN); / * Encendido del módulo TWI * /
}

void Write_ds1307 (uint8_t reg, uint8_t tiempo)/ * Transmitimos dos parámetros: la dirección de registro a la que recibiremos y transmitiremos información * /
{
/ * Forme el estado del inicio, exponiendo las descargas de registro de control * /
TWCR \u003d (1<
/ * Permitir la operación del módulo TWEN; Dar forma al estado del inicio de Twsta; Restablecer twint * /
/ * Estamos esperando el final de la formación de la condición de inicio, es decir,. Hasta que se configura la bandera, el código de estado \u003d 08 * /
mientras (! (TWCR & (1<
/ * Dirección de dirección siguiente (dirección del dispositivo). Los contenidos del paquete se cargan en el TWDR * / Registro
TWDR \u003d 0xd0; / * 0B1101000 + 0 - Dirección + Bits de grabación * /
/ * Restablecer la bandera para la transferencia de información * /
TWCR \u003d (1<
/ * Esperando la configuración de la bandera * /
mientras (! (TWCR & (1<
/ * Pasamos el registro al que contactaremos * /
TWDR \u003d REG;
TWCR \u003d (1<
mientras (! (TWCR & (1<
/ * Transmitimos información para escribir al byte del registro * /
TWDR \u003d TIEMPO;
TWCR \u003d (1<
mientras (! (TWCR & (1<
/ * Forma el estado de STOP * /
TWCR \u003d (1<
}

En esta característica pasamos tres bytes, la dirección del dispositivo, la dirección del registro y el byte de la información para escribir en este registro y formaron el estado de la parada.

La última función de lectura permanece. Por debajo del formato de lectura.

En esta característica, el dispositivo es transferido por el dispositivo + bits del registro, byas la dirección de registro para instalar el puntero, realice la condición de la válvula, transmitiendo el byte del dispositivo + el bit de lectura, leyendo el registro cuya dirección hemos aprobado.

Si nos dirigimos a horas en formato de lectura, cuando presiona el reloj, el puntero cambia un byte hacia abajo, incluidos 56 bytes de RAM, de 00H a 3FH. Cuando se alcanza la última dirección, el puntero va a la dirección 00.

/ * Función de lectura de datos de DS1307 * /
uint8_t read_ds1307 (uint8_t reg)/ * Transferencia Dirección de registro * /
{
Tiempo uint8_t;
/ * Forme el estado del inicio * /
TWCR \u003d (1<
Mientras (! (TWCR & (1<
TWDR \u003d 0xd0; / * Transfiera la dirección + bits de grabación * /
TWCR \u003d (1<
Mientras (! (TWCR & (1<
TWDR \u003d REG; / * Dirección de registro * /
TWCR \u003d (1<
Mientras (! (TWCR & (1<
/ * Forma el estado del Misstur * /
TWCR \u003d (1<
Mientras (! (TWCR & (1<
TWDR \u003d 0xd1; / * Transfiera la dirección + lectura bit * /
TWCR \u003d (1<
Mientras (! (TWCR & (1<
/ * Lea los datos * /
TWCR \u003d (1<
Mientras (! (TWCR & (1<
Tiempo \u003d TWDR;
Tiempo \u003d ((((tiempo y 0xf0) \u003e\u003e 4) * 10) + (TIEMPO Y 0x0F);
/ * Forma el estado de STOP * /
TWCR \u003d (1<
Tiempo de devolución;
}

Entonces, escribimos tres funciones que necesitamos para trabajar con el reloj. Usando estas características, inicie el programa en Proteus. Retirar, por ejemplo, Fecha.

#Incluir.
#Incluir.
tiempo uint8_t;
void init_ds1307 (vacío);
uint8_t read_ds1307 (uint8_t reg);
void write_ds1307 (uint8_t reg, uint8_t tiempo);
iNT principal (vacío)
{
DDRC \u003d 0 × 00; / * Exponer el puerto como entrada * /
PORTC \u003d 0xFF; / * Apriete la resistencia * /
init_ds1307;
Mientras (1)
{
_delay_ms (50);
READ_DS1307 (0 × 04); / * Lectura de la fecha de registro * /
}
}

Por debajo del resultado del programa está leyendo la fecha.

En la ventana del depurador I2C ( Twi. ) Se puede ver que primero se envía la dirección del Registro en RTC (Green Circle), en este caso 04, que es responsable de la fecha del mes, y luego el reloj pasa la respuesta 21 (círculos rojos).

Cuando lanzamos el reloj en la glándula, tendremos que contactarnos. A continuación se muestra un ejemplo de un programa de cambio de programa.

mientras (1)
{
_delay_ms (500);
READ_DS1307 (0 × 01); / * Leer el minuto * /
_delay_ms (500);
write_ds1307 (0 × 01, 15); / * Escribe el minuto requerido * /
_delay_ms (500);
READ_DS1307 (0 × 01); / * Leer el minuto * /
}

La figura muestra que las primeras apelaciones se registran 01, se lee un minuto 23. A continuación, usamos la función de grabación y realizamos un valor de 15. En la siguiente función de lectura, tenemos un valor de 15 en el reloj.

Bueno, el último ejemplo del programa es la salida de los valores de todos los registros.

mientras (1)
{
retardo_ms (500);
READ_DS1307 (0 × 00);
_delay_ms (500);
READ_DS1307 (0 × 01);
_delay_ms (500);
READ_DS1307 (0 × 02);
_delay_ms (500);
READ_DS1307 (0 × 03);
_delay_ms (500);
READ_DS1307 (0 × 04);
_delay_ms (500);
READ_DS1307 (0 × 05);
_delay_ms (500);
READ_DS1307 (0 × 06);
_delay_ms (500);
}

La figura a continuación muestra que estos 7 registros fueron traídos.

Se adjunta el código fuente con el proyecto:

(Descargas: 601 personas)

Eso es todo. En el siguiente artículo, el reloj de la glándula, retire el tiempo al indicador y se familiarice con un formato binario decimal para trabajar con el reloj. Hasta aquí.

Esquema y programa de reloj muy simple en AVR Microcontroller usando chip en tiempo real DS1307

¡Buen día queridos aficionados!
Saludos a usted en el sitio ""

Hoy, queridos aficionados de radio, eres muy simple. esquema de reloj en AVR Microcontroller y reloj en tiempo real con I2C DS1307 Interfaz en serie.

El diseño se ensambla en el microcontrolador ATYNI26 (solo que este MK estaba a la mano). Pero puede aplicar cualquier otro MK, lo principal es que tiene 13 entradas libres - 11 para emitir la hora actual en el indicador LED de siete segmentos de cuatro bits y 2 salidas, en los botones de instalación y la corrección de tiempo.

Esquema de reloj:

Los siguientes detalles se aplican en el diagrama:
- Microcontrolador - Atyni26 en caso.
- Reloj en tiempo real - DS1307 en Cuerpo de Digüe
- Cuarzo - 32,768 KHz, con capacidad de entrada de 12 PF (puede tomar la placa base de la computadora), la precisión del reloj depende de este cuarzo
- Potencia de respaldo DS1307 - elemento de litio de 3 voltios CR2032
- Indicador LED de siete segmentos de 4 bits - FYQ-5641UB -21 con cátodo compartido (ultrapolor, resplandor azul)
- todos los transistores - estructuras de NPN, puede aplicar cualquier (CT3102, CT315 y sus análogos extranjeros), utilicé SP547C
- Estabilizador de voltaje de microcircuito Tipo 7805
- todas las resistencias de 0.25 vatios
- Capacitores polares para voltaje de trabajo 50 voltios.
El consumo actual por dispositivo es de hasta 30 mA.
Para alimentar el diseño, puede usar cualquier cargador innecesario desde el teléfono o una fuente de alimentación adecuada con un voltaje de salida de 7-9 voltios.
La comunicación del microcontrolador con el reloj DS1307 se produce a través del bus I2C y está organizado por software.
Las baterías de respaldo del reloj DS1307 no se pueden instalar, pero en este caso, cuando el voltaje se pierde en la red, la hora actual tendrá que ser instalada nuevamente.
La placa de circuito impreso del dispositivo no se administra, el diseño se recogió en el caso del reloj mecánico defectuoso. El LED (con una frecuencia parpadeante de 1 Hz) sirve para separar el reloj y los minutos en el diseño.

Programa de trabajo.
La frecuencia del reloj del microcontrolador es de 1 MHz (ajuste de fábrica, fusibles para tocar e instalar sin necesidad). El tamaño del programa es de 1 kilobyte.
Al iniciar el programa, se produce el programa:
- inicie el temporizador T0 con la frecuencia PRESET SC / 8 y llame a la interrupción del desbordamiento (con una frecuencia preinstalada, se produce una llamada de interrupción cada 2 milisegundos)
- La inicialización del puerto (puertos PORTS0-6 y PV0-3 se configura para retirar, R7 y PB6 Entrada)
- Inicialización del neumático I2C (Conclusiones de PB4 y PV5)
- Cuando comience primero, o con un reinicio cuando no hay una alimentación de respaldo DS307, se verifique 7 bits (CH) del Registro Cero DS1307 y se revisa una transición a la configuración inicial de la hora actual. Al mismo tiempo, el botón S1: para configurar la hora, el botón S2, la transición a la siguiente descarga. Configurar tiempo: las horas y los minutos se registran en DS1307 (los segundos se instalan a cero), así como la salida SQW / OUT (7ª salida) se configura para generar pulsos rectangulares con una frecuencia de 1 Hz
- Se permite la interrupción global.
- El programa entra en un ciclo con una encuesta COPPE S2
Cuando se desbordan un programa T0 T0 Counter procede para interrumpir el mantenimiento (cada 2 ms):
- La hora actual se lee desde el DS1307, que se escribe en cuatro variables SRAM (decenas de horas, unidades de horas, decenas de minutos, unidades de minutos)
- El subprograma de la salida del tiempo actual está hecho de una indicación dinámica de la hora actual en el indicador LED
- Cuando presiona el botón S2, el programa prohíbe una interrupción global y ingresa a la subrutina de corrección de tiempo (los botones S1 y S2 Docenses y las unidades de minutos están instaladas, luego, desde 0 segundos, presionando el botón S2, se registra el tiempo refinado En el DS1307, el permiso de la interrupción global y regresa al programa básico).

Los relojes DS1307 aplicados en el circuito nos permiten mostrar un segundo, minutos, horas, día de la semana, fecha y año.
Si está en el diagrama en lugar de los indicadores LED, aplique la pantalla LCD, por ejemplo, WH0802 (dos líneas, con la salida de ocho caracteres en la cadena) o similar, puede organizar un reloj completo con salida completa de La hora actual, y la fuente de alimentación del dispositivo está organizada de elementos galvanicos o baterías.

La ubicación de las conclusiones del microcontrolador ATYNI26:

DS1307 Hallazgos Ubicación:

Diagrama de conexión típico D1307:

LECCIÓN 23.

Parte 1

Recolectamos horas en el indicador DS1307 y LED.

Hoy, continuaremos nuestro trabajo con un microcircuito que es el reloj en tiempo real, comenzó dentro y, y ahora intentaremos recolectar horas con un indicador de cristal no líquido, y con el uso de un indicador de la LED de cuatro dígitos basado en el principio de indicación dinámica. Todos pasamos esto con usted, también se aprobó la indicación, tal indicador estaba conectado a, por lo que no seremos tan difíciles de implementarlo.

Pero, a pesar de todo nuestro conocimiento, la lección no promete ser corta, pero por el contrario será muy extensa, ya que el conjunto de reloj en tales indicadores requiere una solución a muchas tareas adicionales, especialmente porque no tenemos 32 conocidos, como en el Nuestra pantalla LCD, y solo 4 y puntos o colon. Y todas las lecturas deben ser de resultados estarán en orden de cierta cola, y también se requieran las habilidades que podamos organizar un cambio en las lecturas (traducción) usando los botones, y generalmente puede usar los botones solo como parte del uso de Sólo cuatro dígitos.

Pero no tenemos miedo de las dificultades, incluso más interesantes con ellos.

Por lo tanto, comencemos a inventar algo.

El indicador será así, de ellos, exactamente el tipo con el ánodo general.

Y así el indicador se ve en vivo.

A juzgar por las células de 5 milieters en tamaño, es fácil estimar sus dimensiones.

Aquí está su apariencia.

También tengo otro indicador con un tamaño más pequeño, pero en el pinout exactamente lo mismo que el anterior. Es decir, acabo de sacar de la tabla ficticia e insertar otra en ella, y todo funciona.

Aquí están ambos para comparación.

Aquí hay un etiquetado de un pequeño indicador.

También podemos usar indicadores separados para cada dígito, conectándolos en consecuencia, el resultado será el mismo. Este tipo de conexión generalmente se usa cuando se requieren relojes con grandes números y es difícil encontrar un indicador combinado de gran tamaño. El método de conexión se demuestra claramente en nuestro esquema en el Proteus, ya que encontré en un proteus y un indicador combinado, pero por alguna razón no funcionó correctamente (haga clic en la imagen para ampliar la imagen)

Este esquema recordamos bien de la lección de software. Solo solo había 2 indicadores, por lo que se conectará dos más, también se utilizarán dos teclas de transistores más, cuya base de datos pasará a través de la resistencia de limitación actual en 2 kiloma desde los puertos de los puertos. PB2. y PB4.. Saltaremos la tercera etapa del puerto B para su uso adicional en otra calidad alternativa, como una etapa del hardware PWM para ajustar el brillo del brillo del indicador.

Crea un proyecto nombrado Myclock1307led, y el código es todo para el módulo principal, tome solo desde la lección de la indicación dinámica, desde el proyecto Test08.. En ese momento, aún no hemos tenido una programación modular y todo el código útil se contuvo en un módulo principal.

Para empezar, recopilaremos nuestro proyecto, conectaremos el controlador y sus valores y veremos intereses el resultado del código de código

Vemos que dos indicadores correctos funcionan normalmente. Pero necesitamos cuatro.

Para empezar, agregaremos dos variables más para dos descargas no utilizadas.

no firmado.en t.i.;

no firmado.carbonizarse.R1=0, R2=0, R3=0, R4. =0 ; // dígitos indicadores

Declararemos los puertos del puerto en la salida en la función Port_ini (), también se aplicaremos a la función PORT_INI, incluido el pie.

DDRB.= 0b000 111 11;

También agregue código a la función LEDPrint

vacío.lEDPRINT( no firmado.en t.número)

R1= número%10;

R2= número%100/10;

R3= número%1000/100;

R4.= número/1000;

Todavía tenemos el resultado de la cantidad de números faltantes, así como en la segunda categoría, ha habido algunos cambios debido a uno. Que no sea el último ahora, y necesitas lanzar cientos y miles.

Calculamos las variables, permaneció de alguna manera mostrarse en el indicador.

Para hacer esto, cambiaremos el código en el controlador de interrupciones del temporizador.

Isr.( TIMER1_COMPA_VECT.)

Si( n_count==0) { PORTB.&=~(1<< PORTB0.); PORTB.|=(1<< PORTB1)|(1<< PORTB2.)|(1<< PORTB4.); segchar.( R1);}

Si( n_count==1) { PORTB.&=~(1<< PORTB1); PORTB.|=(1<< PORTB0.)|(1<< PORTB2.)|(1<< PORTB4.); segchar.( R2);}

Si( n_count==2) { PORTB.&=~(1<< PORTB2.); PORTB.|=(1<< PORTB0.)|(1<< PORTB1)|(1<< PORTB4.); segchar.( R3);}

Si( n_count==3) { PORTB.&=~(1<< PORTB4.); PORTB.|=(1<< PORTB0.)|(1<< PORTB1)|(1<< PORTB2.); segchar.( R4.);}

N_count++;

Si.( n_count>3 ) n_count=0;

Aquí, creo que todo está claro, le damos un cero lógico al transistor clave de la secreción que necesitamos, ya que sabemos que las claves que tenemos inverso y con otra hebra serán una unidad, y también darán unidades lógicas a los transistores clave de los transistores clave de Los que descargan que en este momento no es brillar, también consideramos uno, sino a tres.

Con eso, todo.

Pero, dado que ahora tenemos la cantidad de indicadores aumentados, ahora la cola antes de que llegue el mismo indicador, es decir, la velocidad de evaluación del testimonio de un indicador cayó, y tenemos que reconfigurar ligeramente el temporizador. Cómo hacerlo, no necesitamos aprender.

OCR1AH= 0b00001111; // Escribe un número al registro de comparación

OCR1AL=0B01000010.;

Bueno, permita que sea posible contar hasta 99, y a 9999 para esto en el ciclo, no escribiremos 100, y 10000

para( i.=0; i.< 10000 ; i.++)

Y también reduciendo el retraso, de lo contrario, no elevamos el cuarto dígito a tal velocidad

Retardo_ms.(10 );

Recopilamos el código, conecte el controlador y veamos el resultado de nuestro trabajo.

Ahora otra cosa. Ahora tenemos un código de trabajo para organizar la indicación dinámica del indicador dinámico de cuatro dígitos, por lo que en parte siguientenuestras clases ya no tendrán que volver a este tema.

5 542 Esta opción se realiza de tal manera que simplifique el esquema tanto como sea posible, reduzca el consumo de energía y, finalmente, obtenga un dispositivo que se coloca fácilmente en su bolsillo. Al seleccionar las baterías en miniatura para alimentar el esquema, la instalación SMD, la instalación y el altavoz en miniatura (por ejemplo, desde un teléfono móvil no funcionales), puede obtener un diseño, un cuadro ligeramente más de coincidencia.
El uso de un indicador sobrehumano le permite reducir la corriente consumida por el esquema. Reducir la corriente de consumo también se logra en el modo "LOFF": se reembolsa el indicador, mientras que solo se enciende el punto de parpadeo de la descarga junior del reloj.

Indicación
El brillo ajustable de los indicadores le permite seleccionar la visualización más cómoda de las lecturas (y nuevamente reducir el consumo de energía).
En horas, se implementan 9 modos de indicación. La transición por modos se realiza utilizando los botones "PLUS" y "MINUS". Antes de mostrar la indicación del propio testimonio, se muestra un breve resumen del nombre del modo. Duración de la salida de la punta - un segundo. El uso de indicaciones a corto plazo hizo posible lograr una buena hora ergonómica. Cuando las transiciones por modos de visualización (que resultan ser suficientes, para un dispositivo tan simple, como el reloj ordinario) no surgen confusión, y siempre está claro qué lecturas se muestran en el indicador.

La corrección de las lecturas que se muestran en el indicador se enciende cuando hace clic en el botón "Corrección". En este caso, se muestra una sugerencia a corto plazo en 1/4 segundos, después de lo cual el valor corregido comienza a parpadear con una frecuencia de 2 Hz. Ajusta las lecturas con los botones "PLUS" y "MINUS". Con un botón de prensa prolongada, el ayudante automático está activado, con una frecuencia dada. Las frecuencias del botón Al presionar el botón son: durante horas, meses y día de la semana - 4 Hz; Por minutos, el año y el brillo del indicador - 10 Hz; Para un valor correctivo - 100 Hz.
Todos los valores ajustados, excepto las horas, minutos y segundos, se registran en EEPROM y se restauran después de que la alimentación esté apagada. Los segundos se reinician cuando se corrigen. De todos los modos, a excepción de un reloj de minuto, minutos, segundos y LOFF organizó un reembolso automático. Si no se presionan botones en 10 segundos, el reloj entra en el modo de visualización del reloj.
Presionando el botón "ON / OFF-BUD". Habilitado / fuera del reloj de alarma. La inclusión del reloj de alarma se confirma mediante un corto sonido bidimensional. Cuando la alarma está habilitada, el punto se enciende en la descarga del indicador inferior.
En el modo "Corr", se muestra una constante correctiva en el indicador, cuyo valor inicial es de 5000 microsegundos por segundo. Al retroceder detrás del reloj, la constante aumenta el retraso calculado en microsegundos en un segundo. Si el reloj se apresura, entonces la constante se reduce por el mismo principio.

Esquema



¿Te gustó el artículo? Compártelo