Ir ao conteúdo
  • Cadastre-se

PIC Controle remoto PIC16f877a em BASIC - Não aciona PORTC


Posts recomendados

Boa noite, encontrei esse projeto na internet: 

 

 

 

 

Não entendo de programação mas fiz essas adaptações: coloquei um led sempre que o RX recebe com código correto, e está simulando perfeito. Porém o projeto original é pra o PIC 16F628a e eu só troquei a library no compilador e funcionou, só que tô tentando fazer o PORTC funcionar e nada...aqui estão os códigos que eu tô usando e o esquema no Proteus 8.6:

 

TX:


 

#chip 16F877A, 4

#define TX PORTA.0   'Define o pino RA0 como TX
Dir TX Out           'Define TX como saída
Dir PORTA.1 In       'Define PORTA.1 como entrada
Dir PORTA.2 In       'Define PORTA.2 como entrada       
Dir PORTA.3 In       'Define PORTA.3 como entrada
Dir PORTA.4 In       'Define PORTA.4 como entrada
Dir PORTB in         'Define todo o PORTB como entrada
Dir PORTC in

Do 
Codigo.1 = PORTA.1   'Copia o valor do pino RA1 para o bit 1 da variável Código
Codigo.2 = PORTA.2   'Copia o valor do pino RA2 para o bit 2 da variável Código
Codigo.3 = PORTA.3   'Copia o valor do pino RA3 para o bit 3 da variável Código
Codigo.4 = PORTA.4   'Copia o valor do pino RA4 para o bit 4 da variável Código


Dado = PORTB         'Copia o valor do PORTB para a variável Dado
Dado1 = PORTC
Transmita            'Chama a sub-rotina para transmitir o dado

Loop

Sub Transmita
' 01 é igual a 1
' 10 é igual a 0

'Inicio da transmissao
        'Rotina para transmitir pulso longo
        TX = 1
        Wait 2000 us
        TX = 0
        Wait 100 us


If Codigo.0 = 1 Then
Transmita1
Else
Transmita0
end if

If Codigo.1 = 1 Then
Transmita1
Else
Transmita0
end if

If Codigo.2 = 1 Then
Transmita1
Else
Transmita0
end if

If Codigo.3 = 1 Then
Transmita1
Else
Transmita0
end if

If Codigo.4 = 1 Then
Transmita1
Else
Transmita0
end if

If Codigo.5 = 1 Then
Transmita1
Else
Transmita0
end if

If Codigo.6 = 1 Then
Transmita1
Else
Transmita0
end if

If Codigo.7 = 1 Then
Transmita1
Else
Transmita0
end if


If Dado.0 = 1 Then
Transmita1
Else
Transmita0
end if

If Dado.1 = 1 Then
Transmita1
Else
Transmita0
end if

If Dado.2 = 1 Then
Transmita1
Else
Transmita0
end if

If Dado.3 = 1 Then
Transmita1
Else
Transmita0
end if

If Dado.4 = 1 Then
Transmita1
Else
Transmita0
end if

If Dado.5 = 1 Then
Transmita1
Else
Transmita0
end if

If Dado.6 = 1 Then
Transmita1
Else
Transmita0
end if

If Dado.7 = 1 Then
Transmita1
Else
Transmita0
end if

If Dado1.0 = 1 Then
Transmita1
Else
Transmita0
end if

If Dado1.1 = 1 Then
Transmita1
Else
Transmita0
end if

If Dado1.2 = 1 Then
Transmita1
Else
Transmita0
end if

If Dado1.3 = 1 Then
Transmita1
Else
Transmita0
end if

If Dado.4 = 1 Then
Transmita1
Else
Transmita0
end if

If Dado1.5 = 1 Then
Transmita1
Else
Transmita0
end if

If Dado1.6 = 1 Then
Transmita1
Else
Transmita0
end if

If Dado1.7 = 1 Then
Transmita1
Else
Transmita0
end if

end sub


Sub Transmita1
TX = 0
Wait 100 us
TX = 1
Wait 100 us
end sub

Sub Transmita0
TX = 1
Wait 100 us
TX = 0
Wait 100 us
end sub

 

 

 

 

 

RX:

#chip 16F877A, 4

#define RX PORTA.0   'Define o pino RA0 como RX para receber a transmisão
Dir RX In            'Define a RX como entrada
Dir PORTA.1 In       'Define o pino RA1 como entrada
Dir PORTA.2 In       'Define o pino RA2 como entrada
Dir PORTA.3 In       'Define o pino RA3 como entrada
Dir PORTA.4 In       'Define o pino RA4 como entrada
Dir PORTB Out        'Define todo PORTB como saida
Dir PORTC out

Wait 10 ms

'Zera variáveis
CodigoLocal = 0

Do
'=============================================================================
'Identifica Pulso de 2000 ms para iniciar a leitura do dado
'=============================================================================
Inicio:
Contador = 0                 'Zera contador

Volta:
If RX = 1 Then               'Testa se o sinal está em nível alto
   Contador = Contador + 1   'Incrementa contador
   wait 15 us                'Aguarda 15 microsegundos
   Goto Volta                'Volta para testar o pulso novamente
End if                       'Fim da rotina If

If Contador < 95 Then        'Se contador menor que 95, cancela e volta p/ Inicio
Goto Inicio
end if
                             'Se contador maior que 95, receba o dado
'=============================================================================
                                                                                 

Receba                       'Chama sub-rotina para receber o dado
DecodificaManchester         'Chama sub-rotina para decodificar o dado recebido
DadoRecebido = dado          'Salva valor do dado recebido


'Verificar codificação
dadoA = codigoA              'Copia o codigoA na variável dadoA para decodifica-lo usando a sub-rotina DecodificaManchester
dadoB = codigoB              'Copia o codigoA na variável dadoA para decodifica-lo usando a sub-rotina DecodificaManchester
DecodificaManchester         'Chama sub-rotina para decodificar o Código recebido
CodigoRecebido = dado        'Salva valor do codigo recebido

'Lendo o código local 
CodigoLocal.1 = PORTA.1      'Copia o estado do pino RA1 no bit 1 da variável CodigoLocal
CodigoLocal.2 = PORTA.2      'Copia o estado do pino RA2 no bit 2 da variável CodigoLocal
CodigoLocal.3 = PORTA.3      'Copia o estado do pino RA3 no bit 3 da variável CodigoLocal
CodigoLocal.4 = PORTA.4      'Copia o estado do pino RA4 no bit 4 da variável CodigoLocal

'Verifica se é o código correto
If CodigoLocal = CodigoRecebido Then
PORTB = DadoRecebido 
end if               'Se o código é correto, então PORTB recebe o valor do dado recebido.
If CodigoLocal = CodigoRecebido Then
PORTD.0 = 1
wait 100 ms
PORTD.0 = 0
end if           

Loop


Sub Receba

Wait 145 us                  'Aguarda 145 microsegundo para sincronizar os pulsos

codigoA.0 = RX
Wait 100 us
codigoA.1 = RX
Wait 100 us
codigoA.2 = RX
Wait 100 us
codigoA.3 = RX
Wait 100 us
codigoA.4 = RX
Wait 100 us
codigoA.5 = RX
Wait 100 us
codigoA.6 = RX
Wait 100 us
codigoA.7 = RX

wait 100 us
codigoB.0 = RX
Wait 100 us
codigoB.1 = RX
Wait 100 us
codigoB.2 = RX
Wait 100 us
codigoB.3 = RX
Wait 100 us
codigoB.4 = RX
Wait 100 us
codigoB.5 = RX
Wait 100 us
codigoB.6 = RX
Wait 100 us
codigoB.7 = RX

Wait 100 us
dadoA.0 = RX
Wait 100 us
dadoA.1 = RX
Wait 100 us
dadoA.2 = RX
Wait 100 us
dadoA.3 = RX
Wait 100 us
dadoA.4 = RX
Wait 100 us
dadoA.5 = RX
Wait 100 us
dadoA.6 = RX
Wait 100 us
dadoA.7 = RX

Wait 100 us
dadoB.0 = RX
Wait 100 us
dadoB.1 = RX
Wait 100 us
dadoB.2 = RX
Wait 100 us
dadoB.3 = RX
Wait 100 us
dadoB.4 = RX
Wait 100 us
dadoB.5 = RX
Wait 100 us
dadoB.6 = RX
Wait 100 us
dadoB.7 = RX


End sub


Sub DecodificaManchester

If dadoA.0=1 Then 
    If dadoA.1=1 Then GOTO erro
    MyData_recebendo.0 = 0
else 
    If dadoA.1=0 Then GOTO erro    
    MyData_recebendo.0 = 1
end if

If dadoA.2=1 Then 
    If dadoA.3=1 Then GOTO erro
    MyData_recebendo.1 = 0
else 
    If dadoA.3=0 Then GOTO erro
    MyData_recebendo.1 = 1
end if

If dadoA.4=1 Then 
    If dadoA.5=1 Then GOTO erro
    MyData_recebendo.2 = 0
else 
    If dadoA.5=0 Then GOTO erro
    MyData_recebendo.2 = 1
end if


If dadoA.6=1 Then 
    If dadoA.7=1 Then GOTO erro
    MyData_recebendo.3 = 0
else 
    If dadoA.7=0 Then GOTO erro
    MyData_recebendo.3 = 1
end if


If dadoB.0=1 Then 
    If dadoB.1=1 Then GOTO erro
    MyData_recebendo.4 = 0
else 
    If dadoB.1=0 Then GOTO erro
    MyData_recebendo.4 = 1
end if


If dadoB.2=1 Then 
    If dadoB.3=1 Then GOTO erro
    MyData_recebendo.5 = 0
else 
    If dadoB.3=0 Then GOTO erro
    MyData_recebendo.5 = 1
end if

If dadoB.4=1 Then 
    If dadoB.5=1 Then GOTO erro
    MyData_recebendo.6 = 0
else 
    If dadoB.5=0 Then GOTO erro
    MyData_recebendo.6 = 1
end if


If dadoB.6=1 Then 
    If dadoB.7=1 Then GOTO erro
    MyData_recebendo.7 = 0
else 
    If dadoB.7=0 Then GOTO erro
    MyData_recebendo.7 = 1
end if

    dado = MyData_recebendo


end sub

erro:
Goto Inicio
end

 

 

 

 

esquema está em .rar

 

 

 

projeto 877a.rar

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Melhorou... 1 pouco. Mas acho que você pode melhorar ainda +. Algo como: onde o programa para, qual mensagem de erro, o que ele faz, o que devia fazer, etc. Dica rode passo a passo.

Desculpe mas o programa é muito grande, não muito eficiente - coisa de amador - sem ofensa -  e ruim de debugar mentalmente. Mas...

Vejo menção do PORTD

9 horas atrás, aslem disse:

PORTD.0 = 1 wait 100 ms PORTD.0 = 0

mas não vejo seu setup. Seria um norte?

 

Certa feita fiz um treco parecido pra um amigo de outro forum. Literalmente menos de meia dúzia de linhas em c. Talvez eu ache aqui no meu baú da morte...

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

sou bem leigo em programação mas vou tentar explicar: o programa não dá erro, compila normal

o que ele faz: quando aperto a tecla PORTB.1 no TX, ele aciona o led no PORTB.1 ( na realidade vou acionar relés através de TRIAC)

o que ele devia fazer: quando apertar a tecla no PORTC, deveria acender o led no PORTC do RX

 

Sobre isso aqui: PORTD.0 = 1 wait 100 ms PORTD.0 = 0

 

Isso é um led que ficara piscando enquanto o RX estiver conectado com o TX porque o TX envia uma codificação igual de controle de portão pro RX, se ele tiverem o mesmo código, esse led indicará que está tudo bem, se ele tiver apagado, os PICs não estão comunicando( isso é pra segurança) e está funcionando nesse projeto

 

meu maior problema é aproveitar o PORTC e fazer ele comunicar com o outro PIC, visto que o PORTB está funcionando perfeitamente

 

e essa linguagem é absolutamente fácil e pobre, por isso eu escolhi pra o meu primeiro projeto

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Ah. você quer espelhar o port de um mc no outro via serial (rf). E teve sucesso com o B mas não com o C e quer ambos.  Este resumo correto?

Bem... o anexo (achei!) não deve te ajudar totalmente. Mas nele há alguma referência de como usar a serial 'de verdade' que o mc tem via hw.  Só pra 'humilhar' no bom sentido, claro! eis o 'resumo'

for(;;)
{
//    TXREG=PORTB;     //lado dos
//    while(TXIF);     // sensores    

    while(!RCIF);    //lado dos
    PORTB=RCREG;       //leds
}

É só um espelho de 1 port.  Pra mais ports você deve fazer um protocolinho bem simples pra separar os bytes.

Penso que você está a fazer algo com sw tipo bit banging né? Temos um amigo Paulão que é phd em basic e tem boa vontade. De repente ele te ajuda a programar o bit banging no basic, apesar de não usar este mc.

1 hora atrás, aslem disse:

essa linguagem é absolutamente fácil e pobre

Concordamos com a facilidade mas não com a pobreza. De fato é mais rica que o c. (Paulão... nem vem! kk)

teste.zip

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

achei um projetaço!

http://l3tec.tecnologia.ws/iblog/archives/8218

 

código do tx:

 

;===========================================================================================
;
;       tx p/controle remoto de 32 canais com pic 16f877a
;
;       autor : claudio larios
;
;       data:04/04/2016
;
;       com opção de pulso ou retenção
;       saida normal ou invertida
;
;       use xtal de 4mhz
;
;       uso didático
;       este arquivo é parte integrante do blog larios.tecnologia.ws
;===========================================================================================
;arquivos para compilação
    list p=16f877a , r=dec
    include "p16f877a.inc" ;arquivo padrão    
      errorlevel      -302   ;elimina mensagem de erro
;==============================================================================================================  
;palavra de configuração
  __config        _cp_off & _pwrte_on & _wrt_off & _wdt_off  & _hs_osc    & _boden_on   & _lvp_off & _debug_off
;===============================================================================================================        
;troca de bancos
#define        bank0    bcf    status,rp0     ;seta bank0 de memoria
#define        bank1    bsf    status,rp0    ;seta bank1

    cblock 0x20
      res5,res4,res3,res2,res1,res0,resx,temp,cnt,r7,r6,r5 
    endc
;===================================================================
; número serial
serial_h     equ 0cch
serial_l     equ 0aah
;===================================================================

;definições de pinos


#define saida 0x09,2 ;pino 10 re2

    org 00h
inicio:

    
; falta aqui desligar comparadores e conversor ad,ligar pullup do portb etc,...
    bank1
    movlw   .7
    movwf   cmcon
    movlw  .7
    movwf  adcon1
    clrf   option_reg  ;liga pull ups no portb
  

    movlw  0xff   ;prepara portas para leitura dos interruptores 
    movwf  trisa
    movwf  trisb
    movwf  trisc
    movwf  trisd
    movlw  0x03
    movwf  trise ; somente re2 como saída
    bank0
    clrf   adcon0
    clrf   porte ; desliga saida

    movlw  serial_h  ;número serial do aparelho
    movwf  resx
    movlw  serial_l
    movwf  res0


    
    comf  porta,w   ;inverte conteudo em 'w'
    andlw 0x3f    ;zera bits 6 e 7
    movwf res1
    comf  portb,w   ;inverte conteudo em 'w'
    movwf res2
    comf  portc,w   ;inverte conteudo em 'w'
    movwf res3
    comf  portd,w   ;inverte conteudo em 'w'
    movwf res4
    comf  porte,w   ;inverte conteudo em 'w'
    andlw 0x03    ;zera bits 2 a 7
    movwf temp
    movlw  .6
    movwf  cnt
loop1:
    bcf   status,c  ;desloca 6 casas para esquerda
    rlf   temp,f
    decfsz cnt,f
    goto  loop1

    movfw temp
    iorwf res1,f    ;bits 0 e 1 de re vai para res1 6,7
 
    movfw  res4
    addwf  res3,w
    addwf  res2,w
    addwf  res1,w
    addwf  res0,w
    addwf  resx,w
    movwf  res5       

    movfw  res4      ;testa por alguma tecla apertada
    btfss  status,z
    goto   seg11
    movfw  res3
    btfss  status,z
    goto   seg11
    movfw  res2
    btfss  status,z
    goto   seg11
    movfw  res1
    btfss  status,z
    goto   seg11
    goto   inicio   ;nenhuma tecla apertada
;=====================================================
;       transmitir
;======================================================

seg11:

    call pausa_init
    call startbit  ;envia start bit

    movlw .56    ;;quantidade de bits a transmitir
    movwf  r5
volt10:
    bcf   status,c
    rrf   res5,f
    rrf   res4,f
    rrf   res3,f
    rrf   res2,f
    rrf   res1,f
    rrf   res0,f
    rrf   resx,f
    btfss status,c
    goto  env_0
    call  bit1
    goto  dj
env_0:
    call  bit0

dj:
    decfsz r5,f
    goto  volt10
    goto  inicio

;=================================================
;rotinas

delay1ck:
      movlw .140
      movwf  r7
      decfsz r7,f
      goto   $-1
      return

bit0:
    bcf saida
    call delay1ck
    bsf saida
    call delay1ck
    call delay1ck
    bcf saida
    return


bit1:
    bcf saida
    call delay1ck
    call delay1ck
    bsf saida
    call delay1ck
    bcf saida
    return

startbit:
    bsf saida
    call delay1ck
    bcf saida
    return

pausa_init:
    movlw .23    ;23 clocks
    movwf  r6
rty:
    call  delay1ck
    decfsz r6,f
    goto rty
    return

    end

    end
 

 

 

 

 

porém

 

precisava que pelo menos 1 vez por segundo esse código fosse transmitido sozinho, e no rx ,um led aceso toda vez que essa transmissão fosse feita, pra comprovar que o circuito está funcionando, alguém ajuda?

 

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...