Dos días de reloj en attiny2313 y ds1307

Motivo


Para empezar, cada persona vive en una época que, desafortunadamente, no se puede detener. Y como vivimos en este mundo, hagamos un seguimiento del tiempo y no perdamos ni un minuto, desperdiciándolo. Para esto, hice este maravilloso dispositivo, llamado reloj .
imagen

¡Empecemos!


El sol salió en la calle, dibujé una placa de circuito y la rasqué en una fotocopiadora para imprimirla.

imagen

Luego, aquellos que sepan cómo están hechas las placas de circuito entenderán que transferí el dibujo con una plancha a textolita, grabado, estañado, etc., y aquellos que no saben - Lea en Internet sobre la fabricación de placas de circuito por el método LUT - (Tecnología de planchado por láser).
Olvidé tomar el resultado, pero creo que la calidad será visible en el tablero terminado:

imagen

puedes ver lugares que no aparecieron, pero no pasó nada malo, solo el vertedero se quedó atrás.
A continuación, fue necesario soldar los componentes, que no me detendré particularmente, solo deje una lista de ellos:
  • AtTiny2313 - microcontrolador de 8 bits
  • ds1307 - chip de contador con buena precisión
  • reloj de cuarzo a 32.768 kHz
  • 2 x 10K resistencias
  • 7 resistencias por 10 ohmios
  • 1 x resistencia de 5.2 kΩ
  • 4 resistencias por 1 kOhm
  • 4 transistores KT315 (sus hermanos modernos)
  • Zumbador de 5 voltios
  • 2 botones de reloj (montaje en esquina)
  • 4 indicadores (10011-BSR) ánodo común
  • 47 microfaradio de tantalio
  • y toma de corriente y montaje en esquina (diámetro del orificio - 5.1 mm, diámetro del contacto central - 1.5 mm)

Y deje que la longitud de esta lista no le moleste, porque hemos estado ensamblando el dispositivo durante muchos años, ¡y debe ensamblarse al nivel adecuado!
Quien quiera mirar el tablero desde el otro lado, aquí hay una foto:

imagen

El programa


Como todos los dispositivos, un reloj necesita un programa. En este caso, el programa está escrito en BASIC en BASCOM AVR. Este lenguaje es muy conveniente para la programación, ya que el código es claro, eficiente y no ocupa mucho espacio en el microcontrolador. No comencé a escribir el programa desde cero, y tomé el código fuente de un artículo en el sitio con un soldador. Aquellos que estén interesados ​​encontrarán, solo dejo el código que finalicé aquí:

$regfile = "attiny2313.dat"
$crystal = 8000000

Dim Count As Byte
Dim Number(4) As Integer
Dim Pointmem As Byte
Dim Point As Bit
Dim Mine As Byte
Dim Hour As Byte
Dim Seco As Byte
Config Porta.1 = Output
Porta.1 = 1
Waitms 10
Porta.1 = 0
Waitms 70
Porta.1 = 1
Waitms 10
Porta.1 = 0
Config Portb = Output
Config Porta.0 = Output
Config Portd.2 = Output
Config Portd.3 = Output
Config Portd.6 = Output
Config Sda = Portd.5
Config Scl = Portd.4
Config Pind.0 = Input
Portd.0 = 1
Config Pind.1 = Input
Portd.1 = 1
Config Timer1 = Timer , Prescale = 64
On Timer1 Awake:
Config Timer0 = Timer , Prescale = 64
On Ovf0 Refresh
Dig1 Alias Porta.0 : Dig2 Alias Portd.2 : Dig3 Alias Portd.3 : Dig4 Alias Portd.6
Enable Interrupts
Enable Ovf0
Enable Timer1
Start Timer1

Hour = 0
Mine = 0

If Pind.1 = 0 And Pind.0 = 0 Then
Porta.1 = 1
Waitms 100
Porta.1 = 0
Hour = 0
Mine = 0
Seco = 1

Seco = Makebcd(seco)
I2cstart
I2cwbyte &HD0
I2cwbyte 0
I2cwbyte Seco
I2cstop

Mine = Makebcd(mine)
I2cstart
I2cwbyte &HD0
I2cwbyte 1
I2cwbyte Mine
I2cstop

Hour = Makebcd(hour)
I2cstart
I2cwbyte &HD0
I2cwbyte 2
I2cwbyte Hour
I2cstop
Waitms 1000
Porta.1 = 1
Waitms 10
Porta.1 = 0
End If

Do
I2cstart
I2cwbyte &HD0
I2cwbyte &H00
I2cstart
I2cwbyte &HD1
I2crbyte Seco , Ack
I2crbyte Mine , Ack
I2crbyte Hour , Nack
I2cstop
Seco = Makedec(seco)
Mine = Makedec(mine)
Hour = Makedec(hour)

If Seco = 80 Then
Seco = 10
Seco = Makebcd(seco)
I2cstart
I2cwbyte &HD0
I2cwbyte 0
I2cwbyte Seco
I2cstop
End If

If Hour > 9 Then
Number(1) = Hour / 10
Number(1) = Abs(number(1))
Else
Number(1) = 20
End If

Number(2) = Hour Mod 10

If Mine > 9 Then
Number(3) = Mine / 10
Number(3) = Abs(number(3))
Else
Number(3) = 0
End If

Number(4) = Mine Mod 10

If Pind.1 = 0 Then
Porta.1 = 1
Waitms 10
Porta.1 = 0
If Mine = 59 Then
Mine = 0
Else
Incr Mine
End If

Mine = Makebcd(mine)
I2cstart
I2cwbyte &HD0
I2cwbyte 1
I2cwbyte Mine
I2cstop
Else

If Pind.0 = 0 Then
Porta.1 = 1
Waitms 10
Porta.1 = 0
If Hour = 23 Then
Hour = 0
Else
Incr Hour
End If
Hour = Makebcd(hour)
I2cstart
I2cwbyte &HD0
I2cwbyte 2
I2cwbyte Hour
I2cstop
End If
End If

Waitms 250
Loop

Awake:
If Point = 1 Then
Porta.1 = 1
Waitus 10
Porta.1 = 0
End If
Toggle Point
Return

Refresh:
Reset Dig1 : Reset Dig2 : Reset Dig3 : Reset Dig4
Incr Count : If Count > 4 Then Count = 1
If Count = 2 And Point = 1 Then
Pointmem = Number(2) + 10
Portb = Lookup(pointmem , Digits)
Else
Portb = Lookup(number(count) , Digits)
End If
Select Case Count
Case 1 : Set Dig1
Case 2 : Set Dig2
Case 3 : Set Dig3
Case 4 : Set Dig4
End Select
Return

Digits:

Data &B00101000 , &B01111011 , &B00110100 , &B00110010 , &B01100011
Data &B10100010 , &B10100000 , &B00101011 , &B00100000 , &B00100010
Data &B00001000 , &B01011011 , &B00010100 , &B00010010 , &B01000011
Data &B10000010 , &B10000000 , &B00001011 , &B00000000 , &B00000010
Data &B11111111


Destellamos casi 2 kilobytes de código en micras y observamos cómo el dispositivo que acaba de cobrar vida ha comenzado a servir a la persona.
Para ser sincero, siento un placer increíble por el hecho de que puedo crear algo que está lejos y no está claro para muchos)
Parece un dispositivo sin estuche, haré el estuche después de escribir este artículo:

imagen

Y así, el reloj está listo, pero ¿cómo funciona? Esto lo demuestro en la primera mitad de este video (no solicito una suscripción ni nada más, solo el material)



Conclusión


Por lo tanto, en 2 días hice un dispositivo que me mostrará cuánto tengo que hacer una cosa y pasar a otra cuando sea hora de ir, o comenzar algo importante.
Bueno, eso es todo, gracias a aquellos que han leído hasta el final, el éxito en sus proyectos, y como dicen: "¡codigo, 47, y nos vemos en otras frecuencias! QRZ .. "

Source: https://habr.com/ru/post/es391005/


All Articles