рддреАрди рдЖрдБрдЦреЗрдВ рдПрдХ рдЦрдВрднреЗ рдкрд░ рд▓рдЯрдХреА рд╣реБрдИ рд╣реИрдВ, рдпрд╛ рдХрд╣рд╛рдиреА рд╣реИ рдХрд┐ рдПрдЯреАрдЯреАрдиреА 13 рдХреЗ рдкрд╛рдВрдЪ рдкреИрд░ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВ


KDPV "рдУрд╣, рдпрд╣ рдмрд╛рдд рд╣реИред"


рдЗрд╕ рдмрд╛рдд рдХреА рдмрд╣реБрдд рдХрдо рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рд▓рд╛рд▓рд╕рд╛ рдмреБрджреНрдзрд┐рдЬреАрд╡рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреНрдЮрд╛рди рдХрд╛ рд╕реНрд░реЛрдд рдмрди рдЬрд╛рдПрдЧреА, рдЬреЛ рдХрд╛рд░реНрдиреЛрдЯ рдХрд╛рд░реНрдб рдкрд░ рдЕрдЯрдХрд▓ рдХреЗ рд░рд╣рд╕реНрдпреЛрдВ рдореЗрдВ рдкрд░рд┐рд╖реНрдХреГрдд рд╣реЛрдЧреА рдФрд░ рддреАрд╕рд░реЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рдХреЗ рдЧреБрдкреНрдд рдЕрд░реНрде рдХреЛ рдЬрд╛рди рд╕рдХреЗрдЧреАред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЖрдк рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдЕрдкрдиреЗ рдЖрд░реНрдбрд┐рдиреЛ рдХреЛ рдЫреВрддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдЯрд╛рдВрдХрд╛ рд▓рдЧрд╛рдиреЗ рд╡рд╛рд▓рд╛ рд▓реЛрд╣рд╛ рдкреЗрдВрдЯреНрд░реА рдореЗрдВ рдзреВрд▓ рдЗрдХрдЯреНрдард╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдмреИрдЯрд░реА рдореЗрдВ рдПрдХ рдкреНрд▓рд╕ рдХреНрдпреЛрдВ рд╣реИ, рдФрд░ рд╕реА ++ рдореЗрдВ рджреЛ рд╣реИрдВ, рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд╛рджреБрдИ рдФрд░ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдЪрдорддреНрдХрд╛рд░ рдЖрдкрдХреЛ рдЙрджрд╛рд╕реАрди рдирд╣реАрдВ рдЫреЛрдбрд╝реЗрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рдЖрдкрдХреЛ рдЖрдЬ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рдиреЗ рдХреА рдЦреБрд╢реА рд╣реИ, рдЬреЛ рдХрд┐ рд╕рд░реНрдХрд╕ "рдмреЙрдХреНрд╕рд╡реБрдб рдХреЗ рд╕рд╛рде рд╕рдорди" рд╣реИ :


  • ATtiny13 рдореЗрдВ RAM рдФрд░ ROM рдХреЛ рдЬреЛрдбрд╝рдирд╛!
  • рдПрдХ рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдХреГрддреНрд░рд┐рдо рдмреБрджреНрдзрд┐рдорддреНрддрд╛ - рдкреНрд░реЛ рдФрд░ рдЧрд░реНрднрдирд┐рд░реЛрдзрдХ, рдпрд╛ рдПрдХ рдиреАрдВрдж рд╕реМрдВрджрд░реНрдп - рдареАрдХ рд╣реИ, рдХреНрдпрд╛ рд╡рд╣ рдореВрд░реНрдЦ рдирд╣реАрдВ рд╣реИ?
  • рдпрд╛ рдпрд╣ рдЕрднреА рднреА рдбреНрдпреВрд░рд╛ рд▓реЗрдХреНрд╕ рд╕реЗрдб рд▓реЗрдХреНрд╕ рд╣реИ?
  • ATtiny13 рдореЗрдВ рдкреИрд░ рдХреИрд╕реЗ рдЬреЛрдбрд╝реЗрдВ?
  • рдкрд╛рдВрдЪрд╡реЗрдВ рдЖрдпрд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж: рдЕрд╕рд╣рдиреАрдп рдХреЛ рд░рдЯрдирд╛ рдХреИрд╕реЗ?
  • рдЖрдзрд╛ рдЧреИрд░-рдХреБрдВрд╡рд╛рд░реА рдореЗрдВ рд╕реЗрд╡рд┐рдВрдЧ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдорд┐рд▓рд╛рддреЗ рд╣реБрдП (рд╡рд╕реВрд▓реА рдХреА рдЧрд╛рд░рдВрдЯреА рдХреЗ рд╕рд╛рде)ред
  • "рдЦрд┐рд▓рд╛ рдЦрд┐рд▓рд╛ рд╣реБрдЖ" (рджреЗрдЦреЗрдВ рдкрд╛рдВрдЪ рд╣рдЬрд╛рд░ рд▓реЛрдЧреЛрдВ рдХреЗ рдкрд╣рд▓реЗ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рдкрд╛рдВрдЪ рдЬреМ рдХреА рд░реЛрдЯрд┐рдпреЛрдВ рдФрд░ рджреЛ рдордЫрд▓рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрддреГрдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ)ред

рдпрджрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЪрд╛рд▓ рд╣рд░ рдмреАрд╕рд╡реАрдВ рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдЖрддреА рд╣реИ, рддреЛ рдореИрдВ рд╕рдВрддреБрд╖реНрдЯ рд╣реЛ рдЬрд╛рдКрдВрдЧрд╛, рд▓реЗрдЦ рд╡реНрдпрд░реНрде рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред


рдкрд╣рд▓реЗ рдЯреНрд░реИрдлрд┐рдХ рд▓рд╛рдЗрдЯ рдпрд╛ рдХрд╛рдпрд╛ рд▓рдбрд╝рд╛рдИ рдореЗрдВ рд▓реЗ рдЬрд╛рддреА рд╣реИред


рдХрд╣рд╛рдиреА рдХреА рд╢реБрд░реБрдЖрдд рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рдХреНрд░рд┐рд╕рдорд╕ рдкреВрд░реНрд╡-рдХреНрд░рд┐рд╕рдорд╕ рд╡реАрдбрд┐рдпреЛ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реБрдИ, рдЬрдм рдХреИрдорд░рд╛ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдЖрд░рд╛рдорджрд╛рдпрдХ рдХрдорд░реЗ рдореЗрдВ рдПрдХ рдкрд╛рд▓реЗ рд╕реЗрдУрдврд╝ рд▓рд┐рдпрд╛ рдЦрд┐рдбрд╝рдХреА рд╕реЗ рджрд┐рдЦрддрд╛ рд╣реИ: рдЯрд┐рдирд╕реЗрд▓, рдХрдкрд╛рд╕ рдКрди рдФрд░ рдЦрд┐рд▓реМрдиреЛрдВ рдореЗрдВ рдПрдХ рдХреНрд░рд┐рд╕рдорд╕ рдХрд╛ рдкреЗрдбрд╝, рдХреАрдиреВ рдФрд░ рдореБрд▓реНрддрд╛рдиреА рд╢рд░рд╛рдм рдХреА рдЧрдВрдз, рдореЛрдордмрддреНрддреА рдХреА рд░реЛрд╢рдиреА рд╕реЗ рдЫрд╛рдпрд╛ рдХрд╛ рдЧрд░реНрдо рдХрдВрдкрдХрдВрдкреАред рдмрдбрд╝реЗ рд╕реЛрдлреЗ рдкрд░, рд╡рд╣ рдкреНрд▓реЗрдб рдХреЛ рд╕реАрдзрд╛ рдХрд░рддреА рд╣реИ рдФрд░ рдзреАрд░реЗ рд╕реЗ рдЙрд╕рдХреЗ рдЧрд╛рд▓ рдХреЛ рдЕрдкрдиреЗ рдХрдВрдзреЗ рд╕реЗ рджрдмрд╛рддреА рд╣реИ, рдЕрдиреБрдкрд╕реНрдерд┐рдд рд░реВрдк рд╕реЗ рдЙрддреНрд╕рд╛рд╣ рд╕реЗ рд╕реБрдирдиреЗ рд╡рд╛рд▓реА рдкрд░реА рдЬреИрд╕реА рджрд┐рдЦрдиреЗ рд╡рд╛рд▓реА рдЫреЛрдЯреА рд▓рдбрд╝рдХреА ...


рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рдЕрдиреБрднрд╡ рд╡рд╛рд▓реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдРрд╕реЗ рдХреНрд╖рдг рдореЗрдВ рдЖрдк рдХреНрдпрд╛ рд╕реБрди рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рд╕рдордЭрд╛рдКрдВрдЧрд╛ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЕрднреА рддрдХ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреМрд╢рд▓ рдХрд╛ рдЕрдзрд┐рдЧреНрд░рд╣рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ - рдЙрдЪреНрдЪ рд╕реНрддрд░ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде, рдорд╛рддрд╛-рдкрд┐рддрд╛ рдЕрдм рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЧреВрдВрдЧреЗ рд╣реИрдВ: "рдкрд┐рддрд╛рдЬреА! рд╣рдореЗрдВ рдХрд▓! рдмрд╛рд▓рд╡рд╛рдбрд╝реА рдХреЛ! рдореБрдЭреЗ рдХрд░рдирд╛ рд╣реИ! рдХреНрд░рд┐рд╕рдорд╕ рдкреЗрдбрд╝ рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдХреЗ рд▓рд┐рдП рд╢рд┐рд▓реНрдк рд▓рд╛рдУ! рдФрд░ рдореБрдЭреЗ рдкрд╣рд▓реА рдЬрдЧрд╣ рдЪрд╛рд╣рд┐рдП! тАЭ


рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдХрд▓ред рд╣рдорд╛рд░реЗ рд▓рд┐рдПред рд╢рд┐рд▓реНрдкред рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ред


рдЧреНрд░рд╛рд╣рдХ рдХреЗ рд╕рд╛рде рд╢рд╛рдорд┐рд▓ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдХрд╛рд░реНрдп рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд░реВрдк рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ: рд╣рдореЗрдВ рдЯреНрд░реИрдлрд┐рдХ рд▓рд╛рдЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рдПрдХ рдЕрд╕рд▓реА рдХреА рддрд░рд╣ рд╕реБрдВрджрд░ рдФрд░ рдЪрдордХ рд╣реЛрдирд╛ред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рд╕реНрддрд░ рдкрд░, ISU рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХреЗ рд░реИрдВрдХ рдирд╛рдЯрдХреАрдп рд░реВрдк рд╕реЗ рдкрддрд▓реЗ рд╣реЛ рд░рд╣реЗ рд╣реИрдВ: рдкрд┐рддрд╛рдЬреА рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдкреБрд╖реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реИрдВ рдХрд┐ рдкреИрдЪрд╡рд░реНрдХ рдпрд╛ рдмреБрдирд╛ рд╣реБрдЖ рдпрд╛ рдХреНрд░реЛрдХреЗрдЯреЗрдб рдЯреНрд░реИрдлрд┐рдХ рд▓рд╛рдЗрдЯ рд╕реЗ рдПрдХ рд╕реБрдВрджрд░, рдореБрд▓рд╛рдпрдо, рд╕рд┐рд▓рдирд╛ рдЯреНрд░реИрдлрд╝рд┐рдХ рд▓рд╛рдЗрдЯ рдЧреНрд░рд╛рд╣рдХ рдХреЗ рд╕рдкрдиреЛрдВ рдХрд╛ рдПрдХ рдореВрд░реНрдд рд░реВрдк рд╣реИ: рдЯреНрд░реИрдлрд╝рд┐рдХ рд▓рд╛рдЗрдЯ рдЪрд╛рд▓реВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рдХреНрдпрд╛ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ?


рд░рд╛рдд рдкреВрд░реЗ рджреЗрд╢ рдореЗрдВ рдШреВрдорддреА рд░рд╣реА рдФрд░ рд╣рдорд╛рд░реЗ рджреЗрд╢ рдореЗрдВ рдХрд╛рдо рдореЗрдВ рдЙрдмрд╛рд▓ рдЖрдиреЗ рд▓рдЧрд╛ред


рдЯреНрд░реИрдлрд┐рдХ рд▓рд╛рдЗрдЯ рдХреА рдмреЙрдбреА рдордЯреЗрд░рд┐рдпрд▓ рдПрдХ рдЯреЙрдпрд▓реЗрдЯ рдкреЗрдкрд░ рд╕реНрд▓реАрд╡ рд╣реИ, рдЬрд┐рд╕реЗ рдПрдХ рдмреЙрдХреНрд╕ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджрд╕ рд░реВрдмрд▓ рдХреЗ рд╕рд┐рдХреНрдХреЗ рдХреЛ рдПрдХ рдкреЗрдВрд╕рд┐рд▓ рдХреЗ рд╕рд╛рде рдШреЗрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдлрд┐рд░ рдкреНрд░рдХрд╛рд╢ рдЕрд▓рд╛рд░реНрдо рдХреА рд░реЛрд╢рдиреА рдХреЗ рддрд╣рдд рд▓рд┐рдкрд┐рдХ рдЪрд╛рдХреВ рд╕реЗ рдЫреЗрдж рдХрд╛рдЯ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рджрд░реНрджрдирд╛рдХ рдХрд╛рдо рдмрдЪреНрдЪреЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рд╣реИ)ред



рдЯреНрд░реИрдлрд╝рд┐рдХ рд▓рд╛рдЗрдЯ рдХреЗ рдКрдкрд░ рдФрд░ рдиреАрдЪреЗ рдХреЗ рдХрд╡рд░ рдЬрдЧрд╣-рдЬрдЧрд╣ рдХрд╛рд░реНрдбрдмреЛрд░реНрдб рд╕реЗ рдХрдЯреЗ рд╣реБрдП рд╣реИрдВред рдмрдирд╛рдП рдЧрдП рдкреИрдЯрд░реНрди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд▓реИрдВрдк рдХреЗ рдКрдкрд░ рдХреА рдЪреЛрдЯрд┐рдпрд╛рдБ 80 рдЧреНрд░рд╛рдо рдХреЗ рд╕рд╛рдзрд╛рд░рдг рдХрд╛рдЧрдЬ рдкрд░ рдкрд░рд┐рдХреНрд░рдорд╛ рдХреА рдЬрд╛рддреА рд╣реИрдВ рдФрд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд╛рдЯ рджреА рдЬрд╛рддреА рд╣реИрдВред



рддрдм рд╡реЗ рдкреАрд╡реАрдП рд╕реЗ рдЪрд┐рдкрдХреЗ рд╣реБрдП рдереЗред



рдЗрдХрдЯреНрдареЗ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдЖрдВрдЧрди рдореЗрдВ рдЦреАрдВрдЪ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рдРрдХреНрд░реЗрд▓рд┐рдХ рд╕реНрдкреНрд░реЗ рдкреЗрдВрдЯ рдХреЗ рд╕рд╛рде рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛: рдЙрджрд╛рд░рддрд╛ рд╕реЗ рдЪрд╛рдВрджреА, рдлрд┐рд░ рд╢реАрд░реНрд╖ рдкрд░ рдереЛрдбрд╝рд╛ рдХрд╛рд▓рд╛ред



рдХрд┐рд╕реА рднреА рд╕реНрддрд░ рдкрд░ рдХреНрд╖рддрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рддреАрди рдкреНрд░рддрд┐рдпрд╛рдВ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рдереАрдВред рд░рдВрдЧреАрди рдкреЗрдкрд░ рдХреЗ рддреАрди рд╕реНрдЯреНрд░рд┐рдкреНрд╕ - рд▓рд╛рд▓, рдкреАрд▓реЗ рдФрд░ рд╣рд░реЗ - рдХреЛ рд╕рдмрд╕реЗ рд╕рдлрд▓ рдХреЗ рдЕрдВрджрд░ рд╣рд▓реНрдХреЗ рдлрд┐рд▓реНрдЯрд░ рдХреЗ рд╕рд╛рде рдЪрд┐рдкрдХрд╛рдпрд╛ рдЧрдпрд╛ред


рдорд╛рддреГрднреВрдорд┐ (SHZZ) рдХреЗ рдЙрджрд╛рд░ рдбрд┐рдмреНрдмреЗ рд╕реЗ рд╕реБрдкрд░-рдЪрдордХрджрд╛рд░ рд╕рдлреЗрдж рдПрд▓ рдИ рдбреА рдХреА рдПрдХ рдЬреЛрдбрд╝реА рджреНрд╡рд╛рд░рд╛ рдЕрдВрджрд░ рд╕реЗ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред Kaptershchitskaya рдЯреЙрдб рдиреЗ рд╕рдкрд╛рдЯ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдкрд┐рддрд╛ рдХреЛ рднреА рддреАрди рдЯреИрдмрд▓реЗрдЯ рд▓рд┐рдерд┐рдпрдо рдмреИрдЯрд░реА рджреЗрдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛, рдФрд░ рдПрд▓ рдИ рдбреА рдПрдХ рд╕реЗ рдЪрдордХрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рдордд рдирд╣реАрдВ рдереЗ, рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рдХрд┐ рд╡реЗ рд╕рдлреЗрдж рдФрд░ рдЙрдЬреНрдЬреНрд╡рд▓ рдереЗ, рдФрд░ рдЙрдирдХреЗ рд▓рд┐рдП рд╡реЛрд▓реНрдЯреЗрдЬ рдбреНрд░реЙрдк 2.8 рд╕реЗ 3.9 рд╡реЛрд▓реНрдЯ рдерд╛ред рдЯреЙрдб рдХреЗ рд╕рд╛рде рд╕реМрджрд╛ рдХрд░рдиреЗ рдореЗрдВ рдЬреЛ рдЕрдзрд┐рдХрддрдо рд╣рдо рдПрдХ рдПрдП рдмреИрдЯрд░реА рдХреЗ рд▓рд┐рдП рдереЗ, рд╡рд╣ рдЬрд▓реЗ рд╣реБрдП рдорджрд░рдмреЛрд░реНрдб рдХреЗ рдереНрд░реЙрдЯрд▓ рд╕реЗ рдПрдХ рдлреЗрд░рд╛рдЗрдЯ рд░рд┐рдВрдЧ рдФрд░ KT315 рдЯреНрд░рд╛рдВрдЬрд┐рд╕реНрдЯрд░ рдерд╛ред рдпрд╣ рд╕реЛрдЪрдХрд░ рдФрд░ рдЧреБрдЧрд▓реА рдХрд░рддреЗ рд╣реБрдП, рдкрд┐рддрд╛рдЬреА рдХреЛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдФрд░ рдмрд╛рд▓рд╡рд╛рдбрд╝реА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рдореВрд╣ рдореЗрдВ рдЪрдВрдЪрд▓ рдкреЗрди рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд▓рд┐рдерд┐рдпрдо рдмреИрдЯрд░реА рд╡рд╛рд▓реЗ рд╡рд┐рдЪрд╛рд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЖрдХрд░реНрд╖рдХ рдирд╣реАрдВ рджрд┐рдЦрддреЗ рдереЗред


рдмреИрдЯрд░реА рдкрд░ рдЯреНрд░реИрдлрд┐рдХ рд▓рд╛рдЗрдЯ рдХреЗ рдкрддрд╡рд╛рд░реЛрдВ рдиреЗ рдкреЗрдВрдЯ рдХреА рдХрдареЛрд░ рдЧрдВрдз рдХреЗ рд╕рд╛рде рд╕реБрдЗрдпреЛрдВ рдФрд░ рдЯреЗрдВрдЬреЗрд░реАрди рдХреА рд╕реБрдЧрдВрдз рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛, рдореЗрд░реЗ рдкрд┐рддрд╛ рдиреЗ рд╕реЛрдЪ рд╕рдордЭрдХрд░ рд░реЛрд╕рд┐рди рдкрд░ рдЯрд╛рдВрдХрд╛ рд▓рдЧрд╛рдиреЗ рд╡рд╛рд▓рд╛ рд▓реЛрд╣рд╛ рдбрд╛рд▓рд╛, рдмрдЪреНрдЪреЛрдВ рдХреЛ рдЬрдирд░реЗрдЯрд░ (рдкреНрд░рддрд┐рдпреЛрдВ рдХреЗ рджреЛрд╣рд░рд╛рд╡) рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдЦреНрдореА рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░, рд╕рдм рдХреБрдЫ рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЪрд▓рд╛ рдЧрдпрд╛ ...


рдФрд░ рдирд╣реАрдВ, "рдЕрдЪрд╛рдирдХ" рдЙрд╕ рд░рд╛рдд рдРрд╕рд╛ рдирд╣реАрдВ рд╣реБрдЖ: рдПрдХ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдХреЛ рдШреБрдорд╛рд╡рджрд╛рд░ рдХрд░рддреЗ рд╕рдордп рд╕рднреА рдЪрд╛рд▓реЗрдВ рддреБрд░рдВрдд рдПрдХ рдбрдмрд▓ рддрд╛рд░ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХрддрдо рд╕рдВрднрд╡ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдШреБрдорд╛рд╡реЛрдВ рдХреЛ рд╣рд╡рд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддреА рд╣реИрдВред рдПрд▓рдИрдбреА рдХреЗ рдПрдиреЛрдб рдФрд░ рдХреИрдереЛрдб рдФрд░ KT315 рдЯреНрд░рд╛рдВрдЬрд┐рд╕реНрдЯрд░ рдХреЗ рдЯрд░реНрдорд┐рдирд▓реЛрдВ рдХреЛ рднреНрд░рдорд┐рдд рди рдХрд░реЗрдВ рдФрд░ рд╕рд░реНрдХрд┐рдЯ рдЖрд░реЗрдЦ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╡рд┐рдВрдбрд┐рдВрдЧ рдХреЗ рд╕рд┐рд░реЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ (рдпрд╛ рдпрджрд┐ рдирд╣реАрдВ рдЬрд▓рд╛рдпрд╛ рддреЛ рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡реИрдк рдХрд░реЗрдВ)ред J1 - рдПрдХ рдХрдВрдкреНрдпреВрдЯрд░ рдЬрдореНрдкрд░ рд╕реЗ рдкрд╛рд╡рд░ рд╕реНрд╡рд┐рдЪ, рдмрд╛рдж рдореЗрдВ рдПрдХ рдЯреНрд░реИрдлрд┐рдХ рд▓рд╛рдЗрдЯ рдХреА "рдЫрдд рдкрд░" рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред


1.5 рд╡реА рдЬреА 1 рдмреИрдЯрд░реА рд╕реЗ 3-7 рд╡реА рдХреА рдЪреЛрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрд╕реА рд╡реЛрд▓реНрдЯреЗрдЬ рдХреЗ рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд░рд▓ рд╕рд░реНрдХрд┐рдЯ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ ред



рд╢рд╛рд░реАрд░рд┐рдХ рд░реВрдк рд╕реЗ, рд╕рд░реНрдХрд┐рдЯ рдЖрд░реЗрдЦ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╕рдиреНрдирд┐рд╣рд┐рдд рд╣реИ:



рд▓рд╛рд▓ рдЯреЗрдк рдореЗрдВ AA рдХреНрд╖рд╛рд░реАрдп рдмреИрдЯрд░реА рд╣реЛрддреА рд╣реИред


рдФрд░ рдЯреНрд░реИрдлрд┐рдХ рд▓рд╛рдЗрдЯ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдРрд╕реА рд╣реИред



рд╕реБрдмрд╣ рдореЗрдВ, рдЧрд░реНрд╡рд┐рдд рдмрдЪреНрдЪреЗ рдиреЗ рдЙрддреНрдкрд╛рдж рдХреЛ рдмрд╛рд▓рд╡рд╛рдбрд╝реА рдореЗрдВ рдЦреАрдВрдЪ рд▓рд┐рдпрд╛, рдЬрд╣рд╛рдВ рдЦрд┐рд▓реМрдиреЗ рдиреЗ рдПрдХ рдЫрдк рдмрдирд╛рдпрд╛ рдФрд░ рдХреНрд░рд┐рд╕рдорд╕ рдХреЗ рдкреЗрдбрд╝ рдкрд░ рдХреЗрдВрджреНрд░ рдЪрд░рдг рд▓рд┐рдпрд╛ред



рд╕рдЪ рд╣реИ, рдпрд╣ рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛ - рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЛ рдЬрдорд╛ рдХрд░рдиреЗ рдХреА рд╕рдордп рд╕реАрдорд╛ рдереА, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рджрд┐рди рдкрд╣рд▓реЗред


рдШрд░ рдкрд░, "рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдЕрд╕рд▓реА рдЯреНрд░реИрдлрд┐рдХ рд▓рд╛рдЗрдЯ рдХреА рддрд░рд╣" рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдЦрд┐рдбрд╝рдХреА рдФрд░ рдореЗрд░реЗ рдкрд┐рддрд╛ рдХреА рдЦреБрдЬрд▓реА рдЕрд╕рдВрддреЛрд╖ рдкрд░ рджреЛ рдЗрдорд╛рд░рддреЗрдВ рдереАрдВред рдФрд░ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдШреВрдо рд░рд╣рд╛ рдерд╛ рдХрд┐ "рдХреНрдпрд╛ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдПрдХ рдкреВрд░реНрдг рд╕рдорд╛рдзрд╛рди рдлрд┐рдЯ рдХрд┐рдпрд╛ рдЬрд╛рдП, 13 рд╡реАрдВ рдмрд╛рдд рдореЗрдВ рдХрд╣реЗрдВ, рдХрд┐ рдЯреЙрдб рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ ShchZR рдореЗрдВ рдкрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ ? рдХреНрдпрд╛ рдкрд░реНрдпрд╛рдкреНрдд рдкрд╛рдВрдЪ рдкреИрд░ рд╣реЛрдВрдЧреЗ, рдХреЛрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рдФрд░ RAM рдХреЗ 64 рдмрд╛рдЗрдЯреНрд╕ рдФрд░, рдЬреИрд╕рд╛ рдХрд┐, рдПрдХ рдЕрд╕рд▓реА рдХреА рддрд░рд╣?"


рддреЛ рдпрд╣ рд╕рдм рд╕рд┐рд░реНрдл рдПрдХ рдХрд╣рд╛рд╡рдд рдереА, рдЖрдЧреЗ рдЯреНрд░реИрдлрд┐рдХ рд▓рд╛рдЗрдЯ рдореБрджреНрджреЗ рдХреЗ рдЕрдВрддрд┐рдо рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдкрд░реА рдХрдерд╛ред


рдПрдХ рдЕрд╕рд▓реА рдХреА рддрд░рд╣ рджреВрд╕рд░рд╛ рдЯреНрд░реИрдлрд┐рдХ рд▓рд╛рдЗрдЯ


рдкреНрд░рдпреБрдХреНрдд рдЙрдкрдХрд░рдг, рд╕рд╛рдордЧреНрд░реА рдФрд░ рдкреНрд░рд▓реЗрдЦрди


рднрд╛рд╖рд╛ / рд░реВрдкрд░реЗрдЦрд╛ : C / Arduino 1.6 / 1.8ред
рдЖрдИрдбреАрдИ : рдПрдордПрд╕ рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ 2012 + рд╡рд┐рдЬрд╝реБрдЕрд▓ рдорд╛рдЗрдХреНрд░реЛ рдкреНрд▓рдЧрдЗрди + рдЧрд┐рдЯред
CAD : рдбрд┐рдкрдЯреНрд░реЗрд╕ред
HW : ATtiny13 MK, ATmega328 рдкрд░ Arduino рдиреИрдиреЛ рдХреНрд▓реЛрди, FT232R рдкрд░ USB-UART, рдЪрд╛рдЗрдирд╛-рдиреЙрди USBISP рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ред
рдкреАрдкреА рддрдХрдиреАрдХ : LUT ред
рдЙрдкрдХрд░рдг : рдЯрд╛рдВрдХрд╛ рд▓рдЧрд╛рдиреЗ рд╡рд╛рд▓рд╛ рд▓реЛрд╣рд╛, рдЧреЛрдВрдж рдмрдВрджреВрдХ, рд░рд╕реЛрдИ рдУрд╡рди, рдЪрд╛рдХреВ, рдХреИрдВрдЪреА, рддрд╛рд░ рдХрдЯрд░ред
рд╕рд╛рдордЧреНрд░реА : ShchZR рд╕реЗ - 4 рд▓рд╛рд▓, рдкреАрд▓реЗ, рд╣рд░реЗ рд░рдВрдЧ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдиреЙрди рдмреНрд░рд╛рдВрдб рдХреЗ рдПрд▓ рдИ рдбреА, рдПрд╕рдПрдордбреА рдЯреИрдВрдЯрд▓рдо рдХреИрдкреЗрд╕рд┐рдЯрд░ рдФрд░ рдкреНрд░рддрд┐рд░реЛрдзреЛрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА 0805 рдкреНрд░рддреНрдпреЗрдХ 10k, рдЖрдзрд╛ рджрд░реНрдЬрди рдЖрдЙрдЯрдкреБрдЯ 0.25W рд╡рд░реНрддрдорд╛рди-рд╕реАрдорд┐рдд рдкреНрд░рддрд┐рд░реЛрдз MF-25, рдЪреАрдиреА рд╕реНрдЯреЗрдк-рдЕрдк DC-5V рдХрдирд╡рд░реНрдЯрд░, рдПрдпрд░реЛрд╕реЛрд▓ рдХреИрди рдмрд┐рдХреНрд░реА рд╕реЗ рдЪрд╛рдВрджреА рдФрд░ рдХрд╛рд▓реЗ рд░рдВрдЧ, рдП 4 рдкреЗрдкрд░, рдмрд╣реБрд▓рдХ рдорд┐рдЯреНрдЯреА рдХреЗ рд╕рд╛рдеред


рд╕реНрд░реЛрдд рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдПрдордЖрдИрдЯреА рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреЗ рддрд╣рдд рдЬреАрдердм рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рд╕реНрд░реЛрдд рдХреЛрдб рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рдлрд╝рд░реНрдорд╡реЗрдпрд░ рдХреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╕рднреА рдлрд╝рд╛рдЗрд▓ рдкрде рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреА рдЬрдбрд╝ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╣реИрдВред


рдкреНрд░рд▓реЗрдЦрди :
./docs/ATtiny13A datasheet.pdf [MK Atmel рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ ATtiny13A]
./docs/ATmega328 datasheet.pdf [Atmel ATmega328 MK рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛]
./docs/AVR4027 - рдЕрдкрдиреЗ C Code.pdf рдХреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд┐рдкреНрд╕ рдФрд░ рдЯреНрд░рд┐рдХреНрд╕ [Atmel AVR4027: 8-рдмрд┐рдЯ AVR рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ C рдХреЛрдб рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд┐рдкреНрд╕ рдФрд░ рдЯреНрд░рд┐рдХреНрд╕]
./docs/AVR4013 - рдкрд┐рдХреЛрд╡рд░ рдореВрд▓ рдмрд╛рддреЗрдВред рдкреАрдбреАрдПрдл [рдкрд╛рд╡рд░ рд╕реЗрд╡рд┐рдВрдЧ рдореЛрдбреНрд╕ рдкрд░ рдиреЛрдЯреНрд╕]


рдХреНрд▓рд╛рдЙрдб рд╕реЗ рдХрдВрдмрд▓ рдХреА рддрд░рд╣ Arduino IDE рд╕реЗред рдЙрдирдХрд╛ рд╡рд┐рдЬ рд╣рд░ рдЪреАрдЬ рдХрд╛ рдЬреЗрд╕реБрдЗрдЯ рд╕реВрдХреНрд╖реНрдо рдордЬрд╛рдХ рд╣реИ рдЬреЛ рдПрдореНрдмреЗрдб-рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдмреАрдЪ рдкрд╡рд┐рддреНрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди Arduino, рдПрдХ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдЬрд┐рдпреЛ, рдЬрд┐рдпреЛ рдФрд░ рдЬреАрдиреЗ рджреЛ, рдФрд░ рд╡рд┐рднрд┐рдиреНрди OS рдХреЗ рддрд╣рдд рдХрдВрдкреНрдпреВрдЯрд░реЛрдВ рдкрд░ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рд╕рд╛рджрдЧреА рдХреЗ рдХрд╛рд░рдг, рдФрд░ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдкрд╣рд▓реА рдмрд╛рд░ рд╕рдХреНрд╖рдо рдереЗ, рдмрд┐рдирд╛ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдбрд┐рдмрдЧрд░ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдЦрд░реНрдЪ рдХрд┐рдП, рдПрдХ рдкреИрд╕рд╛ UART рдФрд░ рдПрдХ рдорд╛рд▓рд┐рдХрд╛рдирд╛ рдмреВрдЯрд▓реЛрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдПрдХ рдХрд╛рдлреА рдЧрдВрднреАрд░ рднрд░рд╛рдИ рдПрдордХреЗ рдореЗрдВ рд╡рд┐рдХрд╛рд╕ред рдФрд░ рдпрд╣рд╛рдВ рдЕрдВрдХрд▓ рд▓рд┐рдпрд╛рдУ, рдПрдХ рдореВрд▓ рдХреА рдХреАрдордд рдкрд░ рдореБрдЯреНрдареА рднрд░ рдХреНрд▓реЛрди рдмреЗрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╡рд░рд┐рд╖реНрда atmegs рдореЗрдВ рдЖрдк рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рддрд░реНрдХ рдФрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдбреАрдмрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЙрд╕реА рддрд┐рдирдХрд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде - рдпрд╣ рднреА рдПрдХ рддрд░реНрдХ рд╣реИред


рдореЗрд░реЗ рд▓рд┐рдП MS VisualStudio рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рд╕рд╛рдорд╛рдиреНрдп рдФрд░ рдЖрд░рд╛рдорджрд╛рдпрдХ рд╣реИ, рдореЗрд░реЗ рдкрд╛рд╕ AtmelStudio рдпрд╛ WinAVR рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реНрдерд╛рди рдирд╣реАрдВ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдирд╣реАрдВ рдвреВрдВрдврдирд╛ рдЪрд╛рд╣рддрд╛, рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдбрд┐рдмрдЧрд░ рдХреЗ рдмрд┐рдирд╛ , рдЙрдирдХреЗ рдкрд╛рд╕ рдЕрдВрддрд┐рдо рд╕реБрд╡рд┐рдзрд╛рдПрдВ рдирд╣реАрдВ рд╣реИрдВред VisualMicro рдкреНрд▓рдЧрдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЬреЛ MS VisualStudio рдХреЛ Arduino рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рддрд╛ рд╣реИ , рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░реНрдпрд╛рдкреНрдд рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╕рдордЭрджрд╛рд░реА рд╕реЗ рд╣реИрдмрд░ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред
рд╣рдм рдкрд░ "Arduino on ATtiny13" рдХрд╛ рдзреНрдпрд╛рди рднреА рдмрд╣реБрдд рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рд░-рдмрд╛рд░ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛ред


рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, Arduino рдкрд░реНрдпрд╛рд╡рд░рдг рдХреА рд╕реНрдерд╛рдкрд┐рдд рд╕реНрдерд╛рдкрдирд╛ рдореЗрдВ рдорд╛рдЗрдХреНрд░реЛрдХреЛрд░ рдореЙрдбреНрдпреВрд▓ рдЬреЛрдбрд╝реЗрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд▓рдХреНрд╖реНрдп рдХрд╛рд░реНрдб рдореЗрдВ ATtiny13 MK рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред



Git - рдХрд┐рд╕реА рднреА рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рдмрд╕реЗ рдШрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВред рдпрд╣ рдЖрджрдд рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╣реА рд╣реИ: рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкрд░ рдХрд╛рдо рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп, рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд░ рдбрд╛рдпрд░реЗрдХреНрдЯреНрд░реА рдореЗрдВ "git init" рдЯрд╛рдЗрдк рдХрд░реЗрдВред рдПрдордПрд╕ рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рд╕реНрдерд╛рдиреАрдп рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдХрдорд┐рдЯ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдорд░реНрдерди рд╕рдордп рдФрд░ рд╕рдордп рдХреЛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдмрдЪрд╛рдПрдЧрд╛ред


рдбреАрдкреАрдЯреНрд░реЗрд╕, рдЬреИрд╕реЗ рд╕рд░реНрдХрд┐рдЯрд░реА рдФрд░ рдПрдХ рдореБрджреНрд░рд┐рдд рд╕рд░реНрдХрд┐рдЯ рдмреЛрд░реНрдб рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдШрд░реЗрд▓реВ, рд╕рд░реНрдХрд┐рдЯрд░реА рдФрд░ рд╡рд╛рдпрд░рд┐рдВрдЧ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрдХреВрд▓ рд╣реИ, рдХрд╕реНрдЯрдо рдШрдЯрдХреЛрдВ (рдпреВрдЬреАрдУ, рд╕рдВрдкрд░реНрдХ) рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ, рддреЛ рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдореБрджреНрд░рд┐рдд рд╕рд░реНрдХрд┐рдЯ рдмреЛрд░реНрдб рдХреЛ 3 рдбреА рдореЗрдВ рдШреБрдорд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрдЪреНрдЪ рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓реА рд╕рд╣рд╛рдпрддрд╛ рдФрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕рдмрдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдЙрдирдХреА рд▓рд╛рдЗрд╕реЗрдВрд╕рд┐рдВрдЧ рдиреАрддрд┐ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реВрдВ: рдЧреИрд░-рд▓рд╛рднрдХрд╛рд░реА рдорд╛рдирдХ рд▓рд╛рдЗрд╕реЗрдВрд╕ (1000 рдкрд┐рди, 4 рд╕рд┐рдЧреНрдирд▓ рд▓реЗрдпрд░) рдХреА рд╕реАрдорд╛рдПрдВ, рд░реВрд╕, рдпреВрдХреНрд░реЗрди рдФрд░ рдмреЗрд▓рд╛рд░реВрд╕ рдЧрдгрд░рд╛рдЬреНрдп рдХреЗ рд▓рд┐рдП 99% рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдШрд░ рдХреЗ рд╢рд┐рд▓реНрдк рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВред


рдореИрдВ рдЕрд░реБрджрд┐рдиреЛ рдиреИрдиреЛ рдХреЛ рдареАрдХ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдмрдВрдзрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛, рдПрдХ рдЯрд┐рдВрдХреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд░реВрдк рдореЗрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдпреВрдПрд╕рдмреА рдЖрдИрдПрд╕рдкреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд╕рд╛рде, рд╕рдорд╕реНрдпрд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╣рд▓ рд╣реЛ рдЧрдИ рд╣реИред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╕рдВрдХрд▓рди / рдлрд░реНрдорд╡реЗрдпрд░ - ./gcc рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рддреНрд╡рд░рд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдХреЗрдЪ рдХреА рдЧрдИ рдмреИрдЪ рдлрд╝рд╛рдЗрд▓реЗрдВред


.Ino рдлрд╝рд╛рдЗрд▓ (рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реА / рд╕реА ++ рд╣реИ) рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ "рдПрдЯреАрдЯреАрдЗрди 13 рдХреЗ рддрд╣рдд рдЖрд░реНрдбрд┐рдиреЛ рдХреЗ рддрд╣рдд" рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдмрд╕ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд░ рдЗрд╕ рдмреИрдЪ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдкрд░реЛрд╕рд╛ рдЬрд╛рддрд╛ рд╣реИ:


>"./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 , . ┬л , ┬╗ ┬л , ┬╗ .


12 LED


*** тАФ , 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 .


  1. , .
    traffic_signals[] тАФ LIGHT_NUM_LIGHTS_OFF
    {0, 0, 0, 0, 0, 0} // traffic lights off
    тАФ lightSignalization , тАФ , lightSignalization.signal_period==0 (.. ), lightSignalization.flash_period==0, .. .


  2. , .
    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 -  

  3. , --.



, .


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 , тАФ . , .


,, %/,
CR12121810.250
CR16206810.950
CR203221013
NiCD AAA3502098
NiMH AAA90030375
NiCd AA100020270
Alkaline AAA1250235
NiMH AA2400301000
Alkaline AA2890280
Li-Ion440010600

, . , , (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.

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


All Articles