Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру

46 Часть /. Общие принципы устройства и функционирования Аtте/ АVR короткий момент оказывается либо «подвешенной в воздухе» , либо подключенной к высокому уровню напряжения, - для быстродействующих присоединенных устройств это может оказаться критичным. Это еще один аргумент за то, чтобы не лениться ис­ пользовать внешние <<Подтягивающие» резисторы, в присутствии которь1х как мини­ мум состояние «подвешенности» никогда не возникает. А если у вас вдруг возникает противоположная проблема - мешает внутренний «под­ тягивающий» резистор, на короткое время подключающийся при переключении выво­ да из состояния логической единицы на выходе на вход в «третьем состоянии» (хотя я лично не могу себе представить такой ситуации , когда это критично) , то надо знать, что во многих моделях (например, в «наших» ATmega8 и ATmega8535) встроенными рul l-uр-резисторами можно оптом управлять через бит PUD (бит 2) регистра SFIOR. По умолчанию он равен нулю, но если установить его в единицу, то все рul l -uр-резисторы во всех портах окажутся отключенными - входы МК превратятся в обычные высоко­ омные входы КМОП (в третьем состоянии) . Процедура чтения уровня на выводе порта, если он находится в состоянии работы на вход, на ассемблере не совсем тривиальна (в Arduino это функция digitalRead ( ) ) . Возникает искушение прочесть дан н ые из регистра данных PORTx, но это ничего не даст- вы получите только то, что там записано вами же ранее. А для чтения того, что действительно имеется на входе (непосредственно на выводе микросхемы), предусмотрена другая возможность - нужно обратиться к некоторому массиву, который обозначается PINx. Обращение осуществляется так же, как и к отдельным битам обычных регистров (см. главу 6), но PINx - это не регистр, а просто некий диапазон адресов, чтение по которым предоставляет доступ к информации из бу­ ферных элементов на входе порта. Записывать что-то по адресам PINx, естественно, нельзя . Таймеры-счетчики В большинстве МК АVR наличествуют два или три таймера-счетчика, один из ко­ торых 1 6-разрядный, а оставшиеся один или два - 8-разрядные (в старших моде­ лях Mega общее число таймеров может достигать шести) . Все счетчики имеют воз­ можность предварительной загрузки значений и могут работать от тактовой часто­ ты (СК) процессора непосредственно или от поделенной на 8, 64, 256 или 1 024 (в отдельных случаях еще на 1 6 и 32), а также от внешнего сигнала. В модели ATtiny l 5 , содержащей внутренний умножитель частоты, таймер может работать от более высокой частоты, чем тактовая (до 1 6СК). В архитектуре АVR 8-разрядным счетчикам-таймерам присвоены номера О и 2, а 1 6-разрядным - 1 , 3 и далее. Некоторые 8-разрядные счетчики (обычно Timer 2, если их два) могут работать в асинхронном режиме от отдельного тактового гене­ ратора, причем продолжать функционировать даже в случае «спящего» состояния всей остальной части МК, что позволяет использовать их в качестве часов реально­ го времени. В большинстве моделей АVR предусмотрена возможность сброса содержимого счетчика-предделителя таймеров для того, чтобы счет всегда начинался с заданного интервала. Предделитель (он общий, хотя обычно и не для всех таймеров - в «на­ ших» случаях он управляет таймерами О и 1 ) работает независимо от самих тайме-

RkJQdWJsaXNoZXIy MTExODQxMg==