Малко се забавих с обяснението на прграмата, но продължавам.
И така да видим какво имаме в нашата програма. Първо чрез директивата include, включваме 2 файла с дефиниции "io.h" и "delay.h". Първия ни е небходим за да може да работим с портовете на процесора, а втория ни позволява да ползваме готови функции за генериране на закъснения.
След това следва дефиниция за тактовата честота микропроцесора, указваща на компилатора каква е реалната скорост на работа на микроконтролера. По нагоре, когато правихме настройките на нашия проект имаше подбна опция за тактовата честота. Реално и двата начина указват едно и също нещо, а кой точно ще ползваме е въпрос на предпочитание, все пак дефиницията в самия сорс файл е по универсално решение.
След това имаме дефинирана една функция delay_ms, но за нея по късно. Минаваме към нашата главна функция "main". Първото нещо, което правим е да инициализираме I/O порта на микроконторелера. Вхоно/ изходните портове (или за по кратко само портове) са връзката на микроконтролера с реалния свят, чрез тях той може да предава и приема информация. Реално всеки процесор разполага с няколко на брой порта, всеки от които е изграден от различен брой входно изходни лиинии, които са изведни на опрделени пинове на MCU Портовете се със двупосочни функции, могат да бъдат както входове така и изходи. В наши случай искаме да управляваме един свеотодиод закачен към порт D на микроконтролера. PORTD на ATMEGA8 разполага с 8 на брой линии, наименовани от PD0 до PD7 или накратко казано порта е 8 битовa големина. Нека да закачим светодиода към най малдшата линия PD0. За да може да упрвляваме светодиода трбява да конфигурираме въпрсония пин да работи като изход, това прави инструкцията: DDRD=0xFF (Реално тя конфигурира всички линии на PORTD, като изходи). И така следа като направихме тази инициализация влизаме в нашия основен цикъл. Обикновено при програмирането на MCU, това един безкраен цикъл в който се изпълняват всички неща от прогрмата. В нашия случай това е "while(1)" и сега да видим какво става в него: имаме "PORTD=0xFF", по този начин установяваме всички пинове на PORTD във високо ниво (5V) и светодиода който сложихме на PD0 ще получи напрежение и ще светне.
След това извикваме функцията delay_ms(250), която кара процесора да изчака и да безделничи 250ms
Защо се наложи да напиша допълнителна функция "delay_ms()", а не ползвам вградената функция "_delay_ms()" , която е дал Борислав? Обясненението се крие по начина по който се генерира закъснението, обикновено това става като се прави цикъл в който се повтарят определени инструкции на процесора и тъй като времето за изпълнение е фиксирано и като знаем тактовата честота, може да генерираме закъснението което ни е необходимо. Вградената функция _delay_ms() при честота на процесора 8MHz, може да генерира максимум около 32ms изчакване, така че за да увелича времето до 250ms, аз си направих "delay_ms()", За да направя закъснение 250ms, аз извиквам функцията "delay_ms" с параметър 250 тя от своя старана вика 250 пъти вградената функция "_delay_ms()" с параметър 1, т.е изчакване 1 ms.
Оттук нататък нещата са ясни, чакаме 250ms през което диода свети, след това имаме: "PORTD = 0x00;", установяваме PORTD в нула и по този начин спираме нарежението на светодиода и той угасва, чакаме отново 250ms, през това време светодиода не свети и после с връщаме в началото на цикъла и отново го запалаваме и така нещата се повтрят.
Леле колко много изписах, надявам се да е полезно ще почина малко. че ме заболя пръстите от писане