Вторую неделю изучаю микроконтроллеры. Начал с AVR - Atmega8.
Успешно подключил дисплей WH1602 и датчик температуры DS18B20. Но остался нерешённым один мелкий вопрос.
Датчик подключен у меня к 5-му пину порта C (28-я ножка микросхемы). К ней же на питание подключен внешний резистор на 2.2кОм что обусловлено спецификой работы DS18B20, у которой выход организован по схеме с открытым стоком.
Казалось бы - установил один раз PORTC в ноль, а дальше просто щёлкай DDRC. Выставил DDRC в 1 - пин работает как выход, и на этот пин (из-за PORTC) должен идти ноль. Выставил DDRC в 0 - пин становится входом, и на этом пине за счёт внешнего резистора должна вытянуться единица:
Но вот почему-то это не работает! Вольтметр показывает 0 всё время.
А вот так работает:
В этом случае всё отлично - вольтметр фиксирует полсекунды 0В и 2 секунды 5В.
Я в упор не понимаю, зачем приходится делать PORTC |= (1<<5); - устанавливать PORTC в единицу, хотя пин чуть выше сконфигурирован на вход, и по идее ему должно быть по барабану состояние PORTC - ведь там висит резистор, который в любом случае должен вытянуть пин (который вход!) в единицу?
Гуру, просветите меня, в чём дело.
Успешно подключил дисплей 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;
}
А вот так работает:
Код: Выделить всё
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;
}
Я в упор не понимаю, зачем приходится делать PORTC |= (1<<5); - устанавливать PORTC в единицу, хотя пин чуть выше сконфигурирован на вход, и по идее ему должно быть по барабану состояние PORTC - ведь там висит резистор, который в любом случае должен вытянуть пин (который вход!) в единицу?
Гуру, просветите меня, в чём дело.
- Вложения
-
- porttest.tar.gz
- (755 байт) 497 скачиваний
