Проблемы с математикой

Metalluga
Offline
Зарегистрирован: 21.04.2016

Собираю устройство на Pro Mini. ATMega 162. вот текст программы. когда смотрю данные в мониторе то до числа а=325 все считает правильно. как только превышает 325 умножает на неизвестно что, в итоге сумма значительно превышает ожидаемую. не пойму в чем может быть проблема? знатоки-подскажите

int PerPin = A0; 
int OutPin = 12;     
int a; 
long T;

void setup() {
  Serial.begin(115200);
  pinMode(OutPin, OUTPUT);
  pinMode(PerPin, INPUT);

}

void loop() {
 
  a = analogRead(PeriodPin);
  T= (a*100)+10;


 Serial.println(a);
 Serial.println(T);
}

 

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

ну.

не ясно, что там у тебя умножает, если скетч у тебя нерабочий и не понятно, что он делает.

MagicianT
Offline
Зарегистрирован: 03.10.2015

32 800 не влазит в 16-битную знаковую, надо декларировать как

long a;

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

MagicianT пишет:

32 800 не влазит в 16-битную знаковую, надо декларировать как

long a;

дык, у него же а никогда не превышает 1023, т.к. a = analogRead

MagicianT
Offline
Зарегистрирован: 03.10.2015

Клапауций 232 пишет:

MagicianT пишет:

32 800 не влазит в 16-битную знаковую, надо декларировать как

long a;

дык, у него же а никогда не превышает 1023, т.к. a = analogRead

а он на 100 умножает, вот и получится 328 от аналог-рида х 100 

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

MagicianT пишет:

Клапауций 232 пишет:

MagicianT пишет:

32 800 не влазит в 16-битную знаковую, надо декларировать как

long a;

дык, у него же а никогда не превышает 1023, т.к. a = analogRead

а он на 100 умножает, вот и получится 328 от аналог-рида х 100 

я к тому, что не декларировать, а преобразовывать во время вычисления int в long - long(a)

иначе, додекларируемся, что все переменные придётся декларировать как long, если результатом вычисления потребуется long, но фактически величины переменных будут на порядки меньше.

MagicianT
Offline
Зарегистрирован: 03.10.2015

Клапауций 232 пишет:
я к тому, что не декларировать, а преобразовывать во время вычисления int в long - long(a)

иначе, додекларируемся, что все переменные придётся декларировать как long, если результатом вычисления потребуется long, но фактически величины переменных будут на порядки меньше.

кастинг, да возможно, но правильно будет (long) a * 100

В данном случае, другой вариант без декларации и кастинга, математику делать с Т
a = analogRead(PeriodPin);
T = a;
T= (T*100)+10;

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Metalluga пишет:

смотрю данные в мониторе 

int PerPin = A0; 
int OutPin = 12;     
int a; 
long T;

void setup() {
  Serial.begin(115200);
  pinMode(OutPin, OUTPUT);
  pinMode(PerPin, INPUT);

}

void loop() {
 
  a = analogRead(PeriodPin);
  T= (a*100)+10;


 Serial.println(a);
 Serial.println(T);
}

Боюсь, что либо Вы запускаете другой скетч, либо просто троллите нас. Этот скетч не компилируется и, соответсвенно, ни в какой монитор ничего выводить не может. Всё, чо Вы можете увидеть с этим скетчем, это скромное сообщение "error: 'PeriodPin' was not declared in this scope"

Metalluga
Offline
Зарегистрирован: 21.04.2016

спасибо всем неравнодушным! извиняюсь за ошибку в скетче. писал поздно. не заметил изменений в 15 строке. но это просто опечатка а не троль.. помог совет MagicianT, но не понятно чем ардуине моя математика не понравилсь? хотелось бы понять. все таки а это же int  a не long. когда смотрел в мониторе больше чем 1023 не было

vitalikost
Offline
Зарегистрирован: 28.11.2014

int

Описание типа данных

Тип данных int (от англ. integer - целое число) один их наиболее часто используемых типов данных для хранения чисел.  intзанимает 2 байта памяти, и может хранить числа от -32 768 до 32 767 (от -2^15 до 2^15-1)

long

Описание типа

Тип данных long используется для хранения целых чисел в расширенном диапазоне от -2,147,483,648 до 2,147,483,647.long занимает 4 байта в памяти.

 

Metalluga
Offline
Зарегистрирован: 21.04.2016

vitalikost пишет:

int

Описание типа данных

Тип данных int (от англ. integer - целое число) один их наиболее часто используемых типов данных для хранения чисел.  intзанимает 2 байта памяти, и может хранить числа от -32 768 до 32 767 (от -2^15 до 2^15-1)

long

Описание типа

Тип данных long используется для хранения целых чисел в расширенном диапазоне от -2,147,483,648 до 2,147,483,647.long занимает 4 байта в памяти.

 

читать я умею.  в каком месте у меня а превышает 32 767 при опросе аналог рид?

Metalluga
Offline
Зарегистрирован: 21.04.2016

в процессе возник еще вопрос. почему при такой записи дробная часть всегда равно 0?

int DPin = A0;
float t;
int a;

void setup() {}
void loop() {
 a = analogRead(DPin);
t=a/1000;
}

 

Metalluga
Offline
Зарегистрирован: 21.04.2016

вопрос решил сам. видать дело в синтаксисе

vitalikost
Offline
Зарегистрирован: 28.11.2014

"как только превышает 325 умножает на неизвестно что"

сколько будет 328*100+10???

Metalluga
Offline
Зарегистрирован: 21.04.2016

vitalikost пишет:

"как только превышает 325 умножает на неизвестно что"

сколько будет 328*100+10???

будет 32810. но! я же для а беру числа от 0 до 1023. а 328*100+10 это уже Т. а в мониторе я читаю именно а

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Metalluga пишет:

видать дело в синтаксисе

Да, нет, не в нём.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

Metalluga пишет:

в процессе возник еще вопрос. почему при такой записи дробная часть всегда равно 0?

int DPin = A0;
float t;
int a;

void setup() {}
void loop() {
 a = analogRead(DPin);
t=a/1000;
}

а если так

int DPin = A0;
float t;
int a;

void setup() {}
void loop() {
 a = analogRead(DPin);
t=a/1000.00;
}

или так

int DPin = A0;
float t;
int a;

void setup() {}
void loop() {
 a = analogRead(DPin);
t=a*0.001;
}

 

Metalluga
Offline
Зарегистрирован: 21.04.2016

ЕвгенийП пишет:

Metalluga пишет:

видать дело в синтаксисе

Да, нет, не в нём.

а в чем тогда? то есть если написать 


a = analogRead(PeriodPin);

T = a;

T= T/1000; 

то работает, а если  Т=а/1000 то дробная часть .00 . в чем принципиальная разница?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Metalluga пишет:

то работает, а если  Т=а/1000 то дробная часть .00 . в чем принципиальная разница?

В семнатике операций, а не в синтаксисе.

А вообще, прочитайте какую-нибудь книжку по языку на котором пытаетесь писать, сразу жить легче станет.

Metalluga
Offline
Зарегистрирован: 21.04.2016

книжки нет а вот брошюру читал. ну и кроме общих формулировок хотелось бы что то по конкретнее

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015
http://arduino.ru/Reference/Float
Пример использования в коде

z = (float)x / 2.0;   // z равна .5 (следует использовать 2.0, а не 2)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Metalluga пишет:

книжки нет 

http://www.programming1189.ru/files/Kern_Ritch.pdf

Metalluga
Offline
Зарегистрирован: 21.04.2016

ЕвгенийП пишет:

Metalluga пишет:

книжки нет 

http://www.programming1189.ru/files/Kern_Ritch.pdf

спасибо