Ревич, Ю.В. Программирование микроконтроллеров 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 осуществляет аппаратно в два приема: как только данные

RkJQdWJsaXNoZXIy MTExODQxMg==