Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
А) старт программыВ МК программа стартует автоматически после подачи питания и наличии "1" на ножке RESET. Т.е. на Си ни чего специального писать не надо. Но мы напишем то с чего обычно начинается программа на Си. А программа на Си начинается с директив препроцессора (это тот, кто готовит текст программы к компиляции). Например, вот так:
#include<> - означает, что вместо #....> препроцессор должен подставить текст файла - mega16.h - в нем описаны регистры МК и именно ATmega16, чтобы компилятор знал их физические адреса в МК и не ругался когда увидит их в тексте вашей программы! #define AAA BBB - означает что препроцессор компилятора перед компиляцией программы заменит в ее тексте все найденные AAA на то, что стоит правее пробела после AAA. PA_OUT заменили на DDRA = 0xFF Для выполнения пунктов б) и в) алгоритма, вынесем отдельно функцию инициализации. // ++++ функция инициализации МК ++++ 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){
};
Цикл: while (1){}; " бесконечный " потому, что в скобках где стоит условие его выполнения написана константа - число 1 - это "не ноль" значит "истина" в Си - поэтому цикл будет выполняться пока есть питание МК и нет "ресета". PORTA++; //добавить 1 к значению в PORTA Берет число из переменной с именем PORTA, добавляет к ней 1 и результат помещает обратно в переменную PORTA. while (!(TIFR&0x01)); это условный цикл: while (условие){}; Без тела - т.е. он ничего не выполняет, а лишь проверяет условие в скобках на "истинность" так часто насколько возможно по скорости МК и до тех пор пока не обнаружит, что условие в скобках "ложно" - тогда программа закончит этот цикл и пойдет ниже, на следующую строчку кода. когда таймер переполнится, программа покинет цикл: while (!(TIFR&0x01)); Т.е. программой выполнен пункт алгоритма д) ждать переполнения таймера. Следующий пункт алгоритма е) очистить признак переполнения таймера. нужно выполнить для того чтобы и в следующий TIFR = 0x01; помещает число 1 в регистр т.е. именно вписывает логическую»1" в бит_0 - тем самым очищает флаг и выполняет пункт алгоритма е) очистить признак переполнения таймера. Последний пункт алгоритма ж) перейти к пункту г) не требует написания специального кода - он выполняется автоматически, так как программа выполнила все «тело» цикла, и сама перейдет опять в начало цикла, т.е. к пункту алгоритма - г). Рисунок 1.7 – выполненное техническое задание
|