Garin писал(а):
Прошу, кто разбирается помочь, переложить этот код для CodeVisionAVR.
DHT.C
Код:
/*
for (i=0; i<MAXTIMINGS; i++) {
//While state is the same count microseconds
while (laststate==DHT_Read_Pin) {
_delay_us(1);
counter++;
}
Пробовал использовать подобный код для AVR правда на GCC и для DHT22. Но это неважно.
Дело в том, что код не слишком удачный. Он еще может быть работает на частоте 16 мегагерц и выше. Но при более низких частотах - не очень.
Вкратце:
Пусть частота процессора 1 Mhz у нас.
Тогда каждая asm команда у нас будет выполняться по одной микросекунде.
В строчке while (laststate==DHT_Read_Pin) минимум 3 команды, то есть уже 3 микросекунды.
Поэтому counter будет иметь в конце совсем не количество микросекунд, а количество интервалов по 5-7 микросекунд, что уже путает все карты.
Такой код надо писать для определенной частоты процессора. Желательно на ассемблере, но можно и на С, но тогда он будет работать только на определенном компиляторе с определенными флагами оптимизации.