Re: Помогите. Не могу понять тянет ли ардуино проект.
95% времени основной цикл занимается тем, что ждет, пока таймер запишет в CalcedWaveLength что-либо ненулевое.
Таймер в CalcedWaveLength записывает посчитанную длительность импульса как только импульс закончится. При этом в качестве единицы измерения используются не микросекунды, а в вызовы таймера. Если на ноге существовала 1 в течении 4х вызовов таймера - в CalcedWaveLength попадет именно 4. И попадет она туда строго после того, как импульс закончится.
Этот веселый цикл for (;CalcedWaveLength==0;) со смайликом тупо стоит и ждет пока таймер не запишет CalcedWaveLength. Как только обнаружилось, что в переменной CalcedWaveLength не 0 (таймер записал значение), цикл ожидания завершается и идет программа дальше.
После получения CalcedWaveLength сохраняем ее значение, обнуляем (чтобы не пропустить следующую длительность импульса) и шлем в комп полученные данные.
В новом коде сразу идет анализ полученных данных исходя из известных длительностей.
Код:
uint8_t cwl=CalcedWaveLength;
CalcedWaveLength=0;
if ((cwl>2)&&(cwl<5))
UART_SendByte('0');
else
if ((cwl>=5)&& (cwl<8))
UART_SendByte('1');
else
UART_SendByte('?');
Re: Помогите. Не могу понять тянет ли ардуино проект.
Ты на какую ногу вешаешь вход данных?
Re: Помогите. Не могу понять тянет ли ардуино проект.
Чтобы проверить работает ли хоть что-то, вставил "неправильные" функции вывода:
void loop (void)
{
for (;CalcedWaveLength==0;);
uint8_t cwl=CalcedWaveLength;
CalcedWaveLength=0;
if ((cwl>2)&&(cwl<5)) {
UART_SendByte('0');
Serial.print('0'); }
else
if ((cwl>=5)&& (cwl<8)) {
UART_SendByte('1');
Serial.print('1');
}
else {
UART_SendByte('?');
Serial.print('2');
}
}
открыл монитор порта - тишина
Re: Помогите. Не могу понять тянет ли ардуино проект.
Цитата:
Сообщение от
SBorovkov
Ты на какую ногу вешаешь вход данных?
Менял. Пробую и D2 и D3. Сейчас висит на D2.
Re: Помогите. Не могу понять тянет ли ардуино проект.
Используй либо мои функции отсылки данных в UART либо свои. Мешать их в одном проекте нельзя.
"Неправильную" инициализацию порта не забыл добавить?
И мою инициализацию UART_Init() убирай тогда.
Если не поможет инициализация порта, пробуй поменять содержимое таймера на какое-нибудь простое, в духе.
WaveLength++;
if (WaveLength==50)
{
WaveLength=0;
CalcedWaveLength=3;
}
Ну и в начале попробуй что-нибудь заслать в порт для теста.
Re: Помогите. Не могу понять тянет ли ардуино проект.
"Неправильную" инициализацию порта не забыл добавить? - просто не понял, что и куда добавлять.
Re: Помогите. Не могу понять тянет ли ардуино проект.
И еще:
for (;CalcedWaveLength==0;);
судя по всему, из этого цикла программа уже не выходит
Re: Помогите. Не могу понять тянет ли ардуино проект.
Проверял банально управляя зажиганием и гашением светодиода. 8-)
Re: Помогите. Не могу понять тянет ли ардуино проект.
Вместо моей инициализации UART_init() надо вписать твою инициализацию порта
Serial.begin(115200);
Из цикла видимо не выходит потому, что CalcedWaveLength==0
Re: Помогите. Не могу понять тянет ли ардуино проект.
другой код в прерывание пробовал записать? Который просто до 50 считает