Энкодер+AtMega32a

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Энкодер+AtMega32a

Сообщение oleg110592 »

[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=3774794#p3774794"]Так а в обычном офисе-то работает?[/uquote]
в моем обычном нет (FreeOffice)
Изображение
на виртуальной win7 установлен office2003 - там работает
[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=3774794#p3774794"]Там пару битовых полей записать[/uquote]
угу - я для F4 не стал с этим даже разбираться, оставил как есть

Код: Выделить всё

  /* Configure the main PLL */
    RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
                   (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);
Реклама
densir
Нашел транзистор. Понюхал.
Сообщения: 185
Зарегистрирован: Ср фев 03, 2010 20:12:15
Откуда: Барнаул

Re: Энкодер+AtMega32a

Сообщение densir »

В итоге разобрался я со своей проблемой, все оказалось проще чем я думал. Тот код, что я писал изначально так и оставил
Спойлер

Код: Выделить всё

void EncoderScan(void)
{
   next_state = PIND & 0x05;   // Берем текущее значение
   // И сравниваем со старым
   
   // Смотря в какую сторону оно поменялось -- увеличиваем
   // Или уменьшаем счетный регистр
   
   switch(prev_state)
   {
      case 4:
      {
         if(next_state == 5) up_state++;
         if(next_state == 0) down_state++;
         break;
      }
      
      case 0:
      {
         if(next_state == 4) up_state++;
         if(next_state == 1) down_state++;
         break;
      }
      case 1:
      {
         if(next_state == 0) up_state++;
         if(next_state == 5) down_state++;
         break;
      }
      case 5:
      {
         if(next_state == 1) up_state++;
         if(next_state == 4) down_state++;
         break;
      }
   }
   
   prev_state = next_state;      // Записываем новое значение
   // Предыдущего состояния
   
   
   if (up_state >= 4)            // 1 раз за 4 импульса изменяем состояние передачи
   {
      sw++;
      infoPage++;                   // Передача +
      up_state = 0;
      Light_timer=Light_Time;
   }
   if (down_state >= 4)
   {
      sw--;
      infoPage--;
      // Передача -
      down_state = 0;
      Light_timer=Light_Time;
   }

}
с той только разницей что опрашиваю его не в общем теле и не по внешнему прерыванию, а в прерывании по таймеру. К сожалению сильно пришлось перелопачивать код, прикручивая его к таймерам.
Я все еще учусь, и ох как тяжело это дается
Реклама
Ответить

Вернуться в «AVR»