Курсовая работа: Проектирование удаленного устройства индикации

Рис.1 Схема включения микроконтроллера
2.2 Формирование тактовых импульсов
Тактовые импульсы для работы микроконтроллера можно формировать с помощью либо встроенного генератора импульсов, либо подключая внешний генератор на кварцевом резонаторе. Внутренний генератор тактовых импульсов в нашем случае не обеспечит необходимую стабильность для работы с интерфейсом RS-485, поэтому мы будем использовать внешний кварцевый генератор на 7.3728 MHz. Для работы на такой частоте разработчики фирмы ATMEL советуют использовать два дополнительных конденсатора емкостью 22 pF, включенные по следующей схеме:

2.3 Схема сброса
Схема сброса должна формировать импульс логического нуля для подачи его на инверсный вывод сброса микроконтроллера RESET. Это импульс должен формироваться при, например, нажатии на кнопку сброса устройства или при переключении ключа. Кроме этого, этот сигнал сброса должен подаваться и на вывод сброса LCD - дисплея.
Для такой схемы подходит включение транзистора, показанное на рис.3. Когда ключ открыт, транзистор находится в закрытом
состоянии и на входы RESET AVR и RST LCD-дисплея поступает сигнал логической единицы. Когда ключ замыкается, транзистор открывается и на входы сброса устройств поступает сигнал логического нуля.

Рис.3 Схема формирования сигнала сброса
2.4 Схемы входных и выходных устройств
Входным устройством в нашем проекте является микросхема обеспечения связи по протоколу передачи данных RS-485 МАХ 485 со следующими электрическими характеристиками:
Из этих параметров видно, что микросхема МАХ485 согласуется с микроконтроллером ATmegal6.

Рис. 4 Подключение микросхемы MAX4S5
Выходное устройство жидкокристаллический графический дисплей BG12864D фирмы Bolymin со встроенным контроллером Т6963С. Этот дисплей обладает следующими характеристиками:
• Механические характеристики
• Назначение выводов
В соответствии с этими параметрами схема подключения LCD-дисплея к микроконтроллеру будет следующей:

2.5 Схема стабилизатора напряжения
В качестве стабилизатора напряжения в нашем устройстве используется импульсный понижающий стабилизатор LM2574, который обладает следующими характеристиками:
• входное напряжение - до 60 V {для HV версий)
• выходное напряжение - 3.3 V, 5 V, 12 V, 15V
• выходной ток - 0.5 А
Схема включения стабилизатора для преобразования +10 V - +5 V приведена на рис.6:

Рис. 6 (Схема стабилизатора напряжения
3. Проектирование программного обеспечения микроконтроллера
3.1 Проектирование функции инициализации микроконтроллера
Процедура инициализации микроконтроллера должна состоять из процедур или операторов инициализации всех узлов самого микроконтроллера и всех периферийных устройств, и установить все начальные значения для их регистров. Таким образом, мы должны проинициализировать следующие узлы устройства - порт А, порт С, УСАПП, таймер 0 и LCD-дисплей.
Порты А и С в начале работы устройства работают только на вывод данных, поэтому при их настройке необходимо в соответствующие регистры DDRx записать значение 0, тем самым настроив все их выводы на передачу
данных. Для этого используются две процедуры;
void InitPortAWrite(void){
DDRA = Oxff; }
void
InitPortCWrite(void){ DDRC = Oxff; PORTC = 0x30;
Инициализация таймера О проходит по следующему алгоритму - устанавливается делитель частоты на 1024 записью значения 5 в регистр TCCRO. Затем разрешается прерывание этого таймера и устанавливается его начальное значение:
void InitTimer(void)
i
_disable_interrupt() ;
TCCRO = 5;// установить делитель частоты 1024
TIMSK |= (1 « TOIEO); // разрешить прерывания таймера
TCNTO = TmrO_Reload;
enable_interrupt{);
]
Инициализация УСАПП работает следующим образом - в регистр
UBRR записывается значение, которое соответствует заданной скорости передачи данных для соответствующей частоты работы микроконтроллера.
УСАПП и параметры кадра данных.
Кроме этого, т.к. прием и обработка данных в программе происходит через кольцевой
буфер, то в процедуре инициализации необходимо провести начальные установки для
головы и хвост буфера - обнулить их.
void USART_Init( unsigned
int baudrate )
i
unsigned char x;
UBRROH = (unsigned
char) (baudrate»8) ; UBRROL = (unsigned char) baudrate;
UCSRB = ( (3«UCSZO)
3.2 Проектирование процедур обработки прерываний
В процессе работы нашего
устройства могут возникнуть два прерывания - от таймера 0 и от УСАПП.
Прерывание от таймера О обрабатывается очень просто: перезагружается начальное
значение и флаг его срабатывания устанавливается в 1.
pragma
vector=TIMERO_OVF_vect
interrupt void
TIMERO_OVF_interrupt(void)
{
TCNT0=TmrO_Reload; TmrOFlag = 1;
}
Прерывание от УСАПП говорит о том, что прием пакета данных был закончен и принят в буферный регистр UDR. Обработчик этого прерывания должен принять эти данные и поместить в кольцевой буфер. Для этого должен быть рассчитан новый индекс буфера (указатель головы) и если этот индекс вдруг стал равен указателю хвоста, это говорит о том, что произошла ошибка и буфер
приемника переполнился.
^pragma
vector=USART_RXC__vect
^interrupt void
USART_RX_interrupt{ void )
{
unsigned char data;
unsigned char tmphead;
data = UDR;
tmphead = (
USART_RxHead + 1 );
USART_RxHead = tmphead; /* Сохранить новый индекс V
if < tmphead ==
USART_RxTail )
(
/* Ошибка! Буффер приемника переполнен */
)
USART_RxBuf[tmphead] = data; /* Сохранить полученные данные в буффере */
}
3.3 Проектирование процедур ввода информации
Ввод информации в разрабатываемое устройство осуществляется через УСАПП по протоколу RS-4 85. Как уже отмечалось, прием данных в программе происходит по прерыванию от УСАПП, обработчик которого помещает принятый байт в Оуфер приемника. В главной
программе, для того, чтобы можно было анализировать этот буфер и читать данные уже непосредственно из него, необходима процедура, которая будет доставать данные из буфера таким образом, чтобы первыми поступали байты, попавшие в буфер раньше всех. Это делает процедура USART_Receive(), которая сначала ждет поступления данных в буфер, а затем по одному байту достает их оттуда.
BYTE USART_Receive(
void )
1
unsigned char tmptail;
while ( USARTJixHead ==
USART_RxTail )
;
tmptail = USART_RxTail
+ 1; USART_RxTail = tmptail; return USART_RxBuf[tmptail];
f
3.4 Проектирование процедур вывода информации
Вывод информации в нашем устройстве осуществляется на LCD-дисплей. Основной процедурой, которая отображает строки поступивших данных на дисплее - это процедура AutoWriteMode(), которая по сути управляет дисплеем, выводя на него последовательно символы, хранящиеся в глобальном массиве OutString[], в режиме автозаписи, При этом нам необходимо только менять адрес позиции, в которую выводятся данные.
WORD AutoWriteMode(WORD
Address, BYTE NumBytes)
{
SetAddressPointer(Address);
SendCommanct{SET_DATA_AUTO_HRITE_COMMAND);
forfint i = 0; i <
NumBytes; i++) {
AutoWrite(OutString[i]);
Address++; }
SendCommand(AUTO_RESET_COMMAND);
return Address; }
3.5 Проектирование процедур
управления периферийными устройствами
Все процедуры управления LCD-дисплеем осуществляются
согласно системе команд встроенного контроллера Т6963:




3.6 Проектирование процедуры main()
Процедура main{) работает следующим образом после инициализации все узлов AVR и периферийных устройств, разрешается выполнение всех прерываний. После этого программа ждет срабатывания таймера, который настроен таким образом, что он немного чаще, чем может происходить прерывание от УСАПП. Сигналом того, что таймер 0 сработал служит факт установки глобальной переменной TmrOFlag в 1, что делается обработчиком прерываний таймера.
Затем, все время, пока кольцевой буфер не будет пуст, происходит считывание данных из него. Считанный байт помещается в строку-массив OutString[], и увеличивается счетчик принятых байт.
После этого проверяется, а не был ли последний принятый из буфера байт признаком окончания строки. Если да, то в режиме
автозаписи эта строка выводится на дисплей (за исключением последнего символа конца строки). После этого строка обнуляется и счетчик принятых байт устанавливается в ноль.
В любом случае происходит сброс флага таймера в ноль и происходит ожидание следующего срабатывания таймера.
4. Листинг программы
Файл макроопределений my_header.h:
^define BYTE unsigned
char ttdefine WORD unsigned int
ttdefine
READ_STATUS_COMMAND 0x39
ttdefine
DATA_WRITE_COMMAND 0x32
tfdefine
COMMANDjmTE_COMMAND ОхЗА
// Установка регистров
^define
SET_CURSOR_COMMAKD 0x21
tfdefine
SET_OFFSET_COMMAND 0x22
#define
SET_ADDRESS_COMMAND 0x24
// Установка контрольного слова
#define
SET_TEXT_HOME_ADDRESS_COMMAND 0x^0
Страницы: 1, 2, 3 |