Bir sensör cihazı tarafından döndürülen bazı değerleri okumaya çalışıyorum. Her şey iyi durumda, ama sensörden verileri doğru şekilde almak için uğraşıyorum.Veri talebi sadece adres değeri (I2C) döndürüyor
datasheet'da, sıralama, durum, direnç, tvoc: sırayla bayt almam gerektiğini söylüyor.
Benim terminali aynı değeri 23.130 (0x5a5a)
Bu düzgün benim i2c_start()
demiyorum o beni inandıramaz saçıyor tutar. In the protocol readmeI2C_start(SLAVE_READ_ADDRESS);'
ile okunan adresi 0xB5 olarak bilinen başlangıç noktası ile değiştirmeyi denedim, ancak bu hatamı döndürür.
/* Name: main.c
* Author: <insert your name here>
* Copyright: <insert your copyright message here>
* License: <insert your license reference here>
*/
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include <uart.h>
#include <i2c_master.h>
#define LED PB5
#define I2C_READ 0x5A
char buffer[10];
uint16_t val = 0;
uint16_t pred = 0;
uint8_t status = 0;
uint8_t resistance = 0;
uint8_t tvoc = 0;
void getVal()
{
if(i2c_start(I2C_READ))
{
//uart_puts("Start ");
val = ((uint8_t)i2c_read_ack())<<8;
val |= i2c_read_ack();
pred = ((uint16_t)i2c_read_ack())<<8;
pred |= i2c_read_ack();
// status = ((uint8_t)i2c_read_ack())<<8;
// status |= i2c_read_ack();
// resistance = ((uint8_t)i2c_read_ack())<<8;
// resistance |= i2c_read_ack();
// tvoc = ((uint8_t)i2c_read_ack())<<8;
// tvoc |= i2c_read_nack();
i2c_stop();
} else
{
uart_puts("Error");
i2c_stop();
}
}
int main(void)
{
init_uart(57600);
i2c_init();
DDRB = _BV(5);
for(;;)
{
getVal();
itoa(val, buffer, 10); //convert decimal to string base 10
uart_puts(buffer);
uart_puts(" ");
itoa(pred, buffer, 10); //convert decimal to string base 10
uart_puts(buffer);
uart_puts(" ");
itoa(status, buffer, 10); //convert decimal to string base 10
uart_puts(buffer);
uart_puts(" ");
itoa(resistance, buffer, 10); //convert decimal to string base 10
uart_puts(buffer);
uart_puts(" ");
itoa(tvoc, buffer, 10); //convert decimal to string base 10
uart_puts(buffer);
uart_puts(" ");
PORTB = 0xFF;
_delay_ms(500);
PORTB = 0x00;
_delay_ms(500);
}
return 0; /* never reached */
}
8 bit ve OR öğelerini değiştirdiğiniz değişkenlerin çoğu "uint8_t" türündendir. Yani bu işe yaramayacak. –
Tamam, arabellek boyutunu artıracağım! Başka ne yanlış yapıyorum? – SensationSama
Ooops Son yorumu yazdığımda yanlış okumuş. char buffer [4]; 'yalnızca 3 hanelik ondalık sayı için yeterince büyük olacaktır. –