- •Введение.
- •Глава 1. Первый уровень иерархии систем автоматизации и управления – логические элементы Лабораторная работа №1. Логические элементы малой степени интеграции.
- •1.1 Формальный язык описания логических элементов.
- •1.2. Функционально полные наборы логических элементов.
- •Элемент и – не Элемент или – не
- •1.4 Работа в среде графического программирования LabView.
- •Типа не и и-не.
- •1.5. Порядок выполнения лабораторной работы №1.
- •Лабораторная работа №2. Логические элементы средней степени интеграции.
- •1.8. Порядок выполнения лабораторной работы №2.
- •Глава 2. Первый уровень иерархии систем автоматизации и управления – элементы памяти Лабораторная работа №3. Изучение принципов работы элементов памяти
- •2.1 Элементы памяти.
- •2.2 Конечные автоматы средней степени интеграции – двоичные счетчики и регистры
- •2.2.1. Счётчики импульсов
- •2.3. Работа в среде визуального редактора Visual Basic 6.0.
- •2.3.1. Интерфейс и форма
- •2.3.2. Программа выполнения логических операций с переменными типа «Byte».
- •2.3.3. Программа выполнения логических операций с переменными типа «Boolean».
- •2.4. Порядок выполнения лабораторной работы №3.
- •Глава 3. Первый уровень иерархии систем автоматизации и управления – элементы силовой электроники
- •3.1 Элементы силовой электроники систем управления
- •3.2 Устройства связи с объектами (усо).
- •Глава 4. Второй и третий уровни иерархии систем автоматизации и управления – микропроцессоры и контроллеры Лабораторная работа №4. Изучение принципов работы контроллера
- •4.1 Контроллер.
- •4.3 Создание управляющей программы контроллера.
- •4.3. Порядок выполнения лабораторной работы №4.
- •Глава 5. Создание программы управления объектом Лабораторная работа №5. Изучение процесса проектирования системы автоматизированного управления 5-го уровня иерархии.
- •5.1 Некоторые положения языка с, наиболее часто применяемые при программировании контроллеров.
- •If (выражение) оператор_1 else оператор_2
- •5.2 Программа обмена информацией между управляющей эвм и контроллером
- •Текст программы управления обменом информацией для контроллера через универсальный асинхронный приёмопередатчик – uart.
- •5.3 Порядок выполнения лабораторной работы №5
- •Заключение
- •Библиографический список
- •Глава 1. Первый уровень иерархии систем автоматизации и
- •Глава 2. Первый уровень иерархии систем автоматизации
- •2.2 Конечные автоматы средней степени интеграции – двоичные счетчики и регистры…………………………………..24
- •Глава 3. Первый уровень иерархии систем автоматизации
- •Глава 4. Второй и третий уровни иерархии систем автоматизации
- •Глава 5. Создание программы управления объектом……………………...52
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, то есть
//содержимое ячейки с адресом с.
};
}