SMBus met MLX90615

M

member_tdh

Guest
Hallo iedereen!

Op dit moment
ben ik de studie van de SMBUS protocol.Ik
ben het maken van een project dat gebruik IR temperatuur (MLX90615).

Het resultaat dat
ik heb receied altijd is:
Tobj = 382.19C
Tobj = 382.19C
Tobj = 382.19C
...

Mijn code kan verkeerd, kan iemand mij helpen ...!!?

Thanks very very much!

Dit is mijn code:

"SMBus.h"

# ifndef __SMBUS_INCLUDE__
# define __SMBUS_INCLUDE__

# define _SDA 7 / / PORTD.7
# define _SCL 6 / / PORTD.6

# define _SDA_OUTPUT DDRD | = (1 <<_SDA);
# define _SDA_INPUT DDRD & = ~ (1 <<_SDA);
# define _SCL_OUTPUT DDRD | = (1 <<_SCL);

# define mSDA_IN PIND.7

# define mSDA_HIGH PORTD | = (1 <<_SDA);
# define mSDA_LOW PORTD & = ~ (1 <<_SDA);
# define mSCL_HIGH PORTD | = (1 <<_SCL);
# define mSCL_LOW PORTD & = ~ (1 <<_SCL);# define TBUF 5
# define HIGHLEV 3
# define LOWLEV 1

# define ACK 0
# define NACK 1

# define WRITE 0x00 / / SMBus WRITE commando
# define LEES waarde 0x01 / / SMBus READ commando

# define SA 0x00 / / SMBus Slave adres
# define DEFAULT_SA 0x5B / / fabrieksinstelling SMBus Slave adres (MLX90615)
# define RAM_Access 0x00 / / RAM toegang commando
# define RAM_Tobj1 0x07 / / To1 adres in de eeprom
# define EEPROM_Access 0x20 / / EEPROM toegang commando
# define Read_Flags 0xF0
# define SLEEP_mode 0xFF

extern void MLX90615_init (void);
extern void START_bit (void);
extern void STOP_bit (void);
extern void SendRequest (void);
extern void DummyCommand (BYTE);
extern float CalcTemp (WORD);
extern WOORD read_RAM (BYTE slaveADDR, BYTE ADDR);
extern WOORD read_EEPROM (BYTE slaveADDR, BYTE ADDR);
extern void Object_Temperature (void);
extern void Ambient_Temperature (void);
extern void TruyenByte (BYTE x);
extern BYTE NhanByte (BYTE ack_nack);

# endif"SMBus.c"void MLX90615_init (void)
(
_SDA_OUTPUT / / Set SDA als output
_SCL_OUTPUT / / Set SCL als output
mSDA_HIGH; / / bus gratis
mSCL_HIGH;
)void START_bit (void)
(
_SDA_OUTPUT / / Set SDA als output
mSDA_HIGH / / Set SDA lijn
mSCL_HIGH / / Set SCL lijn
delay_us (TBUF); / / Generate bus vrije tijd tussen Stop
/ / En Start voorwaarde (Tbuf = 4.7us min)
mSDA_LOW; / / Clear SDA lijn
delay_us (TBUF); / / Hold-tijd na (herhaalde) Start
/ / Toestand.Na deze periode, de eerste klok wordt gegenereerd.
/ / (THD: sta = 4.0us min)
mSCL_LOW; / / Clear SCL lijn
)void STOP_bit (void)
(
_SDA_OUTPUT / / Set SDA als output
mSDA_LOW; / / Clear SDA lijn
mSCL_HIGH / / Set SCL lijn
delay_us (TBUF); / / Wacht een paar microseconden
mSDA_HIGH / / Set SDA lijn
mSCL_LOW;
)void TruyenByte (BYTE x)
(
BYTE i;

_SDA_OUTPUT / / Set SDA als output
for (i = 0; i <8; i )
(
mSCL_LOW;
if (x & 0x80) mSDA_HIGH;
anders mSDA_LOW;
x <<= 1;
mSCL_HIGH;
delay_us (20);
)
_SDA_INPUT / / SDA lijn als input
mSDA_LOW / / ack tai klok do 9
mSCL_LOW;
mSCL_HIGH;
if (mSDA_IN & 0x80) printf ( "MLX90615 writed fout ... ACK! \ n \ r");
mSCL_LOW;
)

BYTE NhanByte (BYTE ack_nack)
(
BYTE i;
WORD byte = 0;

_SDA_INPUT;
mSCL_LOW;
for (i = 0; i <8; i )
(
byte <<= 1;
mSCL_HIGH;
byte | = mSDA_IN;
mSCL_LOW;
delay_us (20);
)
_SDA_OUTPUT / / DATA-lijn in de output
PORTD.7 =! Ack_nack; / / "ack == 1" pull-down DATA-Line
mSCL_HIGH;
delay_us (20);
mSCL_LOW;
/ / _SDA_INPUT; / / Data-line-in ingang
/ / mSDA_HIGH;
terugkeer byte;
)

WORD read_RAM (BYTE slaveADDR, BYTE ADDR)
(
BYTE data_4lsb;
BYTE data_4msb;
BYTE data_crc;
WORD gegevens;

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

gegevens = (WORD) data_4msb <<8 | data_4lsb;
return data;
)

"main.c"/************************************************* ****
Dit programma werd geproduceerd door de
CodeWizardAVR V1.24.8d Professional
Automatisch Programma Generator
© Copyright 1998-2006 Pavel Haiduc, HP InfoTech srl
http://www.hpinfotech.com

Project:
Versie:
Datum: 7.20.2009
Auteur: F4CG
Bedrijf: F4CG
Reacties:

Chip type: ATmega32
Soort programma: Toepassing
Klokfrequentie: 8.000000 MHz
Memory model: Kleine
Externe SRAM grootte: 0
Gegevens Stack size: 512
************************************************** *** /

#
include "mega32.h"
#
include "global.h"
#
include "SMBus.c"void main (void)
(
delay_ms (100); / / Power Opstarten Stabiel

PORTA = 0x00;
DDRA = 0xFF;

PORTB = 0x00;
DDRB = 0xFF;

PORTC = 0x00;
DDRC = 0xFF;

PORTD = 0x00;
DDRD = 0xFE;

/ / USART initialisatie
/ / Communicatie Parameters: 8 databits, 1 stop, geen pariteit
/ / USART Receiver: On
/ / USART Transmitter: On
/ / USART Mode: Asynchrone
/ / USART Baudrate: 9600
UCSRA = 0x00;
UCSRB = 0x98;
UCSRC = 0x86;
UBRRH = 0x00;
UBRRL = 0x33;

/ / Global interrupts inschakelen
/ / # asm ( "sei")printf ( "--------------------------------------- \ n \ r");
printf ( "IR Temperatur ------------ ------------ \ n \ r");
printf ( "MLX90615 ------------ ------------ \ n \ r");
printf ( "--------------------------------------- \ n \ r");

MLX90615_init ();
delay_ms (200); / / Wacht na POR, Tvalid = 0.15s

while (1)
(

Object_Temperature ();
delay_ms (1000);) / / einde terwijl
) / / einde belangrijkste

void Object_Temperature (void)
(
WORD temperatuur;

temperatuur = read_RAM (0x00, 0x07);
printf ( "Tobj =% d.% dßC \ n \ r", ((temperatuur * 2) -27.315) / 100, ((WORD) ((temperatuur * 2) -27.315))% 100);
)

 

Welcome to EDABoard.com

Sponsor

Back
Top