ATMega 16 не видит DS1621
Добавлено: Сб фев 22, 2014 09:34:35
Уважаемые коты, я решил соединить датчик температуры DS1621 и микроконтроллер ATMega 16, используя при этом аппаратный модуль TW. Написал функции протокола TWI. В Протеусе все запустилось. Однако, когда я собрал устройство в жизни оно не заработало. Выяснилось, что датчик отвечает NACK на адресный пакет 0b10010000, хотя я посадил выводы A0 - A2 на землю, подключит подтягивающие резисторы по 4.7 кОМ. В чем может быть проблема?
Вот код программы:
Данный код посылает адресный пакет 0x90 и выводит диагностическое сообщение (TWSR) на жк экран в десятичной системе (24 (18 hex) - значит все в порядке, 32 (20 hex) - значит не отозвался на свой адрес).
Как я не бился, датчик постоянно выдает 32, то бишь не отзывается. Жду помощи, не знаю что делать...
Файлик с проектом прилагаю.
Вот код программы:
Код: Выделить всё
#include <mega16.h>
#include <alcd.h>
#include <delay.h>
#include <stdlib.h>
#define ACK 0xD0
#define NACK 0xD1
char D[8]; // Массив для записи туда значения тока в виде строки
int a;
void start_twi(void)
{
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
}
void stop_twi(void)
{
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
}
void write_twi(unsigned char data_byte)
{
TWDR = data_byte;
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT)));
}
unsigned char i2read (unsigned ACK_Status)
{
if(ACK_Status == ACK)
TWCR = (1<<TWINT)| (1<<TWEA) | (1<<TWEN);
else
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT)));
return TWDR;
}
void main(void)
{
DDRC=0xFF;
// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTA Bit 0
// RD - PORTA Bit 1
// EN - PORTA Bit 2
// D4 - PORTA Bit 4
// D5 - PORTA Bit 5
// D6 - PORTA Bit 6
// D7 - PORTA Bit 7
// Characters/line: 16
lcd_init(16);
delay_ms(50);
TWBR=0x48;
TWSR= 0x00;
start_twi();
write_twi(0b10010000);
itoa(TWSR,D);
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts(D);
}
Данный код посылает адресный пакет 0x90 и выводит диагностическое сообщение (TWSR) на жк экран в десятичной системе (24 (18 hex) - значит все в порядке, 32 (20 hex) - значит не отозвался на свой адрес).
Как я не бился, датчик постоянно выдает 32, то бишь не отзывается. Жду помощи, не знаю что делать...
Файлик с проектом прилагаю.