А) старт программы
В МК программа стартует автоматически после подачи питания и наличии "1" на ножке RESET. Т.е. на Си ни чего специального писать не надо.
Но мы напишем то с чего обычно начинается программа на Си.
А программа на Си начинается с директив препроцессора (это тот, кто готовит текст программы к компиляции). Например, вот так:
|
|
|
| #include <mega16.h>
#define PA_OUT DDRA = 0xFF
|
|
|
|
| #include<> - означает, что вместо #....> препроцессор должен подставить текст файла - mega16.h - в нем описаны регистры МК и именно ATmega16, чтобы компилятор знал их физические адреса в МК и не ругался когда увидит их в тексте вашей программы!
#define AAA BBB - означает что препроцессор компилятора перед компиляцией программы заменит в ее тексте все найденные AAA на то, что стоит правее пробела после AAA.
PA_OUT заменили на DDRA = 0xFF
Для выполнения пунктов б) и в) алгоритма, вынесем отдельно функцию инициализации.
// ++++ функция инициализации МК ++++ void initialization(void){
PA_OUT;//сделать PORTA выходом
TCCR0 = 0x05;/* таймер включить считать с частотой 1024 раз меньше чем тактовая.*/ }
void initialization(void){
}
PA_OUT;//сделать PORTA выходом
будет заменена препроцессором перед компиляцией в соответствии с написанной выше директивой #define на:
DDRA = 0xFF;
Эта строка означает - поместить в переменную DDRA (в данном случае это регистр допускающий запись в него) число 0xFF.
Это десятичное число 255, а в двоичном виде 0b1111 1111
Значит после выполнения этой строчки программы все биты регистра DDRA станут "1" (т.е. будут установлены). Пункт б) выполнен.
TCCR0 = 0x05;
поместит в переменную TCCR0 (регистр МК TCCR0) число 0b00000101 (это и есть 0x05 или в десятичном виде число 5) - т.е. биты 2 и 0 "установятся" - значит станут единицами, а бит 1 останется "0".
Далее создадим единственную обязательную для программы на Си функцию main.
main(){
}
в ней вначале вызовем функцию инициализации МК и затем
напишем безусловный цикл:
while(1){
};
// ++++ Главная функция ++++ void main (void){ initialization(); /* Вызвать (== выполнить) функцию инициализации МК */
//Бесконечный цикл while (1){ //Делать всегда
PORTA++; //добавить 1 к значению в PORTA
while (!(TIFR&0x01)); // ждем установки флага переполнения timer0 TIFR = 0x01; // очистить флаг переполнения timer0 }; //цикл while (1)закончен }
|
|
|
|
Цикл:
while (1){};
" бесконечный " потому, что в скобках где стоит условие его выполнения написана константа - число 1 - это "не ноль" значит "истина" в Си - поэтому цикл будет выполняться пока есть питание МК и нет "ресета".
PORTA++; //добавить 1 к значению в PORTA
Берет число из переменной с именем PORTA, добавляет к ней 1 и результат помещает обратно в переменную PORTA.
while (!(TIFR&0x01)); // ждем установки флага переполнения timer0
это условный цикл:
while (условие){};
Без тела - т.е. он ничего не выполняет, а лишь проверяет условие в скобках на "истинность" так часто насколько возможно по скорости МК и до тех пор пока не обнаружит, что условие в скобках "ложно" - тогда программа закончит этот цикл и пойдет ниже, на следующую строчку кода.
когда таймер переполнится, программа покинет цикл:
while (!(TIFR&0x01));
Т.е. программой выполнен пункт алгоритма д) ждать переполнения таймера.
Следующий пункт алгоритма е) очистить признак переполнения таймера.
нужно выполнить для того чтобы и в следующий раз засечь переполнение таймера_0.
TIFR = 0x01; // очистить флаг переполнения timer0
помещает число 1 в регистр т.е. именно вписывает логическую»1" в бит_0 - тем самым очищает флаг и выполняет пункт алгоритма е) очистить признак переполнения таймера.
Последний пункт алгоритма ж) перейти к пункту г) не требует написания специального кода - он выполняется автоматически, так как программа выполнила все «тело» цикла, и сама перейдет опять в начало цикла, т.е. к пункту алгоритма - г).

Рисунок 1.7 – выполненное техническое задание
Date: 2016-01-20; view: 631; Нарушение авторских прав Понравилась страница? Лайкни для друзей: |
|
|