К моему микроконтроллеру подключен 7-сегментный 3-х разрядный индикатор(d0-d7 - сегменты, b0-b2 - разряды), а также датчик температуры DS18B20 к порту c0. Хочу, чтобы если на с0 есть датчик - 7-сегментный индикатор выводил 1, нет датчика - 7 сегментный индикатор выводил 0. Ниже код в WinAVR. Почему подключенном датчике 7-сегментный индикатор выводит 0, хотя должен 1? Фьюзы стоят на 1 МГц.
Код
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define F_CPU = 1000000UL
#define W1_PORT PORTC
#define W1_DDR DDRC
#define W1_PIN PINC
#define W1_BIT 0
//функция определяет есть ли устройство на шине
unsigned int w1_find()
{
unsigned char device;
W1_DDR |= 1<<W1_BIT;//логический "0"
_delay_us(485);//ждем минимум 480мкс
W1_DDR &= ~(1<<W1_BIT);//отпускаем шину
_delay_us(65);//ждем минимум 60мкс и смотрим что на шине
if((W1_PIN & (1<<W1_BIT)) ==0x00)
device = 1;
else
device = 0;
_delay_us(420);//ждем оставшееся время до 480мкс
return device;
}
// 0 1 2 3 4 5 6 7 8 9
const unsigned char codes[10]={0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char data[3]={0x00,0x00,0x00};
int main(void)
{
unsigned int x=0;
while(1)
{
//Conver data to codes
DDRD = 0xff;
DDRB = 0xff;
PORTB = 0xff;
x = w1_find();
PORTD = codes[x];
_delay_ms(1000);
}
return 1;
}
#include <util/delay.h>
#include <avr/interrupt.h>
#define F_CPU = 1000000UL
#define W1_PORT PORTC
#define W1_DDR DDRC
#define W1_PIN PINC
#define W1_BIT 0
//функция определяет есть ли устройство на шине
unsigned int w1_find()
{
unsigned char device;
W1_DDR |= 1<<W1_BIT;//логический "0"
_delay_us(485);//ждем минимум 480мкс
W1_DDR &= ~(1<<W1_BIT);//отпускаем шину
_delay_us(65);//ждем минимум 60мкс и смотрим что на шине
if((W1_PIN & (1<<W1_BIT)) ==0x00)
device = 1;
else
device = 0;
_delay_us(420);//ждем оставшееся время до 480мкс
return device;
}
// 0 1 2 3 4 5 6 7 8 9
const unsigned char codes[10]={0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char data[3]={0x00,0x00,0x00};
int main(void)
{
unsigned int x=0;
while(1)
{
//Conver data to codes
DDRD = 0xff;
DDRB = 0xff;
PORTB = 0xff;
x = w1_find();
PORTD = codes[x];
_delay_ms(1000);
}
return 1;
}
1. В чем может быть дело, подскажите куда копать. На скриншоте - осциллограмма на ножке c0.
2. Помогите разобраться с операторами функции w1_find():
W1_DDR |= 1<<W1_BIT - как я понял логическое ИЛИ между содержимым регистра W1_DDR и числом 00000001. Но чему равно содержимое регистра W1_DDR, оно же ранее нигде не задано?