Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






А) старт программы





В МК программа стартует автоматически после подачи питания и наличии "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: 545; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.006 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию