Gönderen Konu: STM32F103C8 Kızılötesi Uzaktan Kumanda  (Okunma sayısı 219 defa)

Çevrimdışı crazy

  • Kıdemli
  • ****
  • İleti: 135
STM32F103C8 Kızılötesi Uzaktan Kumanda
« : 05 Şubat 2018, 08:34:08 »

Kod: [Seç]
#include "stm32f10x.h"                  // Device header
#define REMOTE_ID 0



void Remote_Init(void);
u8 Remote_Scan(void);

void Remote_Init(void)
{

  RCC->APB2ENR   |= 0x00000010; //PORTC clock
  GPIOC->CRH     &= 0x00000000;
  GPIOC->CRH     |= 0x00330000;
  GPIOC->ODR     &= ~(1 << 13);
 
  RCC->APB1ENR   |= 1 << 2; //TIM4 clock
  RCC->APB2ENR   |= 1 << 3; //PORTB clock

  GPIOB->CRH     &= 0XFFFFFF0F;
  GPIOB->CRH     |= 0X00000080; // PB9  ir led giriş
  GPIOB->ODR     |= 1 << 9; //PB9

  TIM4->ARR      = 10000;    //10ms
  TIM4->PSC      = 71;     //1us
  TIM4->CCMR2   |= 1 << 8; //CC4S=01
  TIM4->CCMR2   |= 3 << 12; //IC4F=0011
  TIM4->CCMR2   |= 0 << 10; //IC4PS=00
  TIM4->CCR4     = 0;
  TIM4->CCER    |= 0 << 13; //CC4P=0
  TIM4->CCER    |= 1 << 12; //CC4E=1
  TIM4->DIER    |= 1 << 4; //CC4IE
  TIM4->DIER    |= 1 << 0;
  NVIC->ISER[0] |= 1 << 30;
  TIM4->CR1     |= 0x01;
}

u8  RmtSta = 0;
u16 Dval;
u32 RmtRec = 0;
u8  RmtCnt = 0;

void TIM4_IRQHandler(void)
{
  u16 tsr;
  tsr = TIM4->SR;
  if (tsr & 0X01)
  {
    if (RmtSta & 0x80)
    {
      RmtSta &= ~0X10;
      if ((RmtSta & 0X0F) == 0X00)RmtSta |= 1 << 6;
      if ((RmtSta & 0X0F) < 14)RmtSta++;
      else
      {
        RmtSta &= ~(1 << 7);
        RmtSta &= 0XF0;
      }
    }
  }
  if (tsr & 0x10)
  {
    if (GPIOB->IDR & 0x200)
    {
      TIM4->CCER |= 1 << 13;
      TIM4->CNT = 0;
      RmtSta |= 0X10;
    } else
    {
      Dval = TIM4->CCR4;
      TIM4->CCER &= ~(1 << 13);
      if (RmtSta & 0X10)
      {
        if (RmtSta & 0X80)
        {

          if (Dval > 300 && Dval < 800)
          {
            RmtRec <<= 1;
            RmtRec |= 0;
          } else if (Dval > 1400 && Dval < 1800)
          {
            RmtRec <<= 1;
            RmtRec |= 1;
          } else if (Dval > 2200 && Dval < 2600)
          {
            RmtCnt++;
            RmtSta &= 0XF0;
          }
        } else if (Dval > 4200 && Dval < 4700)
        {
          RmtSta |= 1 << 7;
          RmtCnt = 0;
        }
      }
      RmtSta &= ~(1 << 4);
    }
  }
  TIM4->SR = 0;
}

u8 Remote_Scan(void)
{
  static u8 sta = 0;
  static u8 t1, t2;

  if (RmtSta & (1 << 6))
  {
    t1 = RmtRec >> 24;
    t2 = (RmtRec >> 16) & 0xff;

   // if ((t1 == (u8)~t2) || t1 == REMOTE_ID)
    if(1)
    {
      t1 = RmtRec >> 8;
      t2 = RmtRec;


      if (t1 == (u8)~t2)
        sta = t1;
    }
    if ((sta == 0) || ((RmtSta & 0X80) == 0))
    {
      RmtSta &= ~(1 << 6);
      RmtCnt = 0;
    }
  }
  return sta;
}

u8 key;
char *str;

int main()
{

  Remote_Init();
 
  while (1)
  {

    key = Remote_Scan();
    if (key)
    {
      switch (key)
      {
        case 88:
          {
            GPIOC->ODR &= ~(1 << 13);
            str = "Led Yandi";
          }
          break;
        case 18:
          {
            GPIOC->ODR |= (1 << 13);

            str = " Led Sondu";
          }
          break;
        case 224:
          {
            str = "RIGHT";
          }
          break;
        case 226:
          {
            str = "LEFT";
          }   
          break;

        case 42:
          {
            str = "PLAY";
          }
          break;
        case 19:
          {
            str = "RIGHT";
          }
          break;
        case 168:
          {
            str = "LEFT";
          }
          break;
        case 10:
          {
            str = "DOWN";
          }
          break;
        case 72:
          {
            str = "VOL-";
          }
          break;
        case 136:
          {
            str = "VOL+";
          }
          break;
        case 50:
          {
            str = "1";
          }
          break;
        case 112:
          {
            str = "2";
          }
          break;
        case 176:
          {
            str = "3";
          }
          break;
        case 210:
          {
            str = "4";
          }
          break;
        case 242:
          {
            str = "5";
          }
          break;
        case 144:
          {
            str = "6";
          }
          break;
        case 60:
          {
            str = "7";
          }
          break;
        default:
          str = "0";
          break;
      }
    }
  }

}