SMBus з MLX90615

M

member_tdh

Guest
Привіт усім!

На даний момент я навчаюся в SMBus протоколу.Я внесення проекту, використання ІЧ-температура (MLX90615).

В результаті, що
я завжди receied це:
Tobj = 382.19C
Tobj = 382.19C
Tobj = 382.19C
...

Мій код можна не так, хто-небудь може мені допомогти ...!!?

Завдяки дуже багато!

Це мій код:

"SMBus.h"

# Ifndef __SMBUS_INCLUDE__
# Визначити __SMBUS_INCLUDE__

# Визначити _SDA 7 / / PORTD.7
# Визначити _SCL 6 / / PORTD.6

# Визначити _SDA_OUTPUT DDRD | = (1 <<_SDA);
# Визначити _SDA_INPUT DDRD
І = ~ (1 <<_SDA);
# Визначити _SCL_OUTPUT DDRD | = (1 <<_SCL);

# Визначити mSDA_IN PIND.7

# Визначити mSDA_HIGH PORTD | = (1 <<_SDA);
# Визначити mSDA_LOW PORTD
І = ~ (1 <<_SDA);
# Визначити mSCL_HIGH PORTD | = (1 <<_SCL);
# Визначити mSCL_LOW PORTD
І = ~ (1 <<_SCL);# Визначити TBUF 5
# Визначити HIGHLEV 3
# Визначити LOWLEV 1

# Визначити ACK 0
# Визначити NACK 1

# Визначити WRITE 0x00 / / SMBus команди WRITE
# Визначити READ 0x01 / / SMBus команди READ

# Визначити SA 0x00 / / SMBus невільничим адреса
# Визначити DEFAULT_SA 0x5B / / заводські SMBus невільничим адреса (MLX90615)
# Визначити RAM_Access 0x00 / / RAM доступ команду
# Визначити RAM_Tobj1 0x07 / / To1 адреса в EEPROM
# Визначити EEPROM_Access 0x20 / / EEPROM доступу команду
# Визначити Read_Flags 0xF0
# Визначити SLEEP_mode 0xFF

зовнішній MLX90615_init недійсним (недійсними);
зовнішній START_bit недійсним (недійсними);
зовнішній STOP_bit недійсним (недійсними);
зовнішній SendRequest недійсним (недійсними);
зовнішній недійсним DummyCommand (байт);
зовнішній поплавковий CalcTemp (Word);
зовнішній WORD read_RAM (BYTE slaveADDR, BYTE ADDR);
зовнішній WORD read_EEPROM (BYTE slaveADDR, BYTE ADDR);
зовнішній Object_Temperature недійсним (недійсними);
зовнішній Ambient_Temperature недійсним (недійсними);
зовнішній недійсним TruyenByte (BYTE X);
зовнішній NhanByte BYTE (BYTE ack_nack);

# ENDIF"SMBus.c"MLX90615_init недійсним (недійсними)
(
_SDA_OUTPUT / / Встановити правил дорожнього руху, як результат
_SCL_OUTPUT / / Встановити SCL, як результат
mSDA_HIGH / / автобуса безкоштовно
mSCL_HIGH;
)START_bit недійсним (недійсними)
(
_SDA_OUTPUT / / Встановити правил дорожнього руху, як результат
mSDA_HIGH / / Встановити лінію правил дорожнього руху
mSCL_HIGH / / Встановити лінію SCL
delay_us (TBUF); / / генерує автобус вільний час між Стоп
/ / Початок і умова (Tbuf = 4.7us хв)
mSDA_LOW / / Відкрита лінія правил дорожнього руху
delay_us (TBUF); / / Тримайте час після (повторні) Початок
/ / Стан.Після цього періоду, перші години генерується.
/ / (THD: STA = 4.0us хв)
mSCL_LOW / / Відкрита лінія SCL
)STOP_bit недійсним (недійсними)
(
_SDA_OUTPUT / / Встановити правил дорожнього руху, як результат
mSDA_LOW / / Відкрита лінія правил дорожнього руху
mSCL_HIGH / / Встановити лінію SCL
delay_us (TBUF); / / Почекайте кілька мікросекунд
mSDA_HIGH / / Встановити лінію правил дорожнього руху
mSCL_LOW;
)недійсним TruyenByte (BYTE X)
(
BYTE I;

_SDA_OUTPUT / / Встановити правил дорожнього руху, як результат
для (i = 0; I <8; I )
(
mSCL_LOW;
якщо (X
І 0x80) mSDA_HIGH;
остальное mSDA_LOW;
X <<= 1;
mSCL_HIGH;
delay_us (20);
)
_SDA_INPUT; / /
СДA рядку введення
mSDA_LOW / / ACK тай годинник чт 9
mSCL_LOW;
mSCL_HIGH;
якщо (mSDA_IN
І 0x80) printf ( "MLX90615 writed помилку ... ACK! \ N \ R");
mSCL_LOW;
)

BYTE NhanByte (BYTE ack_nack)
(
BYTE I;
СЛОВО байт = 0;

_SDA_INPUT;
mSCL_LOW;
для (i = 0; I <8; I )
(
байт <<= 1;
mSCL_HIGH;
байт | = mSDA_IN;
mSCL_LOW;
delay_us (20);
)
_SDA_OUTPUT / / DATA-лінію виробництва
PORTD.7 =! Ack_nack; / / "ACK == 1" спадному DATA-лінія
mSCL_HIGH;
delay_us (20);
mSCL_LOW;
/ / _SDA_INPUT / / DATA-лінію вхідного
/ / MSDA_HIGH;
повернутися байт;
)

СЛОВО read_RAM (BYTE slaveADDR, BYTE ADDR)
(
BYTE data_4lsb;
BYTE data_4msb;
BYTE data_crc;
СЛОВО даних;

START_bit ();
TruyenByte (slaveADDR);
TruyenByte (ADDR | RAM_Access);
START_bit ();
TruyenByte (slaveADDR | 0x01);
data_4lsb = NhanByte (ACK);
data_4msb = NhanByte (ACK);
data_crc = NhanByte (ACK);
STOP_bit ();

Дані = (WORD) data_4msb <<8 | data_4lsb;
повернення даних;
)

"main.c"/************************************************* ****
Ця програма була підготовлена в
CodeWizardAVR V1.24.8d Професійні
Автоматична програма Generator
© Copyright 1998-2006 Павло Haiduc, HP InfoTech SRL
http://www.hpinfotech.com

Проект:
Версія:
Дата: 7/20/2009
Автор: F4CG
Компанія: F4CG
Коментарі:

Chip Type: ATmega32
Тип програми: Заявка
Тактова частота: 8.000000 МГц
Пам'ять моделі: Малий
Зовнішні розміри SRAM: 0
Дані Стек розмір: 512
************************************************** *** /

# Включити "mega32.h"
# Включити "global.h"
# Включити "SMBus.c"Основними недійсним (недійсними)
(
delay_ms (100); / / Power запуску Стабільний

PORTA = 0x00;
DDRA = 0xFF;

PORTB = 0x00;
DDRB = 0xFF;

PORTC = 0x00;
DDRC = 0xFF;

PORTD = 0x00;
DDRD = 0xFE;

/ / Ініціалізація USART
/ /
Зв'язок Параметри: 8 даних, 1 стоп, без перевірки парності
/ / USART Receiver: Про
/ / USART передавача: Про
/ / USART Режим: Асинхронні
/ / USART швидкість: 9600
UCSRA = 0x00;
UCSRB = 0x98;
UCSRC = 0x86;
UBRRH = 0x00;
UBRRL = 0x33;

/ / Глобальний дозволити переривання
/ / # АНМ ( "SEI")printf ("--------------------------------------- \ N \ R ");
printf ("------------ IR Температура ------------ \ N \ R ");
printf ("------------ MLX90615 ------------ \ N \ R ");
printf ("--------------------------------------- \ N \ R ");

MLX90615_init ();
delay_ms (200); / / Чекати після POR, Tvalid = 0.15s

в той час як (1)
(

Object_Temperature ();
delay_ms (1000);) / / Кінець, хоча
) / / Кінець основний

Object_Temperature недійсним (недійсними)
(
СЛОВО температури;

температура = read_RAM (0x00, 0x07);
printf ( "Tobj =% d.% dßC \ N \ R", ((температура * 2) -27315) / 100, ((WORD) ((температура * 2) -27315))% 100);
)

 

Welcome to EDABoard.com

Sponsor

Back
Top