роботы робототехника микроконтроллеры


 Страниц (1): [1]   

> Без описания
kurt84 Post Id



Майор


Сообщений всего: 56
Дата рег-ции: Июль 2008  



Фототранзисторы подключены к портам B0 и B1.

Пытаюсь считывать значение на порте так: if( PB0 == 0 ){ действие; } ( пробовал и так как в статье 2 ( робот с фотоэлементом ) ).
Т.е. если попадает свет - делаем "действие". Но. "Действие" выполняется в любом случае, независимо от того, попадает ли свет на фототранзистор, или нет.

При проверке мультиметром, видно, что в зависимости от освещенности, напряжение на PB0 меняется при свете - ~0.2В, без - ~3.9 - 4В.

В чем может быть дело?
 
 Top
Volotar Post Id



Майор


Сообщений всего: 58
Дата рег-ции: Июнь 2008  



Ошибка в тексте
Цитата:
if( PB0 == 0 ){ действие; }

нужно писать РINB пример прилагается: if (PINВ.0==0)
P.S.Обычно у микроконтроллеров порт D определяют как вход, а порт В как выход. Но это несущественно, ведь от поставленной задачи и от действия самого программиста можно настроить нетолько порт но и каждый регистр порта как на вход так и на выход
 
 Top
kurt84 Post Id



Майор


Сообщений всего: 56
Дата рег-ции: Июль 2008  



Спасибо.
 
 Top
kurt84 Post Id



Майор


Сообщений всего: 56
Дата рег-ции: Июль 2008  



А кстати почему порт B определяют как выход, а порт D - как вход?
Я не стал занимать порт D - потому что там UART, вдруг решу потом использовать его...
 
 Top
digger Администратор Post Id



Администратор


Сообщений всего: 372
Дата рег-ции: Май 2006  



Читал с улыбкой Улыбка

Вот Вам 10 способов, как проверить наличие "0" на выводе в AVR GCC (WinAVR).

CODE:

if (!(PINC & (1<<PINC3))) // проверить "0" на линии 3 порта C

if (!(PINC & (1<<PC3))) // проверить "0" на линии 3 порта C

if (!(PINC & (1<<3))) // проверить "0" на линии 3 порта C

if (!(PINC & _BV(PINC3))) // проверить "0" на линии 3 порта C

if (!(PINC & _BV(PC3))) // проверить "0" на линии 3 порта C

if (!(PINC & _BV(3))) // проверить "0" на линии 3 порта C

if (!(PINC & 0b00001000)) // проверить "0" на линии 3 порта C

if (!(PINC & 0b1000)) // проверить "0" на линии 3 порта C

if (!(PINC & 0x08)) // проверить "0" на линии 3 порта C


и 10-й

//в начале программы ставим макроопределение (в данном случае для порта C)
#define LIGHT(bit) !(PINC & _BV(bit)) //датчик освещен

Предполагается, что фототранзистор подключен так, как на схеме Робот с фотодатчиком (только к линии порта C).

//и используем макроопределение в условии вот так
if (LIGHT(PC3)) // проверить "0" на линии 3 порта C

или даже вот так
if (LIGHT(3)) // проверить "0" на линии 3 порта C

Имя макроопределения (в данном случае LIGHT) может быть любым и не должно содержать пробелов и знаков препинания.

(Добавление)
Цитата:
При проверке мультиметром, видно, что в зависимости от освещенности, напряжение на PB0 меняется при свете - ~0.2В, без - ~3.9 - 4В.

В чем может быть дело?


Может быть, Вы в программе не подключили подтягивающие резисторы. Например, вот так
CODE:
PORTB = 0xff; // установить "1" на всех выводах порта B, включаем подтягивающие резисторы


Подключение pull-up резисторов, подтягивающих выводы порта к питанию, необходимо для обеспечения "1" при отсутствии сигнала низкого уровня на линии. Иначе на линии всегда будет логический "0" (конечно, если Вы не подадите на нее сигнал высокого уровня Улыбка).
 
 Top
kurt84 Post Id



Майор


Сообщений всего: 56
Дата рег-ции: Июль 2008  



Спасибо за ликбез по С++ Улыбка)) Мне как программисту с 10 летним стажем было очень интересно узнать что-то новое Улыбка))

Меня просто ввели в заблуждения имена определенных для AVR макросов.

Но все равно спасибо.

Кстати, а в чем разница в использовании PORTA и PINA?
 
 Top
digger Администратор Post Id



Администратор


Сообщений всего: 372
Дата рег-ции: Май 2006  



PINx является регистром выводов порта и в отличие от регистров DDRx и PORTx доступен только для чтения. PINx позволяет считывать входные данные порта на внутреннюю шину микроконтроллера.
 
 Top
kurt84 Post Id



Майор


Сообщений всего: 56
Дата рег-ции: Июль 2008  



Понятно. Т.е. PINx введены только для того, чтобы при считывании случайно не изменить состояние портов, так?
 
 Top
Admin Администратор Post Id


Администратор


Сообщений всего: 897
Дата рег-ции: Май 2006  



Устройство микроконтроллера AVR.

Архитектурная особенность построения портов ввода/вывода у AVR заключается в том, что для каждого физического вывода (пина) существует 3 бита контроля/управления, а не 2, как у распространенных 8-разрядных микроконтроллеров (Intel, Microchip, Motorola и т.д.). Это позволяет избежать необходимости иметь копию содержимого порта в памяти для безопасности и повышает скорость работы микроконтроллера при работе с внешними устройствами, особенно в условиях внешних электрических помех.
 
 Top
Страниц (1): [1]
« Программирование микроконтроллеров »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown
  Яндекс.Метрика   Рейтинг@Mail.ru