Ir ao conteúdo
  • Cadastre-se

DUVIDA - Comunicação PIC com o Xbee


andregalvao

Posts recomendados

Bem galera, não sei se tem alguem aqui com conhecimento no assunto, mas gostaria muito que alguem me ajudasse. Estou querendo fazer um pic 16f877a enviar dados (um numero inteiro) para o meu computador através de módulos Xbee. Onde o transmissor está conectado ao pic, que manda esses dados para o receptor que está conectado a usb do PC através da placa adaptadora da rogercom. Fiz um teste virtual da seguinte forma, o pic envia o numero inteiro 10 toda vez que um led acende, simulei através do proteus e enviei por uma porta serial simulada no computador. Deu tudo certo quando começei a monitorar, vi o numero 10 enviado toda vez q o led acendia (detalhe que na simulação do proteus os dados sao enviados por uma porta rs232 normal, e nao pelo xbee, mas que acredito eu que seja equivalente). Então fui pra prática, montei todo o circuito e consegui começar a ver os dados enviados no modo transparente, o problema é que os dados chegam de uma forma estranha e não o número 10 como esperado, através de um programa de monitoramento de portas seriais foi possivel ver os seguintes dados toda vez que o led acende:

83 FC (em hexadecimal, equivalente ao que aparece no X-CTU). e a string equivalente é ƒü, esses simbolos em ASCII. Já vi esse problema acontecendo por causa da taxa de transmissão, mas nesse caso ja mudei e nao adiantou. Não entendo o porque disso.

por favor, alguem me ajude!

Link para o comentário
Compartilhar em outros sites

  • 1 ano depois...

Estou tendo problemas também na comunicação do um PIC com o XBEE.

Vou colocar o fonte aí. Agradeçemos que puder ajudar. Abraços.

;*****************************************************
;* Programa PIC_RS232_F628.ASM
;* Estabelece comunicação serial RS232 com PC
;* a 9600bps, 8 bits de dados, sem paridade, 1 stop bit
;* Desenvolvido por : Marcio José Soares
;* Compilador MPLAB 6.32.00
;* PIC utilizado - PIC16F628A-I/P
;* Oscilador: interno a 4MHz
;*****************************************************
radix dec ;padrão->valores decimal se nao informado outro
include <P16F628A.INC> ;inclue arquivo

__config _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _INTOSC_OSC_NOCLKOUT

;*****************************************************
;* Definições
;*****************************************************

#DEFINE bank0 BCF STATUS,RP0 ;seta banco 0 da memória
#DEFINE bank1 BSF STATUS,RP0 ;seta banco 1 da memória

PICRES equ 0x00
PICRAM equ 0x20
LED equ 0x00

;*****************************************************
;* Variáveis
;*****************************************************
cblock PICRAM
T1
T2
T3
AUX
endc

;**************************************************************
;*define memoria de programa e vetor de reset
;**************************************************************
org PICRES ;reset
meureset:
goto esperaxbee
goto inicio ;desvia do endereco 0x04 - interrupcao

;**************************************************************
;* endereço e rotina de interrupção
;**************************************************************
org 4 ;toda interrupção aponta para este endereço
minhaint:
goto IntVector ;desvia para tratamento da INT

;
;**************************************************************
;* inicio do programa
;**************************************************************
esperaxbee:
call _1000ms ;aguarda 3 segundos para xbee se conectar
call _1000ms
call _1000ms


inicio:
movlw 0x00 ;ajuste para os bits INTCON
movwf INTCON

clrf PORTA
clrf PORTB

bank1 ;seleciona banco 1 para options e tris

movlw 0x00 ;ajusta como saída.
movwf TRISA ;

movlw 0x02 ;ajusta os bits em B como saida. RB1 é entrada
movwf TRISB ;coluna é saída, linha é entrada

bank0 ;volta ao banco 0... (padrão do reset)

;**************************************************************
;* seta canal serial no PIC
;**************************************************************
bank1 ;seleciona banco 1
movlw 0x19 ;velocidade selecionada 9600
movwf SPBRG ;8 bits, sem paridade, 1 stop bit
bsf TXSTA,TXEN ;habilita transmissao
bsf TXSTA,BRGH ;seleiona baud rate alto
bcf TXSTA,SYNC ;deleciona modo assincrono
bank0 ;volta para banco 0
bsf RCSTA,SPEN ;habilita port serial
bsf RCSTA,CREN ;habilita recepcao continua
bcf PIR1,RCIF ;limpa flag de interrupcao RCIF
bank1 ;seleciona banco 1
bsf PIE1,RCIE ;seta interrupçao RCIE
bank0 ;volta para banco 0
bsf INTCON,PEIE ;habilita perifericos
bsf INTCON,GIE ;habilita interrupçoes (Global)

movlw 0x07 ;desliga os conversores AD internos
movwf CMCON
;**************************************************************

movlw 0xFF ;carrega variável auxiliar
movwf AUX ;

bcf PORTA,LED ;apaga led
call _1000ms ;aguarda 1 segundo
call EnvMsg ;envia mensagem pela serial

;**************************************************************
;* loop principal
;* pisca led enquanto aguarda dado via RS232
;* trabalha com a INT de recepção
;**************************************************************
loop:
bsf PORTA,LED ;acende o led
call _1000ms
bcf PORTA,LED ;apada o led
call _1000ms
goto loop ;faz infinitamente

;***************************************************************
; subrotinas de interrupçoes
; salve o contexto geral se necessario - registros W, STATUS, etc
;***************************************************************
IntVector:
btfss PIR1,RCIF ;USART gerou int?
goto OutraInt ;nao, então verifique outra int

movlw 0x06 ;mascara para bits
andwf RCSTA,W ;checa erros
btfss STATUS,Z ;encontrado erro???
goto RcvError ;sim, trata

movf RCREG,W ;Sem erros. Pega dado recebido
movwf AUX ;guarda caracter recebido
call enviaeco ;e envia mensagem e caracter de eco
goto IntEnd ;fim da int. Restaure o contexto se necessario

RcvError:
bcf RCSTA,CREN ;limpa status de recebimento
bsf RCSTA,CREN
goto IntEnd ;fim da int. Restaure o contexto se necessario

OutraInt:
goto $-11 ;não existe outra int. Apenas retorna

IntEnd:
retfie ;retorna da INT

;***************************************************************
; subrotinas para enviar mensagens via RS232
;***************************************************************
EnvMsg:
call _1000ms
movlw 'S'
movwf TXREG ;envia caracter
call TestTx
return

enviaeco:

movf AUX,W ;envia caracter de eco
movwf TXREG ;envia caracter
call TestTx

return

;***************************************************************
; subrotina para testar buffer de transmissão
;***************************************************************
TestTx:
bank1
Tst:
call _1000ms
btfss TXSTA,TRMT ;testa se buffer vazio
goto Tst ;não, aguarda
bank0
return ;buffer vazio, pronto para próximo TX

;**************************************************************
;* Temporiza com clock de 4MHz interno ou externo
;* Trata-se de um temporizador com espera ocupada
;**************************************************************
_1000ms
;999990 cycles
movlw 0x07
movwf T1
movlw 0x2F
movwf T2
movlw 0x03
movwf T3
_1000ms_0
decfsz T1, f
goto $+2
decfsz T2, f
goto $+2
decfsz T3, f
goto _1000ms_0

;6 cycles
goto $+1
goto $+1
goto $+1

;4 cycles (including call)
return
;**************************************************************
;* fim do programa
;**************************************************************
end

Link para o comentário
Compartilhar em outros sites

  • 5 semanas depois...

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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...