Автор: Пользователь скрыл имя, 15 Мая 2012 в 12:31, курсовая работа
Системы автоматического управления эффективно решают задачи на уровнях, начинающихся от управления отдельными узлами и устройствами и заканчивающихся управлением технологическими установками и целыми производствами. В системах автоматизации применяются различные средства реализации алгоритмов управления. В настоящее время, несмотря на определенные особенности применения, наиболее эффективными являются цифровые методы и средства.
Введение 2
Теоретические сведения: 3
Цель работы: 5
Задание: 5
Ход работы: 6
1. Основные блоки функциональной схемы: 7
1.1 Микроконтроллер 7
1.2 Приёмо-передатчик 8
1.3 Цепи тактирования 9
1.4 Геркон 9
1.5 Клавиатура 10
1.6 Устройства вывода 10
2. Программная реализация алгоритма. 11
2.1 Алгоритм работы 11
2.2 Пульт оператора 11
Заключение 11
Приложение…………….………………………………………………………………………………………….12
3.1 Принципиальная схема…………………………………………………………………………………12
3.2 Листинг АРМ ..…………………….…………………………………………………………………………13
3.2 Листинг устройства низкого уровня ..…………………….…………….…………………...…23
Список литературы 29
Кнопки имеют такой недостаток как дребезг контактов который затрудняет отслеживание момента нажатия кнопки, так как контроллер может отследить не одно нажатия, что может привести к нежелательным последствия. Есть несколько методов борьбы с этим. Один из них, который используется в данной системе - это введение временной задержки по появлению лог 0, которая должна быть больше времени дребезга контактов.
После нажатия кнопки «Считать» на АРМ формируется временная задержка для антидребезга, далее проверяется условие разрешения передачи данных (бит UDRE). После передаём символ G в устройство низкого уровня по интерфейсу RS485. После прихода символа G в устройство низкого уровня, считываем состояние всех датчиков в переменную Data_Ger. Далее проверяем условие разрешения передачи данных . После передаём переменную Data_Ger в АРМ.
По приходу переменной в USART, присваиваем значение входного буфера данных переменной Data_Ger и выводим эту переменную на LCD в двоичном виде.
Практически в любой системе управления необходимы функции настройки режимов работы. Как правило, функции настройки и отображения, доступны оператору системы управления жестко определяются при проектировании и строго ограничены. Это позволяет создать специализированный интерфейс оператора с заранее заданным набором функций и поэтому использовать для его реализации алгоритм «меню».
В нашей системе управления в качестве пульта оператора выступает одна кнопка «Считать».
С которой и производится запуск обмена данных.
В
проделанной работе я ознакомилась
с архитектурой микроконтроллера семейства
AVR ATmega 8 и приобрела навыки разработки
системы управления на основе микроконтроллера
с использованием периферийных устройств.
В итоге я получила алгоритм для проектирования
устройства, основными задачами которого
являются, отслеживание состояния датчиков,
сбор данных, передача данных, приём данных,
вывод данных на LCD.
include <mega8.h>
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC
7
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE
(1<<RXC)
// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE<256
unsigned char
rx_wr_index,rx_rd_index,rx_
#else
unsigned int
rx_wr_index,rx_rd_index,rx_
#endif
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
}
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif
// USART Transmitter buffer
#define TX_BUFFER_SIZE 8
char tx_buffer[TX_BUFFER_SIZE];
#if TX_BUFFER_SIZE<256
unsigned char
tx_wr_index,tx_rd_index,tx_
#else
unsigned int
tx_wr_index,tx_rd_index,tx_
#endif
// USART Transmitter interrupt service routine
interrupt [USART_TXC] void usart_tx_isr(void)
{
if (tx_counter)
{
--tx_counter;
UDR=tx_buffer[tx_rd_index];
if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
};
}
#ifndef _DEBUG_TERMINAL_IO_
// Write a character to the USART Transmitter buffer
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while (tx_counter == TX_BUFFER_SIZE);
#asm("cli")
if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
{
tx_buffer[tx_wr_index]=c;
if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
++tx_counter;
}
else
UDR=c;
#asm("sei")
}
#pragma used-
#endif
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>
void ZADERGKA_knopok
(void){
TCNT0=0x00;
while(TCNT0<0x32){};
}
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
ZADERGKA_knopok();
while (!(UCSRA.5));
UDR = 'G';
}
// Standard Input/Output functions
#include <stdio.h>
// Declare your global variables here
unsigned char Data_Ger; //Переменная состояния всех датчиков
unsigned char buffer_bin [7];
void main(void)
{
// Declare
your local variables here
// Input/Output Ports initialization
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x04;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 0,977 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Low level
// INT1: Off
GICR|=0x40;
MCUCR=0x00;
GIFR=0x40;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600 (Double Speed Mode)
UCSRA=0x02;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// LCD module initialization
lcd_init(16);
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
if (rx_counter) {
/* выполнить ЭТОТ код если в буфере есть не считанные символы, данные */
Data_Ger = getchar();
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Сос-е датчиков");
sprintf (buffer_bin, %7b, Data_Ger);
lcd_gotoxy(0,1);
lcd_puts(buffer_bin);
};
};
}
#include <mega8.h>
// Standard Input/Output functions
#include <stdio.h>
bit dat_1; //Переменные состояния датчиков
bit dat_2;
bit dat_3;
bit dat_4;
bit dat_5;
bit dat_6;
bit dat_7;
bit dat_8;