两天观看attiny2313和ds1307

动机


首先,每个人都生活在一个无法停止的时代。而且由于我们生活在这个世界上,所以让我们跟踪时间,不要错过一分钟,浪费它。为此,我做了一个很棒的设备,叫做手表
图片

让我们开始吧!


太阳在街上升起,我画了一个电路板,然后在复印机上刮擦以便印刷电路,

图片

此外,那些知道电路板制造方式的人会明白,我是用铁将图纸转移到织物上,蚀刻,镀锡等的,而那些不知道的人-在Internet上阅读有关通过LUT方法制造电路板的信息-(激光熨烫技术)。
我忘了拍摄结果了,但是我认为成品板上的质量是可见的:您

图片

可以看到没有出现问题的地方,但是没什么不好的事情,只有垃圾填埋场落后了。
接下来,有必要焊接这些组件,我将不作特别介绍,只列出它们的清单:
  • AtTiny2313-8位微控制器
  • ds1307-高精度计数器芯片
  • 时钟石英在32.768 kHz
  • 2个10K电阻
  • 每10欧姆7个电阻
  • 1个5.2kΩ电阻
  • 每1 kOhm 4个电阻
  • 4个晶体管KT315(他们的现代兄弟)
  • 5伏蜂鸣器
  • 2个时钟按钮(转角安装)
  • 4个指示器(10011-BSR)共阳极
  • 47钽微法拉
  • 和电源插座和转角安装(孔直径-5.1mm,中心触点直径-1.5mm)

并且不要让这份清单的长度困扰您,因为我们已经组装了多年的设备,并且应该以适当的水平进行组装!
谁想从另一侧看板,这是一张照片:

图片

程序


像所有设备一样,手表需要一个程序。在这种情况下,程序是用BASCOM AVR中的BASIC编写的。这种语言对于编程非常方便,因为代码清晰,高效并且在微控制器上不占用太多空间。我不是从头开始编写程序,而是在现场用烙铁拿了一篇文章的源代码。那些有兴趣的人会发现,我只剩下在这里完成的代码:

$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


我们以微米为单位刷新了将近2 KB的代码,并观察了刚刚诞生的设备如何开始为人们服务。
老实说,我创造了一件难以理解的东西,这让我感到无比的高兴。
这看起来像是没有表壳的设备,在写完这篇文章后,我将做一个案例:

图片

手表已经准备好了,但是它是如何工作的呢?我在本视频的上半部分对此进行了演示(我不要求订阅或其他任何东西,只是材料)



结论


因此,在两天内,我制作了一个设备,可以告诉我剩下的事情要做一件事情,而当需要去做或开始一些重要的事情时,又可以继续前进。
好了,这就是多亏了那些读完本书的人,他们在项目中取得了成功,正如他们所说:“给您47岁的鳕鱼,并以其他频率与您见面!QRZ ..“

Source: https://habr.com/ru/post/zh-CN391005/


All Articles