Пробовал использовать подобный код для AVR правда на GCC и для DHT22. Но это неважно.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++; }
Дело в том, что код не слишком удачный. Он еще может быть работает на частоте 16 мегагерц и выше. Но при более низких частотах - не очень.
Вкратце:
Пусть частота процессора 1 Mhz у нас.
Тогда каждая asm команда у нас будет выполняться по одной микросекунде.
В строчке while (laststate==DHT_Read_Pin) минимум 3 команды, то есть уже 3 микросекунды.
Поэтому counter будет иметь в конце совсем не количество микросекунд, а количество интервалов по 5-7 микросекунд, что уже путает все карты.
Такой код надо писать для определенной частоты процессора. Желательно на ассемблере, но можно и на С, но тогда он будет работать только на определенном компиляторе с определенными флагами оптимизации.