Интересно получается, если вставляю повторную проверку нажатия после основного цикла, то все прекрасно работает:
Код
//Опускаем CS
ACTIVATE_CS;
do
{
SPI::SPI_Exchange(z1_query,&z1);
SPI::SPI_Exchange(z2_query,&z2);
SPI::SPI_Exchange(x_query,&temp_x);
SPI::SPI_Exchange(y_query,&temp_y);
// SPI::SPI_Exchange(z1_query,&z1);
// SPI::SPI_Exchange(z2_query,&z2);
if(z1!=0)
{
r1 = (5*(temp_x)*(4096 - z1) - z1*(4096-temp_y))/(4096*z1);
r2 = (temp_x*(z2 - z1))/(4096*z1);
}
else
{
r1 = (5* temp_x*(0 - 1) - (4096-temp_y))/4096;
r2 = 1;
}
}while((r2 != 0)||(r1 < 2));
SPI::SPI_Exchange(z1_query,&z1);
SPI::SPI_Exchange(z2_query,&z2);
if(z1!=0)
{
r1 = (5*(temp_x)*(4096 - z1) - z1*(4096-temp_y))/(4096*z1);
r2 = (temp_x*(z2 - z1))/(4096*z1);
}
else
{
r1 = (5* temp_x*(0 - 1) - (4096-temp_y))/4096;
r2 = 1;
}
//Поднимаем CS
DEACTIVATE_CS;
А если делать ее в основном цикле, после получения координат, то все ломается:
Код
//Опускаем CS
ACTIVATE_CS;
do
{
SPI::SPI_Exchange(z1_query,&z1);
SPI::SPI_Exchange(z2_query,&z2);
SPI::SPI_Exchange(x_query,&temp_x);
SPI::SPI_Exchange(y_query,&temp_y);
SPI::SPI_Exchange(z1_query,&z1);
SPI::SPI_Exchange(z2_query,&z2);
if(z1!=0)
{
r1 = (5*(temp_x)*(4096 - z1) - z1*(4096-temp_y))/(4096*z1);
r2 = (temp_x*(z2 - z1))/(4096*z1);
}
else
{
r1 = (5* temp_x*(0 - 1) - (4096-temp_y))/4096;
r2 = 1;
}
}while((r2 != 0)||(r1 < 2));
//Поднимаем CS
DEACTIVATE_CS;
Цитата
Хм, в отсутствии ошибки расчёта уверен?
Очень на это похоже.
Такое ощущение, что ошибка кроется в передаче по SPI, но с внутренним дисплеем все проходит, как по маслу, а сигналы одни и те же. Так в чем же дело, есть у еще предположения, советы?
Проверял значения z1 и z2, вроде расчеты похожи на правду.
Все ломается, в смысле принимаются некорректные координаты, и калибровка оказывается неверной
Функция обмена данными по SPI:
Код
void SPI::SPI_Exchange(tU8 input, tU16 *output)
{
SPI::Spi_Send(0);
SPI::Spi_Send(0);
SPI::Spi_Send(0);
SPI::Spi_Send(input);
SPI::Spi_Send(0);
*output = S0SPDR;
}