Инициализация портов при внешнем резисторе на питание

Обсуждаем контроллеры компании Atmel.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Вторую неделю изучаю микроконтроллеры. Начал с AVR - Atmega8.

Успешно подключил дисплей WH1602 и датчик температуры DS18B20. Но остался нерешённым один мелкий вопрос.

Датчик подключен у меня к 5-му пину порта C (28-я ножка микросхемы). К ней же на питание подключен внешний резистор на 2.2кОм что обусловлено спецификой работы DS18B20, у которой выход организован по схеме с открытым стоком.

Казалось бы - установил один раз PORTC в ноль, а дальше просто щёлкай DDRC. Выставил DDRC в 1 - пин работает как выход, и на этот пин (из-за PORTC) должен идти ноль. Выставил DDRC в 0 - пин становится входом, и на этом пине за счёт внешнего резистора должна вытянуться единица:

Код: Выделить всё

#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
	PORTC &= ~(1<<5);    // Set 0 if output or Z if input
	while (1) {
		DDRC |= (1<<5);   // Set pin to output
		_delay_ms(500);
		DDRC &= (1<<5);   // Set pin to input
		_delay_ms(2000);
	}
	return 0;
}
Но вот почему-то это не работает! Вольтметр показывает 0 всё время.

А вот так работает:

Код: Выделить всё

int main(void)
{
	while (1) {
		PORTC &= ~(1<<5); // Set 0 if output or Z if input
		DDRC |= (1<<5);   // Set pin to output
		_delay_ms(500);
		DDRC &= (1<<5);   // Set pin to input
		PORTC |= (1<<5);  // Set 1 if output or Z/1 if input
		_delay_ms(2000);
	}
	return 0;
}
В этом случае всё отлично - вольтметр фиксирует полсекунды 0В и 2 секунды 5В.

Я в упор не понимаю, зачем приходится делать PORTC |= (1<<5); - устанавливать PORTC в единицу, хотя пин чуть выше сконфигурирован на вход, и по идее ему должно быть по барабану состояние PORTC - ведь там висит резистор, который в любом случае должен вытянуть пин (который вход!) в единицу?

Гуру, просветите меня, в чём дело.
Вложения
porttest.tar.gz
(755 байт) 497 скачиваний
Контактная информация:
Реклама
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Для начала найдите одно отличие. :)

Код: Выделить всё

PORTC &= ~(1<<5);    // Set 0 if output or Z if input // установка бита 5 в "0"
DDRC  &=  (1<<5);   // Set pin to input // установка бита 5 в "0" ??????
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Блин же.. не заметил эту опечатку.

Спасибо, заработало.

Сейчас хотя бы по-человечески стал код выглядеть.

Изображение
Контактная информация:
Ответить

Вернуться в «AVR»