Форум myROBOT.ru » Шаг за шагом » Программирование микроконтроллеров » Нет реакциии на засветку( затемнение ) фототранзистора.

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

1. kurt84 - 25 Июля, 2008 - 19:36:31 - перейти к сообщению
Фототранзисторы подключены к портам B0 и B1.

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

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

В чем может быть дело?
2. Volotar - 25 Июля, 2008 - 22:41:12 - перейти к сообщению
Ошибка в тексте
Цитата:
if( PB0 == 0 ){ действие; }

нужно писать РINB пример прилагается: if (PINВ.0==0)
P.S.Обычно у микроконтроллеров порт D определяют как вход, а порт В как выход. Но это несущественно, ведь от поставленной задачи и от действия самого программиста можно настроить нетолько порт но и каждый регистр порта как на вход так и на выход
3. kurt84 - 25 Июля, 2008 - 22:56:04 - перейти к сообщению
Спасибо.
4. kurt84 - 26 Июля, 2008 - 08:57:05 - перейти к сообщению
А кстати почему порт B определяют как выход, а порт D - как вход?
Я не стал занимать порт D - потому что там UART, вдруг решу потом использовать его...
5. digger - 26 Июля, 2008 - 14:49:40 - перейти к сообщению
Читал с улыбкой Улыбка

Вот Вам 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" (конечно, если Вы не подадите на нее сигнал высокого уровня Улыбка).
6. kurt84 - 27 Июля, 2008 - 12:50:56 - перейти к сообщению
Спасибо за ликбез по С++ Улыбка)) Мне как программисту с 10 летним стажем было очень интересно узнать что-то новое Улыбка))

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

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

Кстати, а в чем разница в использовании PORTA и PINA?
7. digger - 28 Июля, 2008 - 02:27:01 - перейти к сообщению
PINx является регистром выводов порта и в отличие от регистров DDRx и PORTx доступен только для чтения. PINx позволяет считывать входные данные порта на внутреннюю шину микроконтроллера.
8. kurt84 - 28 Июля, 2008 - 07:55:22 - перейти к сообщению
Понятно. Т.е. PINx введены только для того, чтобы при считывании случайно не изменить состояние портов, так?
9. Admin - 28 Июля, 2008 - 18:01:41 - перейти к сообщению
Устройство микроконтроллера AVR.

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