【问题标题】:How to interface LM75A temperature IC with AVR如何将 LM75A 温度 IC 与 AVR 连接
【发布时间】:2015-03-23 06:20:47
【问题描述】:

我正在尝试获取使用 i2c 连接到 atmega8 微控制器的 LM75A 的温度数据,并使用串行通信将数据显示到码头灯。我已经编写了代码,我得到的输出是

FF 7F 0F

根据数据表,如果我忽略FF 那么7F 0F 将导致+125 C 温度。但我不知道它是对还是错(以及为什么要忽略FF)。所以我对破解我得到的输出感到困惑。我认为是正确的代码,但如果它是错误的,请更正它。

代码:

#ifndef F_CPU
#define F_CPU 8000000UL 
#endif

#include <avr/io.h>
#include<util/delay.h>
#include <stdio.h>

//Serial tansmit
void serial_avr(char *str)
{
UCSRB=(1<<TXEN);
UCSRC=(1<<UCSZ1)|(1<<UCSZ0)|(1<<URSEL);
UBRRL=51;

for (unsigned int i=0;str[i]!=0;i++)
{
    UDR=str[i];

    while(!(UCSRA&(1<<UDRE)));
}

_delay_ms(500);
}

void i2c_init(void)
{
 TWSR=0x00;         
 TWBR=0x47;         
TWCR=0x04;      
}
void i2c_start(void)
{
    TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
    while ((TWCR & (1 << TWINT)) == 0);
}

void i2c_write(unsigned char data)
{
    TWDR = data ;
    TWCR = (1<< TWINT)|(1<<TWEN);
    while ((TWCR & (1 <<TWINT)) == 0);
}

unsigned char i2c_read(unsigned char ackVal)
{
    TWCR = (1<< TWINT) | (1<<TWEN) | (ackVal<<TWEA);
    while (!(TWCR & (1 <<TWINT)));
    return TWDR ; 



}

void i2c_stop()
{
        TWCR = (1<< TWINT)|(1<<TWEN)|(1<<TWSTO);
}


void main(void)
{
    int i =23;
    unsigned char temp[20]; 

    i2c_init();
    i2c_start();
    i2c_write(0b10010001); //slave address for LM75A

    i2c_stop();

    i2c_init();
    i2c_start();
    i2c_write(0b00000000); //pointer register address of LM75A

    i2c_stop();

    i2c_init();
    i2c_start();
    temp[20] = i2c_read(1);

    i2c_stop();

    while(1)
    {
         serial_avr(temp);
        _delay_ms(2000);



    }


}

我正在读取数组中的温度,我得到的输出为FF 7F 0F,当我将它初始化为一个普通的字符变量时,我得到的输出为C4。我很困惑,我不知道我在哪里错过了重点。如果代码有任何错误,请告诉我以及如何破解输出。??

请帮忙,谢谢!

【问题讨论】:

    标签: avr i2c


    【解决方案1】:

    第一个明显的错误是你如何对待数组temp[20]

    您只从传感器读取一个字节,然后将值从数组末尾写入。 (数组中唯一有效的点是 temp[0]temp[19]temp[20] 超过了分配的内存。)您应该从传感器读取 3 个字节并将它们存储在 temp[0]temp[2]

    temp 的下一个错误是您如何通过串口写出它。您应该写入数组的所有字节,而不是 0 之前的所有字节。您不知道数组的最后一个字节是 0,因为它从来没有字符串。一个方便的做法是给#define 一个数组长度值,这样您就可以在数组的声明和写入函数中引用它。

    在您解决这些问题之前,很难判断其余的是否正常工作。我看不出你怎么知道传感器的值是FF 7F 0F

    【讨论】:

    • 谢谢我已经做出了改变。你能告诉我如何将 16 位数据写入 i2c。例如我想将 0x41 和 0x27 写入同一个寄存器
    猜你喜欢
    • 1970-01-01
    • 2018-07-29
    • 2017-09-27
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多