Игорек 0 7 мая, 2012 Опубликовано 7 мая, 2012 (изменено) · Жалоба За основу взял эту статью: http://samou4ka.net/page/interfejs-1-wire-...hik-ds18b20#cut К моему микроконтроллеру подключен 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; } 1. В чем может быть дело, подскажите куда копать. На скриншоте - осциллограмма на ножке c0. 2. Помогите разобраться с операторами функции w1_find(): W1_DDR |= 1<<W1_BIT - как я понял логическое ИЛИ между содержимым регистра W1_DDR и числом 00000001. Но чему равно содержимое регистра W1_DDR, оно же ранее нигде не задано? Изменено 7 мая, 2012 пользователем Игорек Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Игорек 0 7 мая, 2012 Опубликовано 7 мая, 2012 · Жалоба Блин, прошил фьюзы на 8 МГц, поставил в Makefile F_CPU = 8000000 и все заработало. Чертовщина какая-то...На 1 Мгц никак, на 8 работает. Почему? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 7 мая, 2012 Опубликовано 7 мая, 2012 · Жалоба Блин, прошил фьюзы на 8 МГц, поставил в Makefile F_CPU = 8000000 и все заработало. Чертовщина какая-то...На 1 Мгц никак, на 8 работает. Почему? А изначально , какая частота была в Makefile? И под какую частоту считались delays? Так что не поминайте черта... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Игорек 0 7 мая, 2012 Опубликовано 7 мая, 2012 · Жалоба Изначально в Makefile стояла частота 1Мгц, фьюзы изначально также были на 1 МГц. И под какую частоту считались delays? Где это посмотреть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 7 мая, 2012 Опубликовано 7 мая, 2012 · Жалоба Изначально в Makefile стояла частота 1Мгц, фьюзы изначально также были на 1 МГц. Неужели , тогда обратимся к первоисточнику по Вашей ссылке # Processor frequency. Typical values are: # F_CPU = 1000000 Закоментировано # F_CPU = 1843200 # F_CPU = 2000000 # F_CPU = 3686400 # F_CPU = 4000000 # F_CPU = 7372800 # F_CPU = 8000000 # F_CPU = 11059200 # F_CPU = 14745600 # F_CPU = 16000000 # F_CPU = 18432000 # F_CPU = 20000000 F_CPU = 4000000 А вот и частота процессора Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Игорек 0 7 мая, 2012 Опубликовано 7 мая, 2012 (изменено) · Жалоба Makefile я делал сам, из первоисточника я брал только определение функции w1_find() и директивы #define. А вобще как-то влияет ли на функции delay частота, с которой работает микроконтроллер? Скажем, если я выставлю фьюзы и Makefile на 1 МГц и вызову функцию _delay_us(10), а потом выставлю фьюзы и Makefile на 8 МГц и вызову функцию _delay_us(10) , временные задержки будут абсолютно идентичны или будут все-таки различаться? Изменено 7 мая, 2012 пользователем Игорек Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 7 мая, 2012 Опубликовано 7 мая, 2012 · Жалоба А вобще как-то влияет ли на функции delay частота, с которой работает микроконтроллер? Скажем, если я выставлю фьюзы и Makefile на 1 МГц и вызову функцию _delay_us(10), а потом выставлю фьюзы и Makefile на 8 МГц и вызову функцию _delay_us(10) , временные задержки будут абсолютно идентичны или будут все-таки различаться? Обязаны. Но не знаю как реализован код задержек для программы в которой Вы пишите. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Игорек 0 8 мая, 2012 Опубликовано 8 мая, 2012 · Жалоба Спасибо за помощь! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kolobok0 0 11 мая, 2012 Опубликовано 11 мая, 2012 · Жалоба Спасибо за помощь! И ышо одно замечание. Перед тем как выдавать сброс - считайте пин от дачтика. Если там изначально будет логический ноль - то, так же можно считать что датчик не подключен ;) удачи вам (круглый) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться