ATMega 16 не видит DS1621

Обсуждаем контроллеры компании Atmel.
Ответить
DK10000
Родился
Сообщения: 9
Зарегистрирован: Вт ноя 25, 2008 19:21:23

ATMega 16 не видит DS1621

Сообщение DK10000 »

Уважаемые коты, я решил соединить датчик температуры DS1621 и микроконтроллер ATMega 16, используя при этом аппаратный модуль TW. Написал функции протокола TWI. В Протеусе все запустилось. Однако, когда я собрал устройство в жизни оно не заработало. Выяснилось, что датчик отвечает NACK на адресный пакет 0b10010000, хотя я посадил выводы A0 - A2 на землю, подключит подтягивающие резисторы по 4.7 кОМ. В чем может быть проблема?

Вот код программы:

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

#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, то бишь не отзывается. Жду помощи, не знаю что делать... :cry:


Файлик с проектом прилагаю.
Вложения
DS1621+ATMega16+portA_LCD (Vorkin version).rar
Проект Codevision + Proteus
(82.03 КБ) 144 скачивания
DK10000
Родился
Сообщения: 9
Зарегистрирован: Вт ноя 25, 2008 19:21:23

Re: ATMega 16 не видит DS1621

Сообщение DK10000 »

В общем продублировал туже программу через встроенные в CODEVISIO функции для DS1621, результат тот же. В Протеусе пашет в жизни нет. Скачал еще один железно рабочий проект на меге 8, собрал, прошил, проверил все и увы. Оба датчика не фурычат. Что за черт. Купил в магазине новые и оба с такой вот подлянкой =(((
Ответить

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