рдЖрдк рдЕрднреА рддрдХ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдлрд┐рд░ рд╣рдо рдЖрдкрдХреЗ рдкрд╛рд╕ рдЬрд╛рддреЗ рд╣реИрдВ!

рд╣реИрд▓реЛ, рдкреНрд░рд┐рдп рдЧреИрдмреНрд░рдЬрд╝рд┐рдЯрд▓реА!

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВрдиреЗ рдПрдХ рдмрд╛рд░ рдХреИрд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░реНрд╕ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ рдФрд░ рдЖрдЦрд┐рд░рдХрд╛рд░ рдХреНрдпрд╛ рд╣реБрдЖред

рдореБрдЭреЗ рдмрд╣реБрдд рд╕рдордп рдкрд╣рд▓реЗ 2001 рдореЗрдВ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░реНрд╕ рдХреЗ рд╡рд┐рд╖рдп рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рдереАред рд▓реЗрдХрд┐рди рддрдм рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдирд┐рд╡рд╛рд╕ рд╕реНрдерд╛рди рдкрд░ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЗрдВрдЯрд░рдиреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦрд░реАрджрдиреЗ рдХрд╛ рдХреЛрдИ рд╕рд╡рд╛рд▓ рд╣реА рдирд╣реАрдВ рдерд╛ред рдореБрдЭреЗ рдмреЗрд╣рддрд░ рд╕рдордп рддрдХ рдЗрд╕ рд╡реНрдпрд╡рд╕рд╛рдп рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдФрд░ рдЗрд╕рд▓рд┐рдП, рдПрдХ рджрд┐рди, рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдордп рдШрд░ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдЖрдпрд╛ рдерд╛ , рдЖрдк рдореЗрд░реА рдЬрд╝рд░реВрд░рдд рдХреА рд╣рд░ рдЪреАрдЬрд╝ рдЦрд░реАрдж рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдЗрд╕реЗ рдЖрдЬрдорд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рддреЛ рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП:

1. рдкреНрд░реЛрдЧреНрд░рд╛рдорд░

рдмрд╛рдЬрд╛рд░ рдореЗрдВ рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ - рд╕рдмрд╕реЗ рд╕рд╕реНрддреА рдЖрдИрдПрд╕рдкреА (рдЗрди-рд╕рд┐рд╕реНрдЯрдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ) рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╕реЗ рдХреБрдЫ рдбреЙрд▓рд░ рдХреЗ рд▓рд┐рдП рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдбрд┐рдмрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╕реМ рдХреЗ рдЬреЛрдбрд╝реЗ рдХреЗ рд▓рд┐рдПред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрдиреБрднрд╡ рдирд╣реАрдВ рд╣реИ, рдПрдХ рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдФрд░ рд╕рдмрд╕реЗ рд╕рд╕реНрддреЗ USBasp рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ рдЗрд╕реЗ рдПрдХ рдмрд╛рд░ eBay рдкрд░ $ 12 рдХреЗ рд▓рд┐рдП рдЦрд░реАрджрд╛ рдерд╛, рдЕрдм рдЖрдк рдЗрд╕реЗ 3-4 рдбреЙрд▓рд░ рдореЗрдВ рднреА рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдереЙрдорд╕ рдлрд┐рд╕реНрдХрд▓ рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХрд╛ рдЪреАрдиреА рд╕рдВрд╕реНрдХрд░рдг рд╣реИред рдореИрдВ рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ? рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ - рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ ATmega рдФрд░ ATtiny рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдХрдИ AVR рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд рдбреНрд░рд╛рдЗрд╡рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред



рдлрд░реНрдорд╡реЗрдпрд░ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд╕рд╛рде VCC, GND, RESET, SCK, MOSI, MISO рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╕реАрдзреЗ рдмреНрд░реЗрдбрдмреЛрд░реНрдб рдкрд░ рдПрдХ рд╕рд╣рд╛рдпрдХ рд╕рд░реНрдХрд┐рдЯ рдХреЛ рдПрдХ рд╕рд╛рде рд░рдЦрд╛:

рдЫрд╡рд┐


рдмреЛрд░реНрдб рдХреЗ рдмрд╛рдИрдВ рдУрд░ рдПрдХ рд╣реА рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдлреНрд▓реИрд╢ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред

2. рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░

рдореИрдВрдиреЗ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреА рдкрд╕рдВрдж рд╕реЗ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдФрд░ Atmel ATmega8 - 23 I / O рдкрд┐рди, рджреЛ 8-рдмрд┐рдЯ рдЯрд╛рдЗрдорд░, рдПрдХ 16-рдмрд┐рдЯ, рдЖрд╡реГрддреНрддрд┐ - 16 рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬ рддрдХ, рдХрдо рдЦрдкрдд (1-3.6 mA, рд╕рд╕реНрддреЗ ($ 2)) рд▓рд┐рдпрд╛ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП - рдкрд░реНрдпрд╛рдкреНрдд рд╕реЗ рдЕрдзрд┐рдХред

рдЫрд╡рд┐


рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд, avr-gcc + avrdude рдмрдВрдбрд▓ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд▓рд┐рдП рдлрд░реНрдорд╡реЗрдпрд░ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдФрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╕реНрдерд╛рдкрдирд╛ рддреБрдЪреНрдЫ рд╣реИред рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди тАЛтАЛрдХрд░рддреЗ рд╣реБрдП , рдЖрдк рдХреБрдЫ рд╣реА рдорд┐рдирдЯреЛрдВ рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рдПрдХрдорд╛рддреНрд░ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ - рдПрд╡рд╛рд░реНрдб (рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд▓рд┐рдП рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕реЙрдлреНрдЯрд╡реЗрдпрд░) рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрдкрд░рд╕реБрд╕рд░ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╕реВрдбреЛ (рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рдирд╛ рд╣реИ, рдпрд╛ рд╡рд┐рд╢реЗрд╖ udv рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рд╣реИред рд╕рд┐рдВрдЯреИрдХреНрд╕ OS рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ (рд▓рд┐рдирдХреНрд╕ рдорд┐рдВрдЯ 15), /etc/udev/rules.d/41-atmega.rules рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрди рдирд┐рдпрдо рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ /etc/udev/rules.d/41-atmega.rules :

 # USBasp programmer SUBSYSTEM=="usb", ATTR{idVendor}=="16c0", ATTR{idProduct}=="05dc", GROUP="plugdev", MODE="0666" 


рдЙрд╕рдХреЗ рдмрд╛рдж, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдЖрдкрдХреЛ рд╕реЗрд╡рд╛ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
 service udev restart 

рдЖрдк рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╕реЗ рд╕реАрдзреЗ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рд╕рдВрдХрд▓рди рдФрд░ рдлреНрд▓реИрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЬреЛ рдЗрд╕реЗ рд╕рдВрджреЗрд╣ рдХрд░реЗрдЧрд╛), рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рд╣реИрдВ, рддреЛ AVR рдЧреНрд░рд╣рдг рдкреНрд▓рдЧ-рдЗрди рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдФрд░ рдЧреНрд░рд╣рдг рдкрд░реНрдпрд╛рд╡рд░рдг рд╕реЗ рд╕реАрдзреЗ рд╕рдм рдХреБрдЫ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред

рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рддрд╣рдд рдЖрдкрдХреЛ рдбреНрд░рд╛рдЗрд╡рд░ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдмрд╛рдХреА рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рд╣рд┐рдд рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╡рд┐рдВрдбреЛрдЬ рдореЗрдВ рдмрдВрдбрд▓ AVR Studio + eXtreme Burner рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдлрд┐рд░, рд╕рдм рдХреБрдЫ рдПрдХ рдзрдорд╛рдХреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╢реБрд░реВ рдХрд░реЗрдВ


рдЖрдк рджреЛрдиреЛрдВ рдХреЛрдбрд╛рдВрддрд░рдХ (AVR рдХреЛрдбрд╛рдВрддрд░рдХ) рдФрд░ C рдореЗрдВ AVR рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рд╣рд░ рдХрд┐рд╕реА рдХреЛ рдЕрдкрдиреА рдкрд╕рдВрдж рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдФрд░ рдЕрдкрдиреА рдкрд╕рдВрдж рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдкрдиреА рдкрд╕рдВрдж рдмрдирд╛рдиреА рдЪрд╛рд╣рд┐рдПред рдирд┐рдЬреА рддреМрд░ рдкрд░, рдореИрдВрдиреЗ рдкрд╣рд▓реА рдмрд╛рд░ рдЕрд╕реЗрдВрдмрд▓рд░ рдЪреБрдирдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред рдХреЛрдбрд╛рдВрддрд░рдХ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп, рдЙрдкрдХрд░рдг рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдпрд╣ рдорд╣рд╕реВрд╕ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╕реАрдзреЗ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рдЕрдВрджрд░реВрдиреА рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдЦреБрджрд╛рдИ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЖрдХрд╛рд░ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░реНрдпрдХреНрд░рдо, рд╡рд┐рдзрд╛рдирд╕рднрд╛ рднрд╛рд╖рд╛ рдЬреНрдЮрд╛рди рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред AVR рдЕрд╕реЗрдВрдмрд▓рд░ рдХреЗ рд╕рд╛рде рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ C рдореЗрдВ рд░реЗрдВрдЧ рдЧрдпрд╛ред

рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдФрд░ рдмреБрдирд┐рдпрд╛рджреА рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рддрдм рдореЗрд░реА рдмреЗрдЯреА рдиреЗ рдореЗрд░реА рдорджрдж рдХреА, рд╡рд╣ рд╢рддрд░рдВрдЬ рдореЗрдВ рд▓рдЧреА рд╣реБрдИ рд╣реИ, рдФрд░ рдПрдХ рдареАрдХ рджрд┐рди рдиреЗ рдШреЛрд╖рдгрд╛ рдХреА рдХрд┐ рд╡рд╣ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдорд░ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреА рд╣реИред рдмреИрдо! рдпрд╣рд╛рдБ рдпрд╣ рд╣реИ - рдкрд╣рд▓реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╡рд┐рдЪрд╛рд░! рдмреЗрд╢рдХ, рдЖрдк рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╣реА рдИрдмреЗ рдкрд░ рдСрд░реНрдбрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрдкрдиреА рдЦреБрдж рдХреА рдШрдбрд╝реА рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдХрд╛рд▓реЗ рд░рдВрдЧ рдХреЗ рд╕рд╛рде ... рдЙрд╣ ... рд╕рдВрдХреЗрддрдХ рдФрд░ рдмрдЯрди рдХреЗ рд╕рд╛рдеред рдЬрд▓реНрджреА рд╕реЗ рдирд╣реАрдВ рдХрд╣рд╛!

рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рджреЛ 7-рдЦрдВрдб рдбрд╛рдпреЛрдб рд╕рдВрдХреЗрддрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ред рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд 5 рдмрдЯрди рдереЗ - тАЬ 1тАЭ , тАЬ 2тАЭ , тАЬтАЭ , тАЬтАЭ рдФрд░ тАЬтАЭ ред рдЦреИрд░, рдЦреЗрд▓ рдХреЗ рдЕрдВрдд рдХреЗ рдзреНрд╡рдирд┐ рд╕рдВрдХреЗрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛ред рд╕рдм рдХреБрдЫ рдкрд╕рдВрдж рд╣реИред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЖрдВрдХрдбрд╝реЗ рд╕рдВрдХреЗрддрдХ рдФрд░ рдмрдЯрди рдХреЗ рд▓рд┐рдП рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдХрдиреЗрдХреНрд╢рди рдЖрд░реЗрдЦ рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВред рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╕рдордп рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:



рдбреАрдмреНрд░реАрдлрд┐рдВрдЧ


рдЪрд▓реЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЙрдореНрдореАрдж рд╣реИ, рдХрд╛рд░реНрдпрдХреНрд░рдо рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рд╕реЗ - main рдХрд╛рд░реНрдпред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕рдореЗрдВ рдХреБрдЫ рднреА рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рдирд╣реАрдВ рд╣реИ - рдкреЛрд░реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕, рдбреЗрдЯрд╛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдФрд░ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдмрдЯрди рдХреНрд▓рд┐рдХ рдХрд╛ рдПрдХ рдЕрдВрддрд╣реАрди рдЪрдХреНрд░ред рдареАрдХ рд╣реИ, sei() рдХреЛ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡реНрдпрд╡рдзрд╛рди рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред

 int main(void) { init_io(); init_data(); sound_off(); sei(); while(1) { handle_buttons(); } return 0; } 

рдЖрдЗрдП рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдЕрд▓рдЧ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

 void init_io() { // set output DDRB = 0xFF; DDRD = 0xFF; // set input DDRC = 0b11100000; // pull-up resistors PORTC |= 0b00011111; // timer interrupts TIMSK = (1<<OCIE1A) | (1<<TOIE0); TCCR0 |= (1 << CS01) | (1 << CS00); TCCR1B = (1<<CS12|1<<WGM12); //OCRn = (clock_speed / prescaler) * seconds - 1 OCR1A = (F_CPU / 256) * 1 -1; } 


I / O рдкреЛрд░реНрдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ - рдПрдХ рдирдВрдмрд░ DDRx рд░рдЬрд┐рд╕реНрдЯрд░ (рдЬрд╣рд╛рдВ x рдкреЛрд░реНрдЯ рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реБрдП рдЕрдХреНрд╖рд░ рд╣реИ) рдХреЛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдЯ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╕рдВрдмрдВрдзрд┐рдд рдкрд┐рди рдПрдХ рдЗрдирдкреБрдЯ рдбрд┐рд╡рд╛рдЗрд╕ рд╣реИ (0 рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ) рдпрд╛ рдЖрдЙрдЯрдкреБрдЯ (1 рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ)ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдбреАрдбреАрдЖрд░рдмреА рдФрд░ рдбреАрдбреАрдЖрд░рдбреА рдореЗрдВ 0xFF рдирдВрдмрд░ рднреЗрдЬрдХрд░ рд╣рдордиреЗ рдмреА рдФрд░ рдбреА рдЖрдЙрдЯрдкреБрдЯ рдкреЛрд░реНрдЯ рдмрдирд╛рдПред рддрджрдиреБрд╕рд╛рд░, DDRC = 0b11100000; рдХрдорд╛рдВрдб DDRC = 0b11100000; рдкреЛрд░реНрдЯ рд╕реА рдХреЗ рдкрд╣рд▓реЗ 5 рдкрд┐рди рдХреЛ рдЗрдирдкреБрдЯ рдкрд┐рди рдореЗрдВ рдФрд░ рд╢реЗрд╖ рдкрд┐рди рдХреЛ рд╕рдкреНрддрд╛рд╣рд╛рдВрдд рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рдХрдорд╛рдВрдб PORTC |= 0b00011111; рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ 5 рдЗрдирдкреБрдЯ рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рдкреБрд▓-рдЕрдк рдкреНрд░рддрд┐рд░реЛрдз рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдмрдЯрди рдЗрди рдЗрдирдкреБрдЯреЛрдВ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рджрдмрд╛рдП рдЬрд╛рдиреЗ рдкрд░, рдЙрдиреНрд╣реЗрдВ рдЬрдореАрди рдкрд░ рд▓реЙрдХ рдХрд░ рджреЗрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣, рдирд┐рдпрдВрддреНрд░рдХ рд╕рдордЭрддрд╛ рд╣реИ рдХрд┐ рдмрдЯрди рджрдмрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЛ рдЯрд╛рдЗрдорд░, рдЯрд╛рдЗрдорд░ 0 рдФрд░ рдЯрд╛рдЗрдорд░ 1 рдХреА рд╕реЗрдЯрд┐рдВрдЧ рд╣реИред рд╣рдо рд╕рдВрдХреЗрддрдХ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рджреВрд╕рд░реЗ рдХреЛ рд╣рд░ рд╕реЗрдХрдВрдб рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рдордп рдХреЛ рдЧрд┐рдирдиреЗ рдХреЗ рд▓рд┐рдПред рд╕рднреА рд╕реНрдерд┐рд░рд╛рдВрдХ рдФрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдорд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг ATmega8 рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдмрд╛рдзрд╛ рд╕реЗ рдирд┐рдкрдЯрдиреЗ

 ISR (TIMER0_OVF_vect) { display(); if (_buzzer > 0) { _buzzer--; if (_buzzer == 0) sound_off(); } } ISR(TIMER1_COMPA_vect) { if (ActiveTimer == 1 && Timer1 > 0) { Timer1--; if (Timer1 == 0) process_timeoff(); } if (ActiveTimer == 2 && Timer2 > 0) { Timer2--; if (Timer2 == 0) process_timeoff(); } } 


рдЬрдм рдЯрд╛рдЗрдорд░ рд╕рдХреНрд░рд┐рдп рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдмрд╛рдзрд╛ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ TIMER0_OVF_vect рд╣реИрдВрдбрд▓рд░ рд╣реИ, рдЬреЛ рд╕рдВрдХреЗрддрдХ рдкрд░ рд╕рдордп рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╣рддрд╛ рд╣реИ, рдФрд░ TIMER1_COMPA_vect, рдЬреЛ рдЙрд▓рдЯреА рдЧрд┐рдирддреА рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИред

рд╕рдВрдХреЗрддрдХ рдкрд░ рдирд┐рд╖реНрдХрд░реНрд╖

 void display() { display_number((Timer1/60)/10, 0b00001000); _delay_ms(0.25); display_number((Timer1/60)%10, 0b00000100); _delay_ms(0.25); display_number((Timer1%60)/10, 0b00000010); _delay_ms(0.25); display_number((Timer1%60)%10, 0b00000001); _delay_ms(0.25); display_number((Timer2/60)/10, 0b10000000); _delay_ms(0.25); display_number((Timer2/60)%10, 0b01000000); _delay_ms(0.25); display_number((Timer2%60)/10, 0b00100000); _delay_ms(0.25); display_number((Timer2%60)%10, 0b00010000); _delay_ms(0.25); PORTD = 0; } void display_number(int number, int mask) { PORTB = number_mask(number); PORTD = mask; } 


display рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕рдВрдХреЗрддрдХ рдореЗрдВ 9 рд╕рдВрдкрд░реНрдХ рд╣реИрдВ (рдкреНрд░рдмрдВрдзрди рдЦрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП 7, рдмрд┐рдВрджреБ рдХреЗ рд▓рд┐рдП 1 рдФрд░ рд╢рдХреНрддрд┐ рдХреЗ рд▓рд┐рдП 1)ред 4 рдЕрдВрдХреЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, 36 рд╕рдВрдкрд░реНрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдмрд╣реБрдд рдмреЗрдХрд╛рд░ред рдЗрд╕рд▓рд┐рдП, рдХрдИ рдЕрдВрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдХреЗрддрдХ рдХреЗ рд▓рд┐рдП рдмрд┐рдЯреНрд╕ рдХрд╛ рдирд┐рд░реНрд╡рд╣рди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:



рд╡реЛрд▓реНрдЯреЗрдЬ рдкреНрд░рддреНрдпреЗрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдкрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рд╕рдорд╛рди 8 рдирд┐рдпрдВрддреНрд░рдг рд╕рдВрдкрд░реНрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрдХреЗрддрдХ рдкрд░ рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдЙрдЪреНрдЪ рдЖрдЙрдЯрдкреБрдЯ рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде, рдпрд╣ рдЖрдВрдЦ рдХреЛ рдПрдХ рд╕реНрдерд┐рд░ рддрд╕реНрд╡реАрд░ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЖрд░реЗрдЦ рдореЗрдВ рджреЛрдиреЛрдВ рд╕рдВрдХреЗрддрдХ рдХреЗ рд╕рднреА 8 рд╢рдХреНрддрд┐ рд╕рдВрдкрд░реНрдХ рдкреЛрд░реНрдЯ рдбреА рдХреЗ 8 рдЖрдЙрдЯрдкреБрдЯ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реИрдВ, рдФрд░ рд╕рдВрдкрд░реНрдХреЛрдВ рдХреЗ 16 рдирд┐рдпрдВрддреНрд░рдг рдЦрдВрдб рдЬреЛрдбрд╝реЗ рдореЗрдВ рдФрд░ рдкреЛрд░реНрдЯ рдмреА рдХреЗ 8 рдЖрдЙрдЯрдкреБрдЯ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, 0.25 рдПрдордПрд╕ рдХреА рджреЗрд░реА рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рди рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдХреЗрддрдХ рдкрд░ рд╡рд╛рдВрдЫрд┐рдд рдЕрдВрдХ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред ред рдЕрдВрдд рдореЗрдВ, рд╕рдВрдХреЗрддрдХ рдХреЛ рд╡реЛрд▓реНрдЯреЗрдЬ рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдЖрдЙрдЯрдкреБрдЯ рдЕрдХреНрд╖рдо рд╣реИрдВ ( PORTD = 0; рдХрдорд╛рдВрдб PORTD = 0; )ред рдпрджрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдЕрдВрддрд┐рдо рдЕрдВрдХ рдкреНрд░рдХрд╛рд╢ рдХреЛ рдЬрд╛рд░реА рд░рд╣реЗрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдкреНрд░рджрд░реНрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓реА рдХреЙрд▓ рдирд╣реАрдВ рд╣реЛрдЧреА, рдЬреЛ рдмрд╛рдХреА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЗрд╕рдХреА рддреЗрдЬ рдЪрдордХ рдХреЛ рдЬрдиреНрдо рджреЗрдЧрд╛ред

рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ

 void handle_buttons() { handle_button(KEY_SETUP); handle_button(KEY_RESET); handle_button(KEY_PAUSE); handle_button(KEY_PLAYER1); handle_button(KEY_PLAYER2); } void handle_button(int key) { int bit; switch (key) { case KEY_SETUP: bit = SETUP_BIT; break; case KEY_RESET: bit = RESET_BIT; break; case KEY_PAUSE: bit = PAUSE_BIT; break; case KEY_PLAYER1: bit = PLAYER1_BIT; break; case KEY_PLAYER2: bit = PLAYER2_BIT; break; default: return; } if (bit_is_clear(BUTTON_PIN, bit)) { if (_pressed == 0) { _delay_ms(DEBOUNCE_TIME); if (bit_is_clear(BUTTON_PIN, bit)) { _pressed |= key; // key action switch (key) { case KEY_SETUP: process_setup(); break; case KEY_RESET: process_reset(); break; case KEY_PAUSE: process_pause(); break; case KEY_PLAYER1: process_player1(); break; case KEY_PLAYER2: process_player2(); break; } sound_on(15); } } } else { _pressed &= ~key; } } 


рдпрд╣ рдХрд╛рд░реНрдп рдмрджрд▓реЗ рдореЗрдВ рд╕рднреА 5 рдмрдЯрди рдХреЛ рджрдмрд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░реЗрд╕ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдпрджрд┐ рдХреЛрдИ рд╣реЛ bit_is_clear(BUTTON_PIN, bit) , рдЕрд░реНрдерд╛рддреН рдЬрд╛рдБрдЪ рдХрд░рдХреЗ рдкрдВрдЬреАрдХреГрдд рд╣реИ рдмрдЯрди рдХреЛ рджрдмрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рд╕рдВрдмрдВрдзрд┐рдд рдЗрдирдкреБрдЯ рдЬрдореАрди рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЖрд░реЗрдЦ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рдЬрдм рдмрдЯрди рджрдмрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЙрдиреНрдЯреИрдХреНрдЯ рдмрд╛рдЙрдВрд╕ рдХреЗ рдХрд╛рд░рдг рдХрдИ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдпрд╛рддреНрд░рд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП DEBOUNCE_TIME рдФрд░ DEBOUNCE_TIME рджреЗрд░реА рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЪрд░ рдХреЗ рд╕рдВрдЧрдд рдмрд┐рдЯреНрд╕ рдореЗрдВ рджрдмрд╛рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рд╣реЗрдЬрдирд╛ _pressed рдЙрдкрдпреЛрдЧ рдмрд╛рд░-рдмрд╛рд░ рдСрдкрд░реЗрд╢рди рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдмрдЯрди рдХреЛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рджрдмрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХреАрд╕реНрдЯреНрд░реЛрдХ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛рд░реНрдп рдХрд╛рдлреА рддреБрдЪреНрдЫ рд╣реИрдВ рдФрд░ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдкреВрд░рд╛ рдкрд╛рда
 #define F_CPU 4000000UL #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #define DEBOUNCE_TIME 20 #define BUTTON_PIN PINC #define SETUP_BIT PC0 #define RESET_BIT PC1 #define PAUSE_BIT PC2 #define PLAYER1_BIT PC3 #define PLAYER2_BIT PC4 #define KEY_SETUP 0b00000001 #define KEY_RESET 0b00000010 #define KEY_PAUSE 0b00000100 #define KEY_PLAYER1 0b00001000 #define KEY_PLAYER2 0b00010000 volatile int ActiveTimer = 0; volatile int Timer1 = 0; volatile int Timer2 = 0; volatile int _buzzer = 0; volatile int _pressed = 0; // function declarations void init_io(); void init_data(); int number_mask(int num); void handle_buttons(); void handle_button(int key); void process_setup(); void process_reset(); void process_pause(); void process_timeoff(); void process_player1(); void process_player2(); void display(); void display_number(int mask, int number); void sound_on(int interval); void sound_off(); // interrupts ISR (TIMER0_OVF_vect) { display(); if (_buzzer > 0) { _buzzer--; if (_buzzer == 0) sound_off(); } } ISR(TIMER1_COMPA_vect) { if (ActiveTimer == 1 && Timer1 > 0) { Timer1--; if (Timer1 == 0) process_timeoff(); } if (ActiveTimer == 2 && Timer2 > 0) { Timer2--; if (Timer2 == 0) process_timeoff(); } } int main(void) { init_io(); init_data(); sound_off(); sei(); while(1) { handle_buttons(); } return 0; } void init_io() { // set output DDRB = 0xFF; DDRD = 0xFF; // set input DDRC = 0b11100000; // pull-up resistors PORTC |= 0b00011111; // timer interrupts TIMSK = (1<<OCIE1A) | (1<<TOIE0); TCCR0 |= (1 << CS01) | (1 << CS00); TCCR1B = (1<<CS12|1<<WGM12); //OCRn = (clock_speed / prescaler) * seconds - 1 OCR1A = (F_CPU / 256) * 1 -1; } void init_data() { Timer1 = 0; Timer2 = 0; ActiveTimer = 0; } int number_mask(int num) { switch (num) { case 0 : return 0xC0; case 1 : return 0xF9; case 2 : return 0xA4; case 3 : return 0xB0; case 4 : return 0x99; case 5 : return 0x92; case 6 : return 0x82; case 7 : return 0xF8; case 8 : return 0x80; case 9 : return 0x90; }; return 0; } void process_setup() { Timer1 += 60; Timer2 += 60; // overflow check (5940 seconds == 99 minutes) if (Timer1 > 5940 || Timer2 > 5940) { Timer1 = 0; Timer2 = 0; } } void process_reset() { init_data(); } void process_timeoff() { init_data(); sound_on(30); } void process_pause() { ActiveTimer = 0; } void process_player1() { ActiveTimer = 2; } void process_player2() { ActiveTimer = 1; } void handle_button(int key) { int bit; switch (key) { case KEY_SETUP: bit = SETUP_BIT; break; case KEY_RESET: bit = RESET_BIT; break; case KEY_PAUSE: bit = PAUSE_BIT; break; case KEY_PLAYER1: bit = PLAYER1_BIT; break; case KEY_PLAYER2: bit = PLAYER2_BIT; break; default: return; } if (bit_is_clear(BUTTON_PIN, bit)) { if (_pressed == 0) { _delay_ms(DEBOUNCE_TIME); if (bit_is_clear(BUTTON_PIN, bit)) { _pressed |= key; // key action switch (key) { case KEY_SETUP: process_setup(); break; case KEY_RESET: process_reset(); break; case KEY_PAUSE: process_pause(); break; case KEY_PLAYER1: process_player1(); break; case KEY_PLAYER2: process_player2(); break; } sound_on(15); } } } else { _pressed &= ~key; } } void handle_buttons() { handle_button(KEY_SETUP); handle_button(KEY_RESET); handle_button(KEY_PAUSE); handle_button(KEY_PLAYER1); handle_button(KEY_PLAYER2); } void display() { display_number((Timer1/60)/10, 0b00001000); _delay_ms(0.25); display_number((Timer1/60)%10, 0b00000100); _delay_ms(0.25); display_number((Timer1%60)/10, 0b00000010); _delay_ms(0.25); display_number((Timer1%60)%10, 0b00000001); _delay_ms(0.25); display_number((Timer2/60)/10, 0b10000000); _delay_ms(0.25); display_number((Timer2/60)%10, 0b01000000); _delay_ms(0.25); display_number((Timer2%60)/10, 0b00100000); _delay_ms(0.25); display_number((Timer2%60)%10, 0b00010000); _delay_ms(0.25); PORTD = 0; } void display_number(int number, int mask) { PORTB = number_mask(number); PORTD = mask; } void sound_on(int interval) { _buzzer = interval; // put buzzer pin high PORTC |= 0b00100000; } void sound_off() { // put buzzer pin low PORTC &= ~0b00100000; } 



рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рдПрдХ рдмреНрд░реЗрдбрдмреЛрд░реНрдб рдкрд░ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:



рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рд╕рдм рд╕рд╛рдорд╛рди рдорд╛рдорд▓реЗ рдореЗрдВ рдбрд╛рд▓рдиреЗ, рд╢рдХреНрддрд┐ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдЖрджрд┐ рдХрд╛ рд╕рдордп рд╣реИред



рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╛ рдЕрдВрддрд┐рдо рджреГрд╢реНрдп рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╡реЙрдЪ рдХреЛ 9-рд╡реЛрд▓реНрдЯ "рдХреНрд░реЛрдирд╛" рдкреНрд░рдХрд╛рд░ рдХреА рдмреИрдЯрд░реА рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдЦрдкрдд - 55 рдПрдордПред



рдирд┐рд╖реНрдХрд░реНрд╖


рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдФрд░ рдХрд╛рдо рдХреЗ рдореВрд▓ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдг рдФрд░ рд╢рд╛рдо рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдкрд░ 20-25 рдбреЙрд▓рд░ рдЦрд░реНрдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рджрд┐рд▓рдЪрд╕реНрдк DIY рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдЦ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рд╣реИ, рдЬреЛ рдПрдХ рд╕рдордп рдореЗрдВ рдореБрдЭреЗ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рд╢реБрд░реВ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓, рд▓рдВрдмрд╛ рдпрд╛ рдорд╣рдВрдЧрд╛ рд╣реИред рдореЗрд░рд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░реЛ, рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдпрджрд┐ рд░реБрдЪрд┐ рдФрд░ рдЗрдЪреНрдЫрд╛ рд╣реИ - рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдПрдВ, рддреЛ рдЖрдкрдХреЛ рдкрдЫрддрд╛рд╡рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛!

рд╕рднреА рдХреЛ рд╢реБрднрдХрд╛рдордирд╛рдПрдБ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ!

PS рдФрд░ рдЕрдВрдд рдореЗрдВ, рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╡реАрдбрд┐рдпреЛ рдкреНрд░рджрд░реНрд╢рди:

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


All Articles