Как исправить ошибку при вычислениях?

Схема: 7f4ad26795014d7c95a8c8bae501fe2d.BMP
"Чётную" температуру выводит как нужно. Но вот, к примеру, 9 грудусов - нет. Порядок работы при последовательном увеличении на градус - 8,8,10,10,12 и так далее. В чём может быть проблема? Загвоздка в том, что мне нужно работать с 2-х байтным числом.
Сам код:
проект isis+atmel studio
#include "main.h"

int speed=1;
//----------------------------------------
void port_ini(void)
{
	DDRD=0xFF;
	PORTD=0x00;

	DDRC=0xFF;
	PORTC=0x00;

	DDRB    = (1 << PB1)|(1 << PB2)|(1 << PB0);
	
	//----------
	DDRA=0xFF;
	PORTA=0xFF;
	
}

void spi_init(void){
	volatile char IOReg;
	SPCR = ((1<<SPE)|(1<<MSTR));//Включим шину, объявим ведущим
	  IOReg   = SPSR;               // очистить бит SPIF в регистре SPSR
	  IOReg   = SPDR;
}
void spi_read_array(uint8_t num, uint8_t *data)
{
	PORTA &= ~(1<<PA7);
	while(num--){
		SPDR = *data;
		while(!(SPSR & (1<<SPIF)));
		*data++ = SPDR;
	}
	PORTA |= (1<<PA7);

}
//----------------------------------------
int main(void)
{
	
	unsigned char c;
	unsigned char tempertur;
	c=0b10000000;
	int adc_value;
	float n;
	port_ini(); //Инициализируем порты
	LCD_ini();  //Инициализируем дисплей
	ADC_Init(); //Инициализируем АЦП
	clearlcd(); //Очистим дисплей
	//PORTA=c;
	spi_init();
	setpos(0,0);
	
	 signed short int buf[2] = {0,0};
	
    while(1)
    {	
		spi_read_array(2, buf);
	    setpos(0,0);
		
		buf[0]<<=8;
		buf[0]+=buf[1];
		buf[0]>>=3;
		n= (float)buf[0];
		
		n*=0.0625;
		
		
		
		sendcharlcd(((unsigned char)n%1000)/100+0x30);//Преобразуем число в код числа
		sendcharlcd(((unsigned char)n%100)/10+0x30);//Преобразуем число в код числа
		sendcharlcd(((unsigned char)n%10)+0x30);//Преобразуем число в код числа
		
		
		//speed=buf[0];
		if(buf[0]>=10){
			setpos(1,5);
			str_lcd("vorvard");
			normal();
			setpos(1,5);
			str_lcd("reverse");
			reverse();
		}
		
		buf[0]=0;
		buf[1]=0;
		_delay_ms(50);
    }
}
  • Вопрос задан
  • 161 просмотр
Пригласить эксперта
Ответы на вопрос 2
Ocelot
@Ocelot
buf объявлен как signed, а затем к нему применяется битовый сдвиг, что, вообще говоря, неопределённое поведение.
Ответ написан
15432
@15432
Системный программист ^_^
У вас же явно написано, если N нечетно, добавить единицу. Вот и получается 8, 8, 10, 10.
Ко всем нечетным единица приплюсовывается.

if((unsigned char)n%2!=0){
      n+=1; 
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы