
KDPV "أوه ، هذا كل شيء."
هناك احتمال ضئيل في أن يصبح هذا الخط الطويل مصدرًا مفعمًا بالحكمة للمثقفين ، ومتطورًا في أسرار العرافة على بطاقات كارنو ومعرفة المعنى السري للنموذج العادي الثالث. ولكن إذا كنت قد لمست لمستك اردوينو بيديك ، لسبب ما ، فإن المكواة الملحومة تجمع الغبار في المخزن ، فأنت تفهم سبب احتواء البطارية على واحد زائد ، بينما تحتوي C ++ على اثنتين ، فلن تتركك المعجزات السحرية والمذهلة حقًا غير مبالية. لذلك ، يسعدني أن أوصيكم بأرقام أداء اليوم للسيرك المتشرد "Saman with Boxwood" :
- مضيفا RAM و ROM إلى ATtiny13!
- الذكاء الاصطناعي في المعالج الدقيق - المؤيد وكونترا ، أو الجمال النائم - حسنا ، هل هي ليست أحمق؟
- أم أنها لا تزال dura lex sed lex؟
- كيفية إضافة الساقين إلى ATtiny13؟
- بضع كلمات عن البعد الخامس: كيفية حشر ما لا يطاق؟
- نشر في نصف غير العذارى مع خلط محتويات نصفي (مع ضمان الانتعاش).
- "إطعام المنكوبين" (انظر الحالة السابقة لخمسة آلاف شخص يتم تشبعهم مع خمسة أرغفة من الشعير وسمكتين).
إذا كانت إحدى الحيل على الأقل في متناول يدي كل قارئ عشرين في المستقبل ، فسوف أكون راضيًا عن ذلك ، فالمقال مكتوبًا بلا جدوى.
أول إشارة مرور أو Kaa تأخذ المعركة.
بدأت القصة ، كما هو الحال في شريط فيديو كلاسيكي لعيد الميلاد قبل الميلاد ، عندما تنظر الكاميرا عبر نافذة متجمدة إلى غرفة صغيرة مريحة: شجرة عيد الميلاد في بهرج ، صوف من القطن ولعب ، ورائحة اليوسفي والنبيذ المهدور ، وصدفة دافئة من ظلال الشموع. على الأريكة الكبيرة ، تقوم بتصويب منقوشة وتضغط برفق على خده ، وتستمع بذهول إلى الفتاة الصغيرة التي تشبه الملاك بحماس ...
أولئك الذين لديهم خبرة أبوية يعرفون تمام المعرفة ما الذي يمكن أن تسمعه بالضبط في هذه اللحظة. سأشرح لأولئك الذين لم يكتسبوا بعد مثل هذه المهارة - مع درجة عالية من الاحتمال ، أصبح الآباء الآن مصيرين إلى شيء مثل: "أبي! نحن غدا! إلى رياض الأطفال! يجب علي! جلب الحرف في مسابقة شجرة عيد الميلاد! وأريد المكان الأول! "
إنه ضروري. غدا لنا الحرف اليدوية. الأفضل.
توضح المقابلة التي تمت مع العميل حدود بيان العمل: نحن بحاجة إلى إشارة مرور. ولكي تكون جميلة وتوهج مثل حقيقي. بالفعل في هذه المرحلة ، تتناقص أعداد المرشحين لمشروع ISU بشكل دراماتيكي: الأب غير قادر على إثبات فكرة أن الإشارة الضوئية الجميلة أو الناعمة أو المرقعة أو المحبوكة أو الكروشيهية تمثل تجسيدًا لأحلام العميل: يجب أن تكون إشارات المرور غير واضحة؟
تدحرجت الليلة فوق البلاد وبدأ العمل يغلي في بلدنا.
مادة جسم إشارات المرور عبارة عن غلاف ورق تواليت مضغوط لتشكيل صندوق. كانت العملة ذات العشرة روبل محاطة بقلم رصاص ، ثم تم قطع الثقوب بسكين من رجال الدين تحت أضواء المنبه الضوئي (لا يثق الأطفال في العمل المؤلم).

يتم قطع أغطية الجزء العلوي والسفلي من إشارة المرور من الورق المقوى في مكانه. كانت القمم فوق المصابيح وفقًا للنمط المصنوع ، محاطة بدائرة على الورق العادي 80 غراماً وتم قطعها يدويًا.

ثم تم لصقها على PVA.

تم سحب الهياكل المجمعة في الفناء ورسمت بطلاء من رذاذ الأكريليك: فضي بسخاء ، ثم أسود قليلاً في الأعلى.

في حالة حدوث ضرر في أي مرحلة ، تم عمل ثلاث نسخ مرة واحدة. تم لصق ثلاث شرائح من الورق الملون - الأحمر والأصفر والأخضر - مع مرشحات الضوء داخل الأكثر نجاحًا.
تم تحديد التمييز من الداخل بواسطة زوج من المصابيح البيضاء فائقة السطوع من سلال الوطن السخية (SHZR). رفض الضفدع Kaptershchitskaya بشكل قاطع أن يقدم إلى والد وجود ثلاث بطاريات ليثيوم اللوحية SCHR ، ولم توافق المصابيح على تألق من واحدة ، مشيرا إلى أنها كانت بيضاء ومشرقة ، وكان انخفاض الجهد عليها من 2.8 إلى 3.9 فولت. كان الحد الأقصى الذي تمكنا من المساومة مع العلجوم هو بطارية AA واحدة ، حلقة الفريت من خنق اللوحة الأم المحروقة والترانزستور KT315. التفكير والغوغل ، وكان أبي لقبول العرض. وبالنظر إلى عدد الأقلام المرحة في كل مجموعة من رياض الأطفال ، لم تكن فكرة بطاريات الليثيوم جذابة للغاية.
استبدلت أجسام إشارات المرور على البطارية رائحة الإبر واليوسفيون برائحة قاسية من الطلاء ، فدخن والدي بعمق مكواة لحام على الصنوبري ، وجرح الأطفال محولات لمنع المولدات (نسخ من النسخ) ، كل شيء سار وفقًا للخطة ...
ولا ، "فجأة" لم تحدث تلك الليلة: كل الحيل عند لف المحول هي أن تقوم على الفور بتصفية أكبر عدد ممكن من المنعطفات باستخدام سلك مضاعف. لا تخلط بين الأنود والكاثود في الصمام ومحطات الترانزستور KT315 وتوصيل نهايات اللفات بشكل صحيح (أو تبديلها إن لم يكن مضاءة) وفقا لمخطط الدائرة. J1 - مفتاح الطاقة من وصلة كمبيوتر ، يتم عرضه لاحقًا "على السطح" لإشارة المرور.
منذ فترة طويلة معروفة على نطاق واسع دائرة بسيطة تماما لإنتاج الجهد المتردد مع قمم 3-7V من بطارية 1.5V G1.

جسديا ، يتم تضمين مخطط الدائرة على النحو التالي:

الشريط الأحمر لديه بطارية قلوية AA.
وإشارة المرور نفسها هي من هذا القبيل.

في الصباح ، قام الطفل الفخور بسحب المنتج إلى روضة الأطفال ، حيث صنعت اللعبة دفقة واحتلت مركز الصدارة على شجرة الكريسماس.

صحيح ، لم ينجح الأمر مع المركز الأول في المسابقة - كان الموعد النهائي لتقديم المشاركات ، كما اتضح ، قبل عدة أيام.
في المنزل ، كان هناك مبنيين على عتبة النافذة وعدم رضا أبي الحكي عن حل مهمة "أريدها كإشارة مرور حقيقية". وكانت الفكرة تدور "هل من الممكن أن نلائم حلاً كاملاً ، في الشيء الثالث عشر ، أن الضفدع كان يرقد في ShchZR لفترة طويلة؟ هل سيكون هناك ما يكفي من خمسة أرجل ، كيلوبايت للرمز و 64 بايت من ذاكرة الوصول العشوائي وهذا ، كما هو مطلوب ، مثل الحل الحقيقي؟"
لذلك كل هذا كان مجرد قول ، قصة خرافية حول الحل النهائي لقضية إشارة المرور المقبلة.
إشارة المرور الثانية ، مثل واحدة حقيقية
تستخدم الأدوات والمواد والوثائق
اللغة / الإطار : C / Arduino 1.6 / 1.8.
IDE : MS Visual Studio 2012 + البرنامج المساعد Visual Micro + git.
كندي : DipTrace.
HW : ATtiny13 MK ، استنساخ Arduino Nano على ATmega328 ، USB-UART على FT232R ، مبرمج USBISP بدون اسم الصين.
تكنولوجيا PP : LUT .
الأدوات : حام الحديد ، مسدس الغراء ، فرن المطبخ ، السكين ، المقص ، قواطع الأسلاك.
المواد : من ShchZR - 4 مصابيح LED للإخراج باللون الأحمر والأصفر والأخضر من علامة تجارية بدون اسم ، ومكثف التنتالوم SMD وزوج من المقاومات 0805 لكل 10 كيلو ، نصف دزينة من المخرجات ذات 0.25W مقاوم للتيار الحالي ، MF-25 ، ومحول DC-DC صيني ذو خطوات مضاعفة مع الطلاء الفضي والأسود ، ورقة A4 ، طين البوليمر من البيع.
تتوفر المصادر والوثائق على Github بموجب ترخيص MIT ، تلتزم التعليمات البرمجية المصدر بتكرار البرنامج الثابت الموضح أدناه ، جميع مسارات الملفات المذكورة مرتبطة بجذر المستودع.
الوثائق :
./docs/ATtiny13A datasheet.pdf [مواصفات MK Atmel ATtiny13A]
./docs/ATmega328 datasheet.pdf [مواصفات Atmel ATmega328 MK]
./docs/AVR4027 - نصائح وحيل لتحسين شفرة C الخاصة بك. pdf [Atmel AVR4027: نصائح وحيل لتحسين شفرة C الخاصة بك لميكروكنترولر AVR 8 بت]
./docs/AVR4013 - PicoPower basics.pdf [ملاحظات عن أوضاع توفير الطاقة]
من اردوينو IDE ، مثل بطانية من السحابة. الحذق هو السخرية اليسوعية الخفية لكل ما يمكن أن يكون مقدسًا بين المبرمجين المضمنين. لكن Arduino ، كنظام بيئي ، عاش ، سيعيش وسيعيش ، وبسبب بساطة تثبيت البيئة على أجهزة الكمبيوتر تحت أنظمة تشغيل مختلفة ، ولأنهم كانوا أول من تمكن ، دون أي نفقات خاصة لمصحح أخطاء الأجهزة ، باستخدام بنس UART ومحمل الإقلاع الخاص ، التنمية في MK حشو خطيرة إلى حد ما. وهنا العم لياو ، مستعد لبيع حفنة من الحيوانات المستنسخة بسعر نسخة أصلية واحدة. حقيقة أنه في كبار Atmegs يمكنك تصحيح منطق وتشغيل البرنامج ، وبعد ذلك مع الحد الأدنى من التغييرات لنقلها إلى tinka نفسه - وهذا أيضا حجة.
إنه أمر طبيعي ومريح بالنسبة لي أن أعمل في MS VisualStudio ، وليس لدي مساحة كبيرة لـ AtmelStudio أو WinAVR ولا أريد أن أجدها ، بدون مصحح أخطاء في الأجهزة ، ليست لديهما وسائل الراحة النهائية. حول المكون الإضافي VisualMicro ، الذي يضيف دعم Arduino إلى MS VisualStudio ، تمت كتابته بالفعل بتفاصيل كافية وتم كتابته بذكاء في Haber.
تم أيضًا التركيز على "Arduino على ATtiny13" على المحور منذ فترة طويلة وبشكل متكرر .
باختصار ، أضف وحدة MicroCore إلى التثبيت المثبت لبيئة Arduino ، وبعد ذلك يصبح من الممكن اختيار ATtiny13 MK في البطاقات المستهدفة.

بوابة - لا بديل لأي ، حتى أكثر المشاريع المنزلية. العادة بسيطة ولكنها صحيحة: عند بدء العمل في أي برنامج ، ببساطة اكتب "git init" في الدليل في سطر الأوامر. سيوفر الدعم المدمج في MS Visual Studio لالتزامات في المستودع المحلي الوقت والوقت أكثر من مرة.
DipTrace ، مثل CAD للدارات ولوحة الدارات المطبوعة ، مريحة ، محلية ، والدائرة والأسلاك سهلة الاستخدام ، فمن السهل إضافة مكونات مخصصة (UGO ، جهات اتصال) ، إذا رغبت في ذلك ، يمكن أن تكون لوحة الدوائر المطبوعة مع مكونات ملتوية في 3D ، يتم تضمين دروس مساعدة عالية الجودة والتدريب. بالإضافة إلى ذلك ، أُعجبت بسياسة الترخيص الخاصة بهم: قيود الترخيص القياسي غير الربحي (1000 دبابيس ، 4 طبقات إشارة) ، مجانًا لروسيا وأوكرانيا وجمهورية بيلاروسيا ، في 99٪ من الحالات تكفي للحرف اليدوية المنزلية.
لم أتمكن من جعل Arduino Nano يعمل بشكل صحيح ، كمبرمج حلو ، ولكن مع مبرمج USB ISP ، يتم حل المشكلة بسهولة. رسم سريع للملفات الدفعية للتجميع / البرامج الثابتة - في الدليل ./gcc في المشروع.
يمكن تصنيف ملف .ino (في الواقع هو C / C ++) بشكل صحيح في الاستوديو "ضمن arduino ضمن ATtiny13" ، يتم تقديمه ببساطة بواسطة معلمة ملف الدُفعات هذا في سطر الأوامر:
>"./gcc/0_MAKE & upload.cmd" MyArduinoFile.ino
ISP , , .
>"./gcc/0_MAKE & asm.cmd" MyArduinoFile.ino
, , — , AVR . : , .
Upgrade ROM&RAM Arduino ATtiny13
Arduino ( setup(){...}; loop(){...};) "" - int main(){setup(); loop();}, by Arduino.
uint8_t cnt;
void setup() {
cnt=0;
}
void loop() {
cnt++;
}
//Program size: 164 bytes (used 16% of a 1 024 byte maximum) (0,57 secs)
//Minimum Memory Usage: 5 bytes (8% of a 64 byte maximum)
, :
uint8_t cnt;
int main(){
cnt=0; // < setup()
while(1){
cnt++; // < loop()
}
}
//Program size: 60 bytes (used 6% of a 1 024 byte maximum) (1,23 secs)
//Minimum Memory Usage: 1 bytes (2% of a 64 byte maximum)
16% 6% , , 6% . , — 64 .
, , : . , , , , . , , , . , : CPU , . — , N . ""-CPU , (9.6 / 1024 = 9370 , ) 1/9370 = 0.0001067 . 8- . , , , " ". , , , "". 37 (256 0.0001067 = 0.027315; 0.027315 37 = 1.01065 ~= 1s).
: - (HW , 1024 ), 8 — , , .
: globalTimer volatile, , , , CPU , .
#include <avr/io.h> // IDE -
#include <avr/sleep.h> // ,
#include <avr/interrupt.h> //
volatile uint16_t globalTimer; // 64
// - globalTimer 1/37
ISR(TIM0_OVF_vect){
globalTimer++; // . , , while(1) .
}
int main() {
// " -".
set_sleep_mode(SLEEP_MODE_IDLE); // - .
sleep_enable(); //
TCCR0B = _BV(CS02) | _BV(CS00); // 0 - clock frequency / 1024
TIMSK0 |= _BV(TOIE0); // overflow interrupt
sei(); //
while(1){
//.........
sleep_cpu(); // - .
}
}
//Program size: 128 bytes (used 13% of a 1 024 byte maximum) (0,86 secs)
//Minimum Memory Usage: 2 bytes (3% of a 64 byte maximum)
" 4 : , , "()
, , .
, , CPU, / / . GPIO.
Arduino : Arduino pin_number ( ):
pinMode(pin_number, OUTPUT); // INPUT -
/ , — .
Value = digitalRead(pin_input_number); //Value - HIGH LOW (1 0)
digitalWrite(pin_outpit_number, Value); // pin_outpit_number - HIGH LOW
"" , Wiring , , Arduino ( ) ( ) ( ) ( ).

.. Arduino 7 11 PD7 — D.
digitalRead, digitalWrite, pinMode .., , , , Wiring- , .
— , . , DIHALT .

- (GPIO) , 8- — 8 . , 6 (. ATtiny13 pinout, ), PB0 PB5, PB5 — MK . - : ( "B") DDRB, PINB PORTB. — , , . PB0, PB1, PB2, PB3, PB4, PB5 — B. #include <avr/io.h> ( iotn13.h ), (PB0 0,..., PB5 — 5) IDE, Arduino.
: , , . , - , , , DDRx GPIO , — . PORTx — , "- ", , — , PINx. , 50 0 1. , .
,PB2 HIGH, +5, PB3 LOW, 0, PB0 , — .
DDRB , PB0, ( ) = 0 (PB0 ), = 1 (PB2, PB3 — ), .. 110, — , 1 0 — .
DDRB = 12; // 000001100 - 12
// (!)
// pinMode().
— PORTB , =1 (PB2 HIGH), — (PB3 LOW), — , 01
PORTB = 8; //(dec)8 === (bin)000001000
// - .
PINB, , — .
, — .
3 (PB3) : 1 , 3 .
3<<00000001 === PB3<<1 // — 00001000
, _BV(x), (x<<1), .. _BV(PB3) — 1.
_BV(PB3) | _BV(PB2) 00001100 (| — ).
: , , .
PORTB |= _BV(PB3) | _BV(PB2); // 2 3 == 1, PB2 PB3 HIGH, PORTB
0 , , . 0 1 . , , 1 , 0 — 0 .
PORTB &= ~(_BV(PB3) | _BV(PB2)); // PORTB 2 3 - , LOW, .
HW , - 0, Timer0. GPIO, , , datasheet ATtiny13, - -, Ilya Ananev - 0 ATmega328.
, , .
TCCR0B = _BV(CS02) | _BV(CS00); // CS02 CS00 1 - 0 = clock frequency / 1024
TIMSK0 |= _BV(TOIE0); // TOIE0 1 - TIM0_OVF
// TIMSK0 = _BV(TOIE0);
.
, . , , . - , , , (!) .
, . " 27.02.13" 7 52289-2004 , .
( ): , , , , , .
"* " " 2 , — 3 .
3 1 /.*"
, ( , / — PERIOD_0 PERIOD_4, — ).
#define ONE_SECOND 37 // 1
#define QT_SECOND 9 //
#define PERIOD_FLASH_GREEN QT_SECOND // ( ) -
#define PERIOD_FLASH_YELLOW ONE_SECOND * 1 // - -
// ---
#define PERIOD_0 ONE_SECOND * 10 //R G R G 0. --- (10 )
#define PERIOD_1 ONE_SECOND * 3 //R g R g 1. --- (3 )
#define PERIOD_2 ONE_SECOND * 1 //R Y R Y 2. --- (1 )
#define PERIOD_3 ONE_SECOND * 2 //RY Y RY Y 3. + --- (2 )
#define PERIOD_4 ONE_SECOND * 7 //G R G R 4. --- (7 )
#define PERIOD_5 ONE_SECOND * 3 //g R g R 5. --- (3 )
#define PERIOD_6 ONE_SECOND * 1 //Y R Y R 6. --- (1 )
#define PERIOD_7 ONE_SECOND * 2 //Y RY Y RY 7. --- + (2 )
, , .
typedef struct{
const uint8_t ddr_val_0; // DDRB value -
const uint8_t port_val_0; // PORTB value -
const uint8_t ddr_val_1; // DDRB value - "",
const uint8_t port_val_1; // PORTB value -
const uint16_t flash_period; // period of flashing - _val_1 _val_0
const uint16_t signal_period; // period of this lighting state
}lightSignalization; // , _0 _1 - , flash_long -
// flash_period == 0, , _val_0.
// signal_period == 0, .
, 128 — , .
ATtiny13 ( ?) -
, , - - , : 6 . - denvo " ? RESET" 5- , , , , - .
- : --, .. , 7 .
— , , , 8, ?
, -, "reset", PB5, .
, ? , , , . , , , , , .
, , 8 9 - , 8 — . , -, , , , .
— .
: — . .
:

1 PORTB |= _BV(GREEN_PIN) — ( ) , 0 .. PORTB &= ~(_BV(GREEN_PIN)) — ( ).
, , ?
(DDRB |= _BV(GREEN_PIN)) , DDRB &= ~(_BV(GREEN_PIN)), GREEN_PIN Hi-Z . (2.2 * 4) 5, .
.
— .. , , .
, ,, . , — , 37/2=18 , , . :
) , , , , ;
) — , " " 4 ;
) , 4 ( PERIOD_2->PERIOD_3 PERIOD_6->PERIOD_7);
) 4 .
.

// PINB === 0 0 0 g r y0 btt y1
#define RED_PIN PB3 // OUT: 1 - "-" , 0 - "-" , IN - , , (!)
#define YELLOW0_PIN PB2 // OUT: 1 - "-"
#define YELLOW1_PIN PB0 // OUT: 1 - "-"
#define GREEN_PIN PB4 // OUT: 1 - "-" , 0 - "-" , IN - , , (!)
#define RED _BV(RED_PIN) // _BV - (), 1<<VALUE
#define YELL0 _BV(YELLOW0_PIN) // -
#define YELL1 _BV(YELLOW1_PIN)
#define GREEN _BV(GREEN_PIN) // - ( 0 - -) DDRB.GreenPin=1
— . , , — , .
#define BUTTON_PIN PB1
#define BUTTON_ON !(PINB & _BV(BUTTON_PIN)) //( (PINB & _BV(BUTTON_PIN)) == 0) // " " - LOW
#define BUTTON_OFF (PINB & _BV(BUTTON_PIN)) // " " - HIGH, ( )
, , n ( ) n(n−1) = n²−n . 4 12 , . « , » « , » .
*** — , DDRx|PORTx, , .. . — , , .
.***
: ?
lightSignalization. lightSignalization . 0 7 , 8 — , 9 — , "" . , 0 7, . , , . 3 ( 0 7) 8 -- . if- , . , .
lightSignalization traffic_signals[] = {//
// {DDRB0, PORTB0, DDRB_when_flashingif, PORTB_when_flasingif (if flashing), continous of half-period flashing, continous curr mode runing}
{RED|GREEN, RED, 0, 0, 0, PERIOD_0}, // R G R G
{RED, RED, RED|GREEN, RED, QT_SECOND, PERIOD_1}, // R g R g - flash east green
{RED|YELL1, RED|YELL1, 0, 0, 0, PERIOD_2 }, // R Y1 R Y1
{RED|YELL0|YELL1, RED|YELL0|YELL1, 0, 0, 0, PERIOD_3 }, // RY0 Y1 RY0 Y1
{RED|GREEN, GREEN, 0, 0, 0, PERIOD_4}, // G R G R
{RED|GREEN, GREEN, RED, 0, QT_SECOND, PERIOD_5 }, // g R g R - flash nord green
{RED|YELL0, YELL0, 0, 0, 0, PERIOD_6}, // Y0 R Y0 R
{RED|YELL0|YELL1, YELL0|YELL1, 0, 0, 0, PERIOD_7 }, // Y0 RY1 Y0 RY1
{YELL0|YELL1, YELL0|YELL1, YELL0|YELL1, 0, ONE_SECOND, 0}, // y0 y1 y0 y1 - flash yellows lights
{0, 0, 0, 0, 0, 0} // traffic lights off, DDR in, Hi-Z
};
// lightSignalization traffic_signals[]
#define LIGHT_NUM_YELLOW_FLASH 8 // - - flash yellows lights
#define LIGHT_NUM_STD_START 0 //
#define LIGHT_NUM_LIGHTS_OFF 9 // - - traffic lights off
lightSignalization 8 . .. traffic_signals[] 10 80 (, 64 , 2 ). , .
, , , — ROM, , RAM , .
-
const lightSignalization traffic_signals[] PROGMEM= {...
,
<avr/pgmspace.h> pgm_read_byte_near() pgm_read_word_near()
char shortint .
3 .
, .
traffic_signals[] — LIGHT_NUM_LIGHTS_OFF
{0, 0, 0, 0, 0, 0} // traffic lights off
— lightSignalization , — , lightSignalization.signal_period==0 (.. ), lightSignalization.flash_period==0, .. .
, .
traffic_signals[] — LIGHT_NUM_YELLOW_FLASH
{YELL0|YELL1, YELL0|YELL1, YELL0|YELL1, 0, ONE_SECOND, 0}, // y0 y1 y0 y1 — flash yellows lights
: lightSignalization.signal_period==0. lightSignalization.flash_period=ONE_SECOND, :
DDRB = YELL0|YELL1; // YELL0, YELL1 -
PORTB = YELL0|YELL1; // YELL0, YELL1 = HIGH -
DDRB = YELL0|YELL1; // // YELL0, YELL1 -
PORTB = 0; // YELL0, YELL1 = LOW -
, --.
, .
traffic_signals[] — LIGHT_NUM_STD_START
{RED|GREEN, RED, 0, 0, 0, PERIOD_0}, // R G R G
: lightSignalization.flash_period==0.
DDRB = RED|GREEN; //RED GREEN — , .
PORTB = RED; // RED — HIGH (- )
// GREEN — LOW ( , - — )
lightSignalization.signal_period==PERIOD_0, .
current_signal. 2 — , lightSignalization.
uint8_t current_signal; // 1 , traffic_signals
uint16_t tl_flash_end; // 2 ( !0),
uint16_t tl_signal_end; // 2 ( !0)
tl_signal_end != 0, globalTimer>tl_signal_end current_signal. 0 current_signal, 3, .
current_signal = current_signal & B00000111;
current_signal &= LIGHT_NUM_STD_MASK ; //current_signal & B00000111;
current_signal , 0 7.
globalTimer — .
#include <limits.h> // USHRT_MAX
#include <avr/sleep.h> // ,
#include <avr/interrupt.h> //
#include <avr/pgmspace.h> //
#define ONE_SECOND 37 // 1
#define QT_SECOND 9 //
#define MAX_GLOBAL_TIMER_VALUE (USHRT_MAX / 2) // uint16_t globalTimer - . 65535 /2
// , MAX_GLOBAL_TIMER_VALUE - 1
#define PERIOD_FLASH_GREEN QT_SECOND // ( ) -
#define PERIOD_FLASH_YELLOW ONE_SECOND * 1 // - -
// ---
#define PERIOD_0 ONE_SECOND * 10 //R G R G 0. --- (15 )
#define PERIOD_1 ONE_SECOND * 3 //R g R g 1. --- (3 )
#define PERIOD_2 ONE_SECOND * 1 //R Y R Y 2. --- (1 )
#define PERIOD_3 ONE_SECOND * 2 //RY Y RY Y 3. + --- (2 )
#define PERIOD_4 ONE_SECOND * 7 //G R G R 4. --- (10 )
#define PERIOD_5 ONE_SECOND * 3 //g R g R 5. --- (3 )
#define PERIOD_6 ONE_SECOND * 1 //Y R Y R 6. --- (1 )
#define PERIOD_7 ONE_SECOND * 2 //Y RY Y RY 7. --- + (2 )
typedef struct{
const uint8_t ddr_val_0; // DDRB value
const uint8_t port_val_0; // PORTB value
const uint8_t ddr_val_1; // DDRB value
const uint8_t port_val_1; // PORTB value
const uint16_t flash_period; // period of flashing - _val_1 _val_0
const uint16_t signal_period; // period of this lighting state
}lightSignalization; // , _0 _1 - , flash_long -
// (PINS === 0 0 0 g r y0 btt y1):
// ""
#define BUTTON PB1
#define RED_PIN PB3 // OUT: 1 - "-" , 0 - "-" , IN - , , (!)
#define YELLOW0_PIN PB2 // OUT: 1 - "-"
#define YELLOW1_PIN PB0 // OUT: 1 - "-"
#define GREEN_PIN PB4 // OUT: 1 - "-" , 0 - "-" , IN - , , (!)
#define BUTTON_ON !(PINB & _BV(BUTTON)) //( (PINB & _BV(BUTTON)) == 0) // " "
#define BUTTON_OFF (PINB & _BV(BUTTON)) // ~(PINB & _BV(BUTTON)) -\\- " "
#define RED _BV(RED_PIN) // _BV - (), 1<<VALUE
#define YELL0 _BV(YELLOW0_PIN) //
#define YELL1 _BV(YELLOW1_PIN)
#define GREEN _BV(GREEN_PIN)
// lightSignalization traffic_signals[]
#define LIGHT_NUM_YELLOW_FLASH 8 // - - flash yellows lights
#define LIGHT_NUM_STD_START 0 //
#define LIGHT_NUM_LIGHTS_OFF 9 // - - traffic lights off
#define LIGHT_NUM_STD_MASK 7 // ___++ &LIGHT_NUM_STD_MASK - 0 7
//....................................
//
const lightSignalization traffic_signals[] PROGMEM= { // , , -, PINS === 0 0 0 g r y0 btt y1
// {DDRB0, PORTB0, DDRB_flashing, PORTB_flasinf (if flashing), continuous of half-period flashing, continuous id mode running}
{RED|GREEN, RED, 0, 0, 0, PERIOD_0}, // R G R G
{RED, RED, RED|GREEN, RED, QT_SECOND, PERIOD_1}, // R g R g - flash east green
{RED|YELL1, RED|YELL1, 0, 0, 0, PERIOD_2 }, // R Y1 R Y1
{RED|YELL0|YELL1, RED|YELL0|YELL1, 0, 0, 0, PERIOD_3 }, // RY0 Y1 RY0 Y1
{RED|GREEN, GREEN, 0, 0, 0, PERIOD_4}, // G R G R
{RED|GREEN, GREEN, RED, 0, QT_SECOND, PERIOD_5 }, // g R g R - flash nord green
{RED|YELL0, YELL0, 0, 0, 0, PERIOD_6}, // Y0 R Y0 R
{RED|YELL0|YELL1, YELL0|YELL1, 0, 0, 0, PERIOD_7 }, // Y0 RY1 Y0 RY1
{YELL0|YELL1, YELL0|YELL1, YELL0|YELL1, 0, ONE_SECOND, 0}, // y0 y1 y0 y1 - flash yellows lights
{0, 0, 0, 0, 0, 0} // traffic lights off,
};
volatile uint16_t globalTimer; // 64
uint8_t current_signal; // 1 , traffic_signals
uint16_t tl_flash_end; // 2 ( !0),
uint16_t tl_signal_end; // 2 ( !0)
//....................................
void setPeriods(uint8_t num, bool set_both_flash_and_signal); // tl_flash_end, tl_signal_end
void setPorts(uint8_t num, bool use_main_values); //
//....................................
//
// - globalTimer 1/37
ISR(TIM0_OVF_vect){
globalTimer++; // . , while(1) .
}
int main() {
//
bool use_main_values = true; // lightSignalization._val_0 (1) lightSignalization._val_1 (0)? -
current_signal = LIGHT_NUM_STD_START; // . .
// " -".
set_sleep_mode(SLEEP_MODE_IDLE); // - .
sleep_enable(); //
TCCR0B = _BV(CS02) | _BV(CS00); // 0 - clock frequency / 1024
TIMSK0 |= _BV(TOIE0); // overflow interrupt
sei(); //
while(1){
// ?
if(globalTimer > MAX_GLOBAL_TIMER_VALUE){
globalTimer -= MAX_GLOBAL_TIMER_VALUE; //
//
if(tl_flash_end){
tl_flash_end -= MAX_GLOBAL_TIMER_VALUE; // ,
}
if(tl_signal_end){
tl_signal_end -= MAX_GLOBAL_TIMER_VALUE; // // ,
}
// setPeriods(currentMode, false); // 12 , tl_.._end ,
}
// (tl_flash_end !=0 )
if(tl_flash_end){
//
if(globalTimer > tl_flash_end){
use_main_values = !use_main_values; // !use_main_values - ))
setPorts(current_signal, use_main_values); //
setPeriods(current_signal, false); // ,
}
}
// - operating_std - --
if(tl_signal_end){
// (use_main_values - - )
if((globalTimer > tl_signal_end) && use_main_values){
current_signal ++; //
current_signal &= LIGHT_NUM_STD_MASK; // 3-, 0 7
use_main_values = true; // -
setPorts(current_signal, use_main_values); //
setPeriods(current_signal, true); //
}
}
sleep_cpu(); // - .
}
}
//
void setPorts(uint8_t num, bool use_main_values){
uint8_t val;
DDRB = 0; PORTB = 0;
// () - ddr_val_0, else = ddr_val_1
// val = (use_main_values) ? pgm_read_byte_near(&(traffic_signals[num].ddr_val_0))
// : pgm_read_byte_near(&(traffic_signals[num].ddr_val_1));
// , , , , , 14 (!!!) .
val = pgm_read_byte_near(&(traffic_signals[num].ddr_val_0)+( (use_main_values) ? 0 : 2) );
val &= ~_BV(BUTTON); // -
DDRB = val; //
val = (use_main_values) ? pgm_read_byte_near(&(traffic_signals[num].port_val_0))
: pgm_read_byte_near(&(traffic_signals[num].port_val_1));
val|= _BV(BUTTON); // - -
PORTB = val; //
}
// (
void setPeriods(uint8_t num, bool set_both_flash_and_signal){
//
tl_flash_end = pgm_read_word_near (&(traffic_signals[num].flash_period)); //
tl_flash_end = (tl_flash_end)? tl_flash_end + globalTimer : 0; // -
//if(tl_flash_end){ tl_flash_end += globalTimer; } <- 8
// -
if(set_both_flash_and_signal){
tl_signal_end = pgm_read_word_near(&(traffic_signals[num].signal_period));
tl_signal_end = (tl_signal_end)? tl_signal_end + globalTimer : 0; // ,
}
}
//Program size: 610 bytes (used 60% of a 1 024 byte maximum) (0,58 secs)
//Minimum Memory Usage: 7 bytes (11% of a 64 byte maximum)
, . — btn_cnt ( ), ( ) .
#define PERIOD_PRESS_BUTTON_SHORT QT_SECOND // -
#define PERIOD_PRESS_BUTTON_LONG QT_SECOND*6 // - /
uint8_t scan_button_cnt; //
//
if(BUTTON_ON){
if(scan_button_cnt<USHRT_MAX){
scan_button_cnt++; // 1/37
}
if(scan_button_cnt > PERIOD_PRESS_BUTTON_SHORT){
// ,
}
if(scan_button_cnt > PERIOD_PRESS_BUTTON_LONG){
//
}
}
— .

SLEEP_MODE_IDLE ( CPU), PwrDown SLEEP_MODE_PWR_DOWN — watchdog INT0, , — INT0.

. 7.Power management and sleep modes ATtiny13 , 5-10 , .
8- , — 2 .
// uint8_t f_button_state_flags; //
// MODES: wakeup 11 -> work 00 -> tosleep 01 -> pwrdown 11 -> wakeup 11
#define MODE_LBIT 0
#define MODE_HBIT 1
#define FORCE_SET_NEW_SIGNAL_BIT 2 // current_signal
// 3
#define LIGHT_SIGNAL_ALT_MODE_BIT 4 // =0 (--) =1 ( )
#define USE_FIRST_VALUES_LIGHT_BIT 5 // - lightSignalization
#define SHORT_PRESS_FLAG_BIT 6 // , 1
#define LONG_PRESS_FLAG_BIT 7 // , 1
, — , — CPU . , if-.
#include <limits.h> // USHRT_MAX
#include <avr/io.h> // IDE
#include <avr/sleep.h> // ,
#include <avr/interrupt.h> //
#include <avr/pgmspace.h> //
#ifdef GIMSK // ATtiny13 -
#define F_CPU 9600000UL // ,
#define ONE_SECOND 37 // 1
#define QT_SECOND 9 //
// GIMSK &= ~_BV(INT0); - INT0
#define DISABLE_EXTERNAL_INT0 GIMSK &= ~(_BV(INT0)); GIFR &= ~(_BV(INTF0)) //EIMSK/EIFR
//GIMSK |= _BV(INT0) - INT0
#define ENABLE_EXTERNAL_INT0 GIMSK |= _BV(INT0) ; GIFR &= ~(_BV(INTF0))
#else // 328 -
#define F_CPU 16000000UL
#define ONE_SECOND 64 // 1 - .
#define QT_SECOND 16 //
// 328 INT0 - PD2... , (, ),
#define DISABLE_EXTERNAL_INT0 EIMSK &= ~(_BV(INT0)); EIFR &= ~(_BV(INTF0))
// , - EICRA - ISC00-ISC01 == 00, lo level, EIMSK - INT0, EIFR-INTF0
#define ENABLE_EXTERNAL_INT0 EIMSK |= _BV(INT0) ; EIFR &= ~(_BV(INTF0))
#endif
#define MAX_GLOBAL_TIMER_VALUE (USHRT_MAX / 2) // uint16_t globalTimer - . 65535 /2
// , MAX_GLOBAL_TIMER_VALUE - 1
#define PERIOD_PRESS_BUTTON_SHORT QT_SECOND/2 // ( - ) -
#define PERIOD_PRESS_BUTTON_LONG QT_SECOND*4 // - /
#define PERIOD_FLASH_GREEN QT_SECOND // ( ) -
#define PERIOD_FLASH_YELLOW ONE_SECOND * 1 // - -
// ---
#define PERIOD_0 ONE_SECOND * 5 // R G R G 0. --- (5 )
#define PERIOD_1 ONE_SECOND * 3 //R g R g 1. --- (3 )
#define PERIOD_2 ONE_SECOND * 1 //R Y R Y 2. --- (1 )
#define PERIOD_3 ONE_SECOND * 2 //RY Y RY Y 3. + --- (2 )
#define PERIOD_4 ONE_SECOND * 7 // G R G R 4. --- (7 )
#define PERIOD_5 ONE_SECOND * 3 //g R g R 5. --- (3 )
#define PERIOD_6 ONE_SECOND * 1 //Y R Y R 6. --- (1 )
#define PERIOD_7 ONE_SECOND * 2 //Y RY Y RY 7. --- + (2 )
// / . -
typedef struct{
const uint8_t ddr_val_0; // DDRB value
const uint8_t port_val_0; // PORTB value
const uint8_t ddr_val_1; // DDRB value
const uint8_t port_val_1; // PORTB value
const uint16_t flash_period; // period of flashing - _val_1 _val_0 ( =0, )
const uint16_t signal_period; // period of this lighting state ( =0, )
}lightSignalization; // , _0 _1 - , flash_long -
// (PINS === 0 0 0 g r y0 btt y1):
// ""
#define BUTTON_PIN PB1 // , INT0. , , = LOW
#define RED_PIN PB3 // OUT: 1 - "-" , 0 - "-" , IN - , , (!)
#define YELLOW0_PIN PB2 // OUT: 1 - "-"
#define YELLOW1_PIN PB0 // OUT: 1 - "-"
#define GREEN_PIN PB4 // OUT: 1 - "-" , 0 - "-" , IN - , , (!)
#define BUTTON_ON !(PINB & _BV(BUTTON_PIN)) //( (PINB & _BV(BUTTON)) == 0) // " "
#define BUTTON_OFF (PINB & _BV(BUTTON_PIN)) // ~(PINB & _BV(BUTTON)) -\\- " "
#define RED _BV(RED_PIN) // _BV - (), 1<<VALUE
#define YELL0 _BV(YELLOW0_PIN) // -
#define YELL1 _BV(YELLOW1_PIN)
#define GREEN _BV(GREEN_PIN) // - ( 0 - -) DDR=1
// lightSignalization traffic_signals[]
#define LIGHT_NUM_YELLOW_FLASH 8 // ( ) - - flash yellows lights
#define LIGHT_NUM_STD_START 0 // (--)
#define LIGHT_NUM_LIGHTS_OFF 9 // - - traffic lights off
#define LIGHT_NUM_START_SHOW 10 //
#define LIGHT_NUM_ERR 11 // -
#define MASK_LIGHT_NUM_STD 7 // ___++ &= LIGHT_NUM_STD_MASK - 0 7
//....................................
//
const lightSignalization traffic_signals[] PROGMEM= { // , , -, PINS === 0 0 0 g r y0 btt y1
// {DDRB0, PORTB0, DDRB_flashing, PORTB_flasinf (if flashing), continuous of half-period flashing, continuous id mode running}
{RED|GREEN, RED, 0, 0, 0, PERIOD_0}, // R G R G
{RED, RED, RED|GREEN, RED, QT_SECOND, PERIOD_1}, // R g R g - flash east green
{RED|YELL1, RED|YELL1, 0, 0, 0, PERIOD_2 }, // R Y1 R Y1
{RED|YELL0|YELL1, RED|YELL0|YELL1, 0, 0, 0, PERIOD_3 }, // RY0 Y1 RY0 Y1
{RED|GREEN, GREEN, 0, 0, 0, PERIOD_4}, // G R G R
{RED|GREEN, GREEN, RED, 0, QT_SECOND, PERIOD_5 }, // g R g R - flash nord green
{RED|YELL0, YELL0, 0, 0, 0, PERIOD_6}, // Y0 R Y0 R
{RED|YELL0|YELL1, YELL0|YELL1, 0, 0, 0, PERIOD_7 }, // Y0 RY1 Y0 RY1
{YELL0|YELL1, YELL0|YELL1, YELL0|YELL1, 0, ONE_SECOND, 0}, // y0 y1 y0 y1 - flash yellows lights
{0, 0, 0, 0, 0, 0}, // traffic lights off,
{RED|GREEN|YELL0, RED|YELL0, RED|GREEN|YELL1, GREEN|YELL1, 1, PERIOD_2}, // PERIOD_2 - ,
{YELL0|GREEN, YELL0, YELL1|GREEN, YELL1|GREEN, 1, 0} // -
};
volatile uint16_t globalTimer; // 64
uint8_t scan_button_cnt; //
uint16_t tl_flash_end; // 2 ( !0),
uint16_t tl_signal_end; // 2 ( !0)
uint8_t f_button_state_flags; // 1,
// , 8
#pragma region bits_of_f_button_state_flags
// MODES: wakeup 11 -> work 00 -> tosleep 01 -> pwrdown 11 -> wakeup 11
#define MODE_LBIT 0
#define MODE_HBIT 1
#define MODE_VALUE ( f_button_state_flags & 3 ) // - MODE_
#define SET_MODE_WORK f_button_state_flags &= ~(_BV(MODE_HBIT) ); f_button_state_flags &= ~(_BV(MODE_LBIT) );// 00 - work
// f_button_state_flags &= ~( _BV(MODE_HBIT) | _BV(MODE_LBIT) ) - ,
#define MODE_WORK_VALUE 0
#define SET_MODE_TOSLEEP f_button_state_flags &= ~(_BV(MODE_HBIT)); f_button_state_flags |= _BV(MODE_LBIT) // 01 - tosleep
#define MODE_TOSLEEP_VALUE 1
#define SET_MODE_PWRDOWN f_button_state_flags |= _BV(MODE_HBIT); f_button_state_flags &= ~(_BV(MODE_LBIT)) // 10 - pwrdown
#define MODE_PWRDOWN_VALUE 2
#define SET_MODE_WAKEUP f_button_state_flags |= _BV(MODE_HBIT); f_button_state_flags |= _BV(MODE_LBIT) // 11 - wakeup
#define MODE_WAKEUP_VALUE 3
#define FORCE_SET_NEW_SIGNAL_BIT 2 // current_signal
#define IF_FORCE_SET_SIGNAL_FLAG ( f_button_state_flags & _BV(FORCE_SET_NEW_SIGNAL_BIT) ) // IF_ -
#define SET_FORCE_SET_SIGNAL_FLAG f_button_state_flags |= _BV(FORCE_SET_NEW_SIGNAL_BIT) // SET_ - 1
#define RES_FORCE_SET_SIGNAL_FLAG f_button_state_flags &= ~( _BV(FORCE_SET_NEW_SIGNAL_BIT) ) // RES_ - 0
// 3
#define LIGHT_SIGNAL_ALT_MODE_BIT 4 // =0 (--) =1 ( )
#define IF_LIGHT_SIGNAL_ALT_MODE_FLAG ( f_button_state_flags & _BV(LIGHT_SIGNAL_ALT_MODE_BIT) ) //1( ) 0(--) ?
#define SET_LIGHT_SIGNAL_ALT_MODE_FLAG f_button_state_flags |= _BV(LIGHT_SIGNAL_ALT_MODE_BIT)
#define RES_LIGHT_SIGNAL_ALT_MODE_FLAG f_button_state_flags &= ~( _BV(LIGHT_SIGNAL_ALT_MODE_BIT) )
#define FLIP_LIGHT_SIGNAL_ALT_MODE_FLAG f_button_state_flags ^= _BV(LIGHT_SIGNAL_ALT_MODE_BIT)
#define USE_FIRST_VALUES_LIGHT_BIT 5 // - lightSignalization
#define IF_USE_FIRST_VALUES_LIGHT_FLAG (f_button_state_flags & _BV(USE_FIRST_VALUES_LIGHT_BIT)) // lightSignalization._val_0 (1) lightSignalization._val_1 (0)? -
#define SET_USE_FIRST_VALUES_LIGHT_FLAG f_button_state_flags |= _BV(USE_FIRST_VALUES_LIGHT_BIT)
#define RES_USE_FIRST_VALUES_LIGHT_FLAG f_button_state_flags &= ~( _BV(USE_FIRST_VALUES_LIGHT_BIT))
#define FLIP_USE_FIRST_VALUES_LIGHT_FLAG f_button_state_flags ^= _BV(USE_FIRST_VALUES_LIGHT_BIT) //
#define SHORT_PRESS_FLAG_BIT 6 // , 1
#define IF_SHORT_PRESS_FLAG ( f_button_state_flags & _BV(SHORT_PRESS_FLAG_BIT) ) // - == 1
#define SET_SHORT_PRESS_FLAG f_button_state_flags |= _BV(SHORT_PRESS_FLAG_BIT)
#define RES_SHORT_PRESS_FLAG f_button_state_flags &= ~(_BV(SHORT_PRESS_FLAG_BIT))
#define LONG_PRESS_FLAG_BIT 7 // , 1
#define IF_LONG_PRESS_FLAG ( f_button_state_flags & _BV(LONG_PRESS_FLAG_BIT) ) // - == 1
#define SET_LONG_PRESS_FLAG f_button_state_flags |= _BV(LONG_PRESS_FLAG_BIT)
#define RES_LONG_PRESS_FLAG f_button_state_flags &= ~(_BV(LONG_PRESS_FLAG_BIT))
#pragma endregion
//....................................
void setPeriods(uint8_t num, bool set_both_flash_and_signal); // tl_flash_end, tl_signal_end
void setPorts(uint8_t num, bool use_main_values); //
void inline init_timer_clock(){ //
#ifdef GIMSK // ATtiny13 -
TCCR0B = _BV(CS02) | _BV(CS00); // 0 - clock frequency / 1024
TIMSK0 |= _BV(TOIE0); // overflow interrupt
#else // , 328/16
// 100 - prescaler 64; Foverflow = 16M/64*256 ~=976.56Hz,
TCCR2B = (1<<CS22) | (1<<CS21) | (1<<CS20) ; // 111 - CLK/1024, 16M/1024*254 - 1/64
TIMSK2 |=(1<<TOIE0); // interrupt ovfl enable
//Serial.begin(115200);
#endif
}
//....................................
//
// - - globalTimer 1/37
#ifdef GIMSK // ATtiny13
ISR(TIM0_OVF_vect){
globalTimer++; // . , while(1) .
}
#else
// 0 - , - - - 2
ISR(TIMER2_OVF_vect){
globalTimer++;
}
#endif
// - (, , 0)
ISR(INT0_vect){
DISABLE_EXTERNAL_INT0;
SET_MODE_WAKEUP; // POWER DOWN
globalTimer = 0; // -
scan_button_cnt = 0; //
RES_SHORT_PRESS_FLAG; //
RES_LONG_PRESS_FLAG; //
}
/*
// -
void inline dbg(){
DDRB |= YELL0; PORTB ^= YELL0;
}
*/
//....................................
//
int main() {
uint8_t current_signal; // 1 , traffic_signals
#pragma region Initialisation&setup
// " -".
set_sleep_mode(SLEEP_MODE_IDLE); // - .
sleep_enable(); //
init_timer_clock(); //
globalTimer = 0; // -
SET_MODE_WORK; //
SET_USE_FIRST_VALUES_LIGHT_FLAG; //
scan_button_cnt = 0; //
//
current_signal = LIGHT_NUM_START_SHOW; // - /
SET_FORCE_SET_SIGNAL_FLAG; // current_signal
sei(); //
#pragma endregion
while(1){
#pragma region TimerOVF
// ?
if(globalTimer > MAX_GLOBAL_TIMER_VALUE){
globalTimer -= MAX_GLOBAL_TIMER_VALUE; //
//
if(tl_flash_end){
tl_flash_end -= MAX_GLOBAL_TIMER_VALUE; // ,
}
if(tl_signal_end){
tl_signal_end -= MAX_GLOBAL_TIMER_VALUE; // // ,
}
// setPeriods(currentMode, false); // 12 , tl_.._end ,
}
#pragma endregion
#pragma region ButtonState
//
if(BUTTON_ON){
if(scan_button_cnt < USHRT_MAX){
scan_button_cnt++; // 1/37
}
// - ,
if(scan_button_cnt > PERIOD_PRESS_BUTTON_SHORT){
SET_SHORT_PRESS_FLAG; // , ,
}
if(scan_button_cnt > PERIOD_PRESS_BUTTON_LONG){
SET_LONG_PRESS_FLAG; //
}
}
#pragma endregion
#pragma region LightWorkLogic
// (tl_flash_end !=0 )
if(tl_flash_end){
//
if(globalTimer > tl_flash_end){
FLIP_USE_FIRST_VALUES_LIGHT_FLAG; // !use_main_values - ))
setPorts(current_signal, IF_USE_FIRST_VALUES_LIGHT_FLAG); //
setPeriods(current_signal, false); // ,
}
}
//
// - operating_std - --
// , +1 7
if(tl_signal_end){
// (use_main_values - - )
if((globalTimer > tl_signal_end) && IF_USE_FIRST_VALUES_LIGHT_FLAG){
current_signal ++; //
current_signal &= MASK_LIGHT_NUM_STD; // 3-, 0 7
SET_FORCE_SET_SIGNAL_FLAG; // current_signal
}
}
#pragma endregion
#pragma region MODE_VALUELogic
// , 2 f_button_state_flags
//? MODE_VALUE === pwrdown -> wakeup -> work -> tosleep -> pwrdown
switch (MODE_VALUE){
case (MODE_WAKEUP_VALUE):
set_sleep_mode(SLEEP_MODE_IDLE); // !
// , - IF_BUTTON_LONG_FLAG
if(IF_LONG_PRESS_FLAG){
// ? !
if(current_signal == LIGHT_NUM_LIGHTS_OFF){
// ? LIGHT_NUM_ERR
current_signal = (IF_LIGHT_SIGNAL_ALT_MODE_FLAG) ? LIGHT_NUM_YELLOW_FLASH : LIGHT_NUM_STD_START;
SET_FORCE_SET_SIGNAL_FLAG; // current_signal
}
}
//, ...
if(BUTTON_OFF){
// ,
if(IF_LONG_PRESS_FLAG){
SET_MODE_WORK;
}else{
// , , ,
SET_MODE_PWRDOWN; //
}
scan_button_cnt = 0; //
RES_SHORT_PRESS_FLAG; // ,
RES_LONG_PRESS_FLAG;
}
break;
case (MODE_WORK_VALUE):
// ?
if(scan_button_cnt > 0){
// ?
if(IF_LONG_PRESS_FLAG){
current_signal = LIGHT_NUM_LIGHTS_OFF; //
SET_FORCE_SET_SIGNAL_FLAG; // - " "
SET_MODE_TOSLEEP; // !
}
// ?
if(BUTTON_OFF){
// ?
if(IF_SHORT_PRESS_FLAG){
FLIP_LIGHT_SIGNAL_ALT_MODE_FLAG; //
current_signal = (IF_LIGHT_SIGNAL_ALT_MODE_FLAG) ? LIGHT_NUM_YELLOW_FLASH : LIGHT_NUM_STD_START; // .
SET_FORCE_SET_SIGNAL_FLAG; // current_signal
}
scan_button_cnt=0;
RES_SHORT_PRESS_FLAG; //
RES_LONG_PRESS_FLAG;
}
}
break;
case (MODE_TOSLEEP_VALUE):
// - .
if(BUTTON_OFF){
SET_MODE_PWRDOWN; //
}
break;
case (MODE_PWRDOWN_VALUE):
// ! , ! ?
if(BUTTON_ON){
set_sleep_mode(SLEEP_MODE_IDLE);
SET_MODE_WAKEUP;
}else{
// ? .
scan_button_cnt = 0;
RES_LONG_PRESS_FLAG;
RES_SHORT_PRESS_FLAG;
current_signal = LIGHT_NUM_LIGHTS_OFF; //
SET_FORCE_SET_SIGNAL_FLAG;
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // - while(1)
ENABLE_EXTERNAL_INT0; //
}
break;
default:
//! - . -
current_signal = LIGHT_NUM_ERR;
SET_FORCE_SET_SIGNAL_FLAG;
//setPorts(current_signal,true);
//setPeriods(current_signal,true);
break;
}
#pragma endregion
// , - ?
if(IF_FORCE_SET_SIGNAL_FLAG){ // current_signal
RES_FORCE_SET_SIGNAL_FLAG; //
SET_USE_FIRST_VALUES_LIGHT_FLAG; // - 0- -
setPorts(current_signal, IF_USE_FIRST_VALUES_LIGHT_FLAG); // #current_signal
setPeriods(current_signal, true);
}
// 1/37 . , , .
sleep_cpu(); // - .
}
}
//....................................
//
//
void setPorts(uint8_t num, bool use_main_values){
uint8_t val;
DDRB = 0; PORTB = 0;
// () - ddr_val_0, else = ddr_val_1
// val = (use_main_values) ? pgm_read_byte_near(&(traffic_signals[num].ddr_val_0))
// : pgm_read_byte_near(&(traffic_signals[num].ddr_val_1));
// , , , , 14 (!!!) .
val = pgm_read_byte_near(&(traffic_signals[num].ddr_val_0)+( (use_main_values) ? 0 : sizeof(uint8_t)*2 ) );
val &= ~_BV(BUTTON_PIN); // , -
DDRB = val; //
val = (use_main_values) ? pgm_read_byte_near(&(traffic_signals[num].port_val_0))
: pgm_read_byte_near(&(traffic_signals[num].port_val_1));
val|= _BV(BUTTON_PIN); // - -
PORTB = val; //
}
// ( )
void setPeriods(uint8_t num, bool set_both_flash_and_signal){
//
tl_flash_end = pgm_read_word_near (&(traffic_signals[num].flash_period)); //
tl_flash_end = (tl_flash_end)? tl_flash_end + globalTimer : 0; // -
//if(tl_flash_end){ tl_flash_end += globalTimer; } <- 8
// -
if(set_both_flash_and_signal){
tl_signal_end = pgm_read_word_near(&(traffic_signals[num].signal_period));
tl_signal_end = (tl_signal_end)? tl_signal_end + globalTimer : 0; // ,
}
}
//Program size: 976 bytes (used 95% of a 1 024 byte maximum) (0,83 secs)
//Minimum Memory Usage: 8 bytes (13% of a 64 byte maximum)
Program size: 976 bytes (used 95% of a 1 024 byte maximum) (0,83 secs)
Minimum Memory Usage: 8 bytes (13% of a 64 byte maximum)
.
ATtiny13 .
-
( ?) . — . , , , . , , .
,DipTrace «» «PCB Layout», . , .

— .

, , .
( , 80- ).

CD .

, , , .

— .
: , .
, , . — , .

— . - - "Craft&Clay" 50- 70. , .

.

15 130 .

— .


— .

— .

.

4 , 2-3 ,
, .

. , , , " ".

, .

KSP. — 4 LED 5 .

, , DC-DC 0.9-5 , .

. , , .

, , , .

ISP 10- .

, , , - . , , " ". 1.5 , — . , .
| , | , %/ | , |
---|
CR1212 | 18 | 1 | 0.250 |
CR1620 | 68 | 1 | 0.950 |
CR2032 | 210 | 1 | 3 |
NiCD AAA | 350 | 20 | 98 |
NiMH AAA | 900 | 30 | 375 |
NiCd AA | 1000 | 20 | 270 |
Alkaline AAA | 1250 | 2 | 35 |
NiMH AA | 2400 | 30 | 1000 |
Alkaline AA | 2890 | 2 | 80 |
Li-Ion | 4400 | 10 | 600 |
, . , , (2/100)2890/(2430) = 80 . , 2 , 32 ATtiny13.
: , GPIO, . — , ( 4 14 ""), , 40 .
, — . , . , : 5 DC-DC , , DC-DC 1.5 -> 5 . , - +-20%, .

, "" 4-5 (5 ) , , 25 (1.5 ),

.. 2890 116 , . ATtiny13 POWER DOWN . , — . 20-50 , , Hi-Z, 1 . , DC-DC .
2 5 . : .
,
, :
- , — , R2, , . .
- . — 1/37 , .
- , , . POWER_DOWN 30 , , , .
- traffic_signals 8 4, . 4 pin — 1 DDR PORTB
- uint16_t signal_period flash_period — , , 1 .
- — ROM 2 , — - .
- /UART.
- main — — +50 ROM.
- 9,6 128 , .
.
: " ", , 8 , , «» .
.
Github, MIT.