Читал с улыбкой
Вот Вам 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" (конечно, если Вы не подадите на нее сигнал высокого уровня ).
|