Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
396 Часть 111. Практическое программирование микроконтроллеров АVR in com : ; прием байта в temp с ожид . готовности ret Reset : sbis UCSRA, RXC ; ждем готовности буфера приемника rjmp in_com in temp, UDR ; принимаем ldi temp , low (RAМEND ) out SPL, temp ldi temp , high (RAМEND ) out SPH, temp ; указатель стека ; === UART Gcykle : ldi temp , 2 5 ; 9 6 00 при 4 МГц out UBRRL , temp ; скор . передачи ldi temp , ( l<<RXEN [ l<<TXEN ) out UCSRB , temp ; разреш . приема/передачи 8 битов rcall in com ; ждем любого байта rcall out_com ; отсылаем обратно rjmp Gcykle ; в начало цикла Эту программу вы найдете в архиве по адресу, указанному во введении (файл UART_test_simple .asm). Загрузите ее в какой-нибудь контроллер из «наших» - не обязательно в указанный АTmega8 (для АTtiny23 1 3 придется удалить строки, отно сящиеся к регистру SPH). Подключите адаптер USB-UART, запустите на компью тере любой монитор порта (можно даже монитор порта Arduino) и попробуйте по слать какой-нибудь байт в контроллер - он вернется обратно без изменений. Давайте рассмотрим подробнее, что тут происходит, и в каких случаях такими про стыми мерами можно обойтись. Непрерывный опрос бита RXC, реализованный в процедуре приема in_сот, равноси лен просто замкнутому циклу. При размещении такой простейшей процедуры приема в главном цикле контроллер на ней тормозится и зацикливается в ожидании байта, который должен прийти на UARТ. Вклиниться в этот цикл может только прерывание, причем и для прерывания, и для приема это в большинстве случаев безопасно - с принятым байтом в регистре UDR ничего не случится, если посторон нее прерывание не выполняется дольше миллисекунды (порядка тысяч команд кон троллера). Но даже если обработчик прерывания выполняется ну очень долго (на пример, выводит данные на LСD-диспл�й, - см. главу 16) , то потерять что-то вы рискуете только если «снаружи» послано более одного байта. Один принятый байт вы не сможете потерять ни в каком случае, когда бы ни обратились к проверке бита RXC. Единственное ограничение при наличии посторонних прерываний мы рассмот рим далее. . С процедурой out_сот вы также знакомы по программам в предыдущих главах. Передачу модуль UART осуществляет аппаратно в два приема: как только данные
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==