Página 1 de 1

RC5 em CCS

MensagemEnviado: 14 Ago 2010 15:15
por roquetti
Pessoall, boa tarde, alguém tem a parte de um programa para ler receptor IR RC5 em CCS? eu tenho em MikroC, mas o MikroC é limitado a 2k e não dá para fazer muita coisa. obrigado.

MensagemEnviado: 15 Ago 2010 18:37
por tcpipchip
Aqui está em PICBASIC, pode ser ?

Código: Selecionar todos
' Biblioteca usado pelo receptor infravermelho
' 06/03/1999
' Miguel e Freeze
Include "ModeDefs.bas"

' Oscilador utilizado
DEFINE OSC              20

' Configurações para a porta serial
DEFINE HSER_RCSTA       90h   'Configura RX
DEFINE HSER_TXSTA       24h   'Configura TX
DEFINE HSER_BAUD        9600  'Baud Rate
DEFINE HSER_CLROERR           'Limpa bit OERR automaticamente (Overrun)

'Declaração de variáveis usadas na comunicação infravermelho RC5
Vet_Bits    var bit[194]  'Amostras de níveis do pacote RC5
Vet_DupBits var bit[28]   'Duplas de bits do pacote RC5
Pac_RC5      var   Word     'Pacote RC5 final de 12 bits
indRC5      var byte      'Auxiliar na construção de Vet_Bits   
indRC52     var byte      'Auxiliar na construção de Vet_DupBits
qtniveis    var byte      'Auxiliar da decodificação de Vet_Bits
IR_Com      var byte     'Código do botão pressionado
IR_Sis      var   byte     'Código do sistema atual
IR_Ctr      var byte      'Código do controle
IR_Sensor   var   PORTB.0     'Entrada física do sinal IR RC5
ind_pauseir var word      'Auxiliar na temporização de recepção IR

'Rotina de tratamento da recepção IR RC5. Retorna os dados de controle,
'sistema e comando. Se houve erro retorna 255 em IR_Ctr
Atualiza_IR:
       if (IR_Sensor = 1) then return
        for indRC5 = 0 to 193         'Neste looping recolhe amostras
         Vet_Bits[indRC5] = IR_Sensor 'do pacote RC5 e grava no array
         PauseUs 110                  'Vet_Bits para ser decodificado.
        next indRC5                   'Amostras em tempos de 110us
                                               
        indRC52 = 0                   'Inicialização de variáveis 
        qtniveis = 1                  'Define seqüências de 00 e 11 
        for indRC5 = 0 to 27          'Limpa Vet_Dups
         Vet_DupBits[indRC5] = 0
        next indRC5
        Vet_DupBits[indRC52] = Vet_Bits[0] 'Decodificação de Vet_Bits
        for indRC5 = 1 to 193      'Varre Vet_Bits por intervalos de 0 e 1
         if Vet_Bits[indRC5]=Vet_DupBits[indRC52] then
          qtniveis = qtniveis + 1
         else
          select  case (qtniveis/5)    'Identifica seqüências de 00 ou 11   
           case 1 :             'se 1 então período de 888us de 1 ou 0
            indRC52 = indRC52 + 1
            Vet_DupBits[indRC52] = Vet_Bits[indRC5]
            qtniveis = 1
           case 2, 3 : 'se 2 ou 3 período então período de 1,67ms de 11 ou 00
            indRC52 = indRC52 + 1     
            Vet_DupBits[indRC52] = Vet_Bits[indRC5-1]
            indRC52 = indRC52 + 1
            Vet_DupBits[indRC52] = Vet_Bits[indRC5]
            qtniveis = 1
           case else
            return
          end select   
         endif        'Agora Vet_DupBits possui as duplas de bits que
        next indRC5   'irão constituir o pacote final RC5
       
       indRC52 = 0    'Inicio da criação do pacote RC5.Se erro, então abortar
       if not(not Vet_DupBits[indRC52] and Vet_DupBits[indRC52+1]) then return
       For indRC5 = 11 to 0 step -1
        indRC52 = indRC52 + 2
        'Vare Vet_DupBits por duplas de bits e associa a 1 ou 0 para
        'carregar no pacote. 00=0 01=1 10=0 11=1
        if (not Vet_DupBits[indRC52] and not Vet_DupBits[indRC52+1]) then Pac_RC5.0[indRC5] = 0
        if (not Vet_DupBits[indRC52] and Vet_DupBits[indRC52+1]) then Pac_RC5.0[indRC5] = 1
        if (Vet_DupBits[indRC52] and not Vet_DupBits[indRC52+1]) then Pac_RC5.0[indRC5] = 0
        if (Vet_DupBits[indRC52] and Vet_DupBits[indRC52+1]) then Pac_RC5.0[indRC5] = 1
      Next indRC5
      'Agora  o pacote RC5 está formando com 12 bits. 
       
'Desmembra pacote. 6 bits para comando, 5 para sistema e 1 para controle
   IR_Com=Pac_RC5 & %00111111
    IR_Sis=(Pac_RC5 >>6) & %00011111
    IR_Ctr=(Pac_RC5 >>11)& %00000001
   
'Executa o comando recepcionado
    if (Ir_ctr) then
     if (Ir_sis = 0) then
      select case Ir_com
       case 16: hserout["l"] 'Volume +
       case 17: hserout["o"] 'Volume -
      end select                   
     endif
     if Ir_sis = 5 then
      select case Ir_com
       case 12: 'Liga/Desliga PC
       case 50: hserout["w"] 'Previous
       case 52: hserout["f"] 'Next
       case 53: hserout["y"] 'Play
       case 41: hserout["e"] 'Pause
       case 54: hserout["p"] 'Stop
      end select
     endif
    endif
    IR_Ctr = 255
    ind_pauseir = 0
    for ind_pauseir = 1 to 4000
     pauseus 100
    next ind_pauseir
    return

'Inicialização geral de variáveis
inits:
        clear
        TRISB = 1

'Inicio do programa principal
loop:   
       
        gosub atualiza_ir
       
        goto loop
end

MensagemEnviado: 15 Ago 2010 23:02
por roquetti
Obrigado, vou tentar ver se consigo migrar para C, abração

MensagemEnviado: 16 Ago 2010 13:00
por tcpipchip
OK

MensagemEnviado: 16 Ago 2010 13:01
por tcpipchip
fizemos tambem para python e perl (arm9 linux), se quiseres....