الدافع
بادئ ذي بدء ، يعيش كل شخص في وقت ، للأسف ، لا يمكن إيقافه. وبما أننا نعيش في هذا العالم ، فلنقم بتتبع الوقت ولا نفوت دقيقة ، نضيعها. لهذا ، صنعت هذا الجهاز الرائع ، ودعا ساعة .
دعنا نبدأ!
الشمس تشرق في الشارع ، لقد رسمت لوحة دوائر وخدشها على ناسخة لطباعة الدائرة
، علاوة على ذلك ، أولئك الذين يعرفون كيف تصنع لوحات الدوائر سيفهمون أنني قمت بنقل الرسم بالحديد إلى القماش ، محفورا ، محفورا ، وما إلى ذلك ، وأولئك الذين لا يعرفون - اقرأ على الإنترنت عن تصنيع لوحات الدارات الكهربائية باستخدام طريقة LUT - (تقنية الكي بالليزر).لقد نسيت تصوير النتيجة ، ولكن أعتقد أن الجودة ستكون مرئية على اللوحة النهائية: يمكنك
رؤية الأماكن التي لم تظهر ، ولكن لم يحدث شيء سيئ ، إلا أن المكب متأخر.بعد ذلك ، كان من الضروري لحام المكونات ، والتي لن أتناولها بشكل خاص ، فقط اترك قائمة بها:- AtTiny2313 - متحكم 8 بت
- ds1307 - رقاقة مضادة بدقة جيدة
- كوارتز ساعة بتردد 32.768 كيلوهرتز
- مقاومات 2 × 10 ك
- 7 مقاومات لكل 10 أوم
- 1 × 5.2 كيلو أوم مقاومة
- 4 مقاومات لكل 1 كيلو أوم
- 4 ترانزستورات KT315 (إخوانهم المعاصرون)
- 5 فولت جرس
- 2 أزرار ساعة (تركيب الزاوية)
- 4 مؤشرات (10011-BSR) الأنود المشترك
- 47 ميكروفاراد التنتالوم
- ومقبس الطاقة وجبل الزاوية (قطر الفتحة - 5.1 مم ، قطر التلامس المركزي - 1.5 مم)
ودع طول هذه القائمة لا يزعجك ، لأننا نقوم بتجميع الجهاز لسنوات عديدة ، ويجب تجميعه على المستوى المناسب!من يريد أن ينظر إلى اللوحة من الجانب الآخر ، هذه صورة:
البرنامج
مثل جميع الأجهزة ، تحتاج الساعة إلى برنامج. في هذه الحالة ، البرنامج مكتوب بلغة BASIC في BASCOM AVR. هذه اللغة ملائمة جدًا للبرمجة ، لأن الشفرة واضحة وفعالة ولا تشغل مساحة كبيرة على وحدة التحكم الدقيقة. لم أبدأ في كتابة البرنامج من الصفر ، لكنني أخذت شفرة المصدر لمقال واحد على الموقع باستخدام حديد لحام. سيجد من يهمه الأمر أنني أترك الرمز الذي انتهيت منه هنا:$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 كيلوبايت من التعليمات البرمجية بالميكرون ونلاحظ كيف بدأ الجهاز الذي بدأ للتو في خدمة الشخص.لنكون صادقين ، أشعر بسرور لا يصدق في حقيقة أنه يمكنني إنشاء شيء بعيد وغير مفهوم للكثيرين)يبدو وكأنه جهاز بدون قضية ، سأفعل الحالة بعد كتابة هذا المقال:
وهكذا ، الساعة جاهزة ، ولكن كيف تعمل؟ هذا ما أظهرته في النصف الأول من هذا الفيديو (لا أطلب اشتراكًا أو أي شيء آخر ، فقط المادة)الخلاصة
وهكذا ، في يومين ، صنعت جهازًا سيوضح لي مقدار الوقت المتبقي للقيام بشيء ما والانتقال إلى شيء آخر عندما يحين الوقت للذهاب ، أو بدء شيء مهم.حسنًا ، هذا كل شيء ، بفضل أولئك الذين قرأوا حتى النهاية ، النجاح في مشاريعك ، وكما يقولون: "كود لك ، 47 ، ونراكم على ترددات أخرى! QRZ .. "