Схема:
"Чётную" температуру выводит как нужно. Но вот, к примеру, 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);
}
}