Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции / ТСАиУ.doc
Скачиваний:
57
Добавлен:
22.02.2014
Размер:
1.28 Mб
Скачать

If (выражение) оператор_1 else оператор_2

Если выражение не равно нулю, то условие считается истинным и выполняется оператор_1. В противном случае выполняется оператор_2. Существует также сокращённая форма записи, в которой отсутствуют else и оператор_2. В этом случае при равенстве нулю выражения никаких действий не выполняется. Оператор_1 и оператор_2 тоже могут быть условными. При вложенных условных операторах каждое else соответствует ближайшему предшествующему if.

Фрагмент управляющей программы для контроллера Atmel AT90S2313. В этом фрагменте рассмотрен условный ввод информации через параллельный порт В.

DDRB=0x0F; //Выводы В0 - В3 порта В настроены на "ВЫХОД",

//Выводы В4 - В7 порта В настроены на "ВХОД",

PORTB.7=PINB.7; //Приём сигнала, поступившего на вывод В7

if (PORTB.7= =1) //Проверка условия равенства 1 входного сигнала

oj=PORTB.7; //Переменной oj присваивается значение 1

else //В противном случае выполняется

{PORTB=PINB; // следующий составной оператор

com=PORTB;

com=com>>4;

PORTB=com;}

Переключатель (switch) используется, когда программа разветвляется более чем по двум направлениям. Синтаксис переключателя:

switch (переключающее выражение)

{case константное_выражение_1: операторы_1;

case константное_выражение_2: операторы_2;

...

case константное_выражение_n: операторы_n;

break;

default: операторы;

}

Переключатель передаёт управление тому оператору, для которого константное выражение совпадает с переключающим. Переключающее выражение должно быть целочисленным или приводимым к целому. Если переключающее выражение не совпадает ни с одним из константных выражений, то выполняется оператор, следующий за меткой default:. С помощью оператора break осуществляется выход из переключателя. Этот оператор может стоять после любого константного выражения и даже после каждого из них.

Фрагмент управляющей программы:

// Place your code here

DDRB=0x0F; //Выводы В0 - В3 порта В настроены на "ВЫХОД",

//Выводы В4 - В7 порта В настроены на "ВХОД",

PORTB=PINB; // Информация об адресе с выводов

// контроллера PINB передана в PORTB

adr=PORTB&0xF0; // Информация об адресе содержится в 4-х

// старших разрядах регистра данных PORTB

switch (adr)

{case 0x10:DDRB=0x0F; // Передача информации по адресу 0х10

PORTB=0x0A;break;

case 0x20:DDRB=0xF0; // Передача информации по адресу 0х20

PORTB=0xA0;break;

case 0x30:DDRD=0x7A; // Передача информации по адресу 0х30

PORTD=0x52;break;

default: break;

Структура цикла. Существуют три вида операторов цикла:

- цикл с предусловием:

while(выражение - условие)

тело_цикла

- цикл с постусловием:

do

тело_цикла

while (выражение - условие)

- итерационный цикл:

for (инициализация цикла;

выражение - условие;

список_выражений)

тело цикла

При выполнении цикла с предусловием сначала вычисляется значение

выражения - условия. Если оно истинно, то выполняются операторы тела цикла, после чего вновь проверяется значение выражения - условия и если оно равно нулю (то есть ложно), то выполняется оператор, следующий за телом цикла.

Процесс написания и отладки программ работы контроллеров является сложным и трудоёмким и должен быть автоматизирован. Для контроллеров фирмы Atmel это автоматический синтезатор программ CodeVisionAVR и отладчик AVR Studio.

Фрагмент такой программы приведён ниже.

/*********************************************

Project : Изучение элементов языка С в среде CodeVisionAVR.

Version :

Date : 11.03.2007

Author : ТАА

Company : А и У

Comments: Рассмотрены структура текста программы, процессы

инициализации вспомогательных регистров устройств контроллера

и вопросы размещения в памяти переменных различных типов.

Chip type : AT90S2313

Clock frequency : 7,372800 MHz

Memory model : Tiny

Internal SRAM size : 128

External SRAM size : 0

Data Stack size : 32

*********************************************/

#include <90s2313.h> /*Включение библиотечного заголовочного файла, содержащего прототипы функций и описания объектов, используемых при написании программ для контроллера 90s2313 с помощью препроцессорной команды.*/

// External Interrupt 0 service routine – описание 0 функции внешнего //прерывания

interrupt [EXT_INT0] void ext_int0_isr(void)

{

// Place your code here – здесь следует размещать операторы, которые

//должны быть выполнены по сигналу прерывания.

}

// External Interrupt 1 service routine

interrupt [EXT_INT1] void ext_int1_isr(void)

{

// Place your code here

}

// Standard Input/Output functions

#include <stdio.h> /*Включение стандартного библиотечного заголовочного файла, содержащего прототипы функций ввода / вывода, используемых при написании программ для контроллера 90s2313 с помощью препроцессорной команды.*/

// Timer 0 overflow interrupt service routine – описание функции //прерывания программы при переполнении Таймера 0.

interrupt [TIM0_OVF] void timer0_ovf_isr(void)

{

// Place your code here

}

// Timer 1 overflow interrupt service routine

interrupt [TIM1_OVF] void timer1_ovf_isr(void)

{

// Place your code here

}

// Declare your global variables here

char a=0xa,e=0xe;

/*Глобальные переменные могут размещаться в рабочих

регистрах с номерами 0 <= R <16 или в области глобальных

переменных SRAM (адреса от 60h+Data Stack Size )*/

char *p=&a; /* Указатель на объект типа char, начальное

значение которого равно содержимому ячейки памяти, отведённой

для переменной а*/

void main(void) //Главная функция

{

// Declare your local variables here

char b=0xb,d=0xd; volatile char c=0xc;

/* Локальные переменные могут размещаться в рабочих

регистрах с номерами 16 <= R <= 31 или в стеке

данных (Data Stack Area of SRAM)

volatile - непостоянный, изменчивый - переменная может

измениться в произвольный момент времени и поэтому не может

храниться в регистровой памяти */

// Input/Output Ports initialization

// Port B

PORTB=0x30; // Регистр данных порта В

DDRB=0x0F; // Регистр направления данных порта В

// Port D

PORTD=0x7D;

DDRD=0x02;

// Timer/Counter 0 initialization – инициализация (определение

начального состояния) таймера/счётчика 0

// Clock source: System Clock – задающее устройство: системный

// генератор

// Clock value: 7,200 kHz – частота системного генератора: 7,200 кГц

// Mode: Output Compare – режим работы: сравнение выходного

// значения

// OC0 output: Disconnected – ОС0 вывод: не соединён

TCCR0=0x05; // Регистр управления таймером / счётчиком Т/С0

TCNT0=0x00; // Регистр состояния таймера / счётчика Т/С0

// Timer/Counter 1 initialization

// Clock source: System Clock

// Clock value: 7372,800 kHz

// Mode: Output Compare

// OC1 output: Discon.

// Noise Canceler: Off – функция подавления шума отключена

// Input Capture on Falling Edge – захват входа по спаду импульса

TCCR1A=0x00; // Регистр А управления таймером / счётчиком Т/С1

TCCR1B=0x01;

TCNT1H=0x00; // Регистр состояния таймера / счётчика Т/С1

TCNT1L=0x00;

OCR1H=0x00; // Регистр сравнения выхода таймера / счётчика Т/С1

OCR1L=0x00;

// External Interrupt(s) initialization – инициализация (определение

//начального состояния) устройства управления внешними

//прерываниями

// INT0: On

// INT0 Mode: Rising Edge

// INT1: On

// INT1 Mode: Rising Edge

GIMSK=0xC0; // Регистр масок внешних прерываний

MCUCR=0x0F;

GIFR=0xC0;

// Timer(s)/Counter(s) Interrupt(s) initialization

TIMSK=0x82; // Регистр масок прерываний от таймеров / счётчиков

// UART initialization – инициализация (определение начального

// состояния) универсального асинхронного приёмопередатчика

// Communication Parameters: 8 Data, 1 Stop, No Parity – параметры

//связи: 8бит данные, 1бит стоп, нет проверки на чётность

// UART Receiver: On

// UART Transmitter: On

// UART Baud rate: 9600 – скорость передачи 9600 Бод (бит/с)

UCR=0x18; //Регистр управления асинхронным приёмопередатчиком

UBRR=0x2F; //Регистр Бод - генератора, управляющего скоростью

//передачи

// Analog Comparator initialization

// Analog Comparator: Off

// Analog Comparator Input Capture by Timer/Counter 1: Off

ACSR=0x80;

// Global enable interrupts

#asm("sei") // Разрешение прерываний на языке ассемблера

while (1) // Бесконечный цикл

{

// Place your code here

a=0xA0;

b=0xB0;

d=0xD0;

PORTB=a; // В регистр данных порта В записывается переменная а

PORTB=&a; // В регистр данных порта В записывается адрес

// переменной а

d= *p; // Переменной d присваивается значение некоторой

// величины, хранящейся в ячейке с адресом, на

//который указывает указатель *p

*p=++*p; // значение некоторой величины, хранящейся в ячейке с

//адресом,на который указывает указатель *p увеличивается на 1

d= *p;

p=++p; // значение адреса ячейки, на которую указывает

//указатель *р увеличивается на 1

d= *p;

c=0xD; // переменной volatile char c присваивается новое значение

};

}

Приведём пример использования функций в языке С.

/*********************************************

Project : Изучение функций в языке С

Version : a5.prj

Date : 17.04.2007

Author : ТАА

Company : АиУ

Comments:

Chip type : AT90S2313

Clock frequency : 7,372800 MHz

Memory model : Tiny

Internal SRAM size : 128

External SRAM size : 0

Data Stack size : 32

*********************************************/

#include <90s2313.h>

// External Interrupt 0 service routine

interrupt [EXT_INT0] void ext_int0_isr(void)

{

// Place your code here

}

// External Interrupt 1 service routine

interrupt [EXT_INT1] void ext_int1_isr(void)

{

// Place your code here

}

// Standard Input/Output functions

#include <stdio.h>

// Declare your global variables here

//По умолчанию функция глобальна, то есть доступна при

//определённых условиях во всех модулях программы. Для этого в

//программе до момента вызова должно быть описание

//(прототип) или (и) определение функции.

char a,b,c; //Глобальные переменные типа char

char *p=&c; //Указатель на объект типа char,

//инициализированный значением переменной с

char d @0x02; //Для хранения переменной d отводится

// регистр R2

char i(char ,char ); //Прототип функции i двух аргументов типа

//char, возвращающей значение типа char. В конце

//строки должен быть символ ";"

/*Описание функции i(операция & - поразрядная конъюнкция "И"

переменных типа char. В конце строки нет символа ";" */

char i(char a,char b)

{c=a&b;

return c;} //Возвращаемое значение - переменная с

void main(void)

{

.

// Global enable interrupts

#asm("sei")

while (1)

{

// Place your code here

a=0xfe;

b=0x03;

d=i( a,b); //Вызов функции i с фактическими параметрами a,b

d=0; // Для изучения операции *p – взятие значения по адресу –

//обнуляем переменную d, чтобы проследить за её

// дальнейшими преобразованиями

d=*p; //Переменной d присваивается значение, хранящееся по

//адресу, на который указывает указатель p, то есть

//содержимое ячейки с адресом с.

};

}