Курсовая работа: Проектирование удаленного устройства индикации
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 <1«ЮС£Н) ) ;
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 )