--PAGE_BREAK--
Рис.1 Схемавключениямикроконтроллера
2.2 Формированиетактовыхимпульсов
Тактовыеимпульсыдляработымикроконтроллераможно формироватьспомощьюлибовстроенногогенератораимпульсов, либоподключаявнешнийгенераторнакварцевомрезонаторе. Внутреннийгенератортактовыхимпульсоввнашемслучаене обеспечитнеобходимуюстабильностьдляработысинтерфейсомRS-485, поэтомумыбудемиспользоватьвнешнийкварцевыйгенератор на7.3728 MHz. Дляработынатакойчастотеразработчикифирмы ATMELсоветуютиспользоватьдвадополнительныхконденсатора емкостью22 pF, включенныепоследующейсхеме:
2.3 Схемасброса
Схемасбросадолжнаформироватьимпульслогическогонулядля подачиегонаинверсныйвыводсбросамикроконтроллераRESET. Это импульсдолженформироватьсяпри, например, нажатиинакнопку сбросаустройстваилиприпереключенииключа. Кромеэтого, этот сигналсбросадолженподаватьсяинавыводсбросаLCD— дисплея.
Длятакойсхемыподходитвключениетранзистора, показанноена рис.3. Когдаключоткрыт, транзисторнаходитсявзакрытом состоянииинавходыRESETAVRиRSTLCD-дисплеяпоступает сигналлогическойединицы. Когдаключзамыкается, транзистор открываетсяинавходысбросаустройствпоступаетсигнал логическогонуля.
Рис.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, темсамым настроив все их выводы на передачу данных. Для этого используются две процедуры;
voidInitPortAWrite(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 = ({1 «RXCIE) j
UCSRC = (1«URSEL) | (3«UCSZO) | (1«UPM1);
x = 0;
USART_RxTail = x; USARTJRxHead = x;
}
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
(
/* Ошибка! Буфферприемникапереполнен*/
)
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
AutoWrite(OutString[i]);
Address++; }
SendCommand(AUTO_RESET_COMMAND); return Address; }
3.5 Проектирование процедур управления периферийными устройствами
Все процедуры управления LCD-дисплеем осуществляются согласно системе команд встроенного контроллера Т6963:
продолжение
--PAGE_BREAK--