Ir ao conteúdo

Posts recomendados

Postado

Olá amigos

estive tentando estabelecer uma comunicaçao serial entre dois pics 16f com linguagem assembly.

consegui enviar um byte, recebê-lo do outro lado e tratar a informação

porém agora preciso efetuar uma comunicaçao que envie 4 bytes e armazene-os em variaveis diferentes.

o problema é que não tenho a menor ideia de como identificar os bytes na recepçao do sinal, ou seja, qual o byte a, byte b, byte c, etc

 

A informaçao é enviada mais ou menos a cada 2 segundos

 

se alguem puder compartilhar alguma sugestão de como fazê-lo, ficaria muito agradecido

  • Membro VIP
Postado

hás de elaborar um protocolo qualquer. p.ex. um start byte 0x55 e um stop byte 0xaa. Aguarde o start 0x55. os próximos serão seus dados qualquer quantidade de bytes. Vá colocando no buffer até chegar o stop 0xaa. É... mas se o dado for 0x55 ou 0xaa?? É.. a vida é dura.

  • Curtir 1
  • Membro VIP
Postado

@Isadora Ferraz

Mesmo que seja o mesmo valor do start, não importa se quando o Start verdadeiro iniciar um contador que indexará os próximos 4 bytes.

Não sei se o PIC em questão faz a comunicação serial em 9 bits. Caso positivo basta setar o nono bit indicando que é start e os outros 8 bits, 0 a 7, já podem conter o valor do primeiro byte.

  • Curtir 2
Postado

os códigos:

**transmissor************

INICIO
   BANK0
      CLRF PORTA
      CLRF PORTB
      CLRF PORTC
      CLRF PORTD
      CLRF RCSTA
      BSF RCSTA,7
   BANK1
      MOVLW  B'111111'
      MOVWF  TRISA
      MOVLW  B'00000000'
      MOVWF  TRISB
      MOVLW  B'00000000'
      MOVWF  TRISC
      MOVLW  B'11111111'
      MOVWF  TRISD
      MOVLW  B'111'
      MOVLW  B'10000100'
      MOVWF  OPTION_REG
      MOVLW  B'00000000'
      MOVWF  INTCON
      MOVLW  .25
      MOVWF  SPBRG       ;BAUD RATE
      MOVLW  B'00100100'
      MOVWF  TXSTA     
      MOVLW  B'01000000'
      MOVWF  ADCON1  
   BANK0
      MOVLW  B'00000111'
      MOVWF  CMCON
      MOVLW  B'11000001'
      MOVWF  ADCON0


 ;ROTINA PRINCIPAL
START

TRANSMISSAO
BANK1
BCF TXSTA, TRMT
BANK0
MOVLW B'10101010'
MOVWF TXREG
GOTO START

***receptor***************

CLRF PORTA
MOVLW D'7' 
MOVWF CMCON ;
BSF STATUS,RP0 
CLRF TRISA 
BSF TRISB,4 
BCF OPTION_REG,7

;—Configure peripheral interrupts
MOVLW B'00100000' ;Disable all peripheral interrupts except receiver
MOVWF PIE1 ;Peripheral interrupt enable/disable

;—Configure general interrupts
MOVLW B'01000000' ;Disable all interrupts except peripheral
MOVWF INTCON ;Interrupt control register

;—Configure SPBRG for desired baud rate
MOVLW D'25' ;We will use 9600
MOVWF SPBRG ;baud at 4MHz

;—Configure TXSTA
MOVLW B'00100100' ;Configure TXSTA as :
MOVWF TXSTA ;

;8 bit transmission – 6.bit
;Transmit enabled – 5.bit
;Asynchronous mode – 4.bit
;Enable high speed baud rate – 2.bit

BCF STATUS,RP0 ;Switch to BANK0
MOVLW B'10000000' ;Enable serial port
MOVWF RCSTA ;Receive status reg
CLRF TMP_TX
BSF INTCON,7 ;Enable all unmasked interrupts
BSF RCSTA,4 ;Enable USART receive

MAIN_LOOP: ;Continous loop
BTFSC PORTB,4 ;Check if the button is pressed
GOTO MAIN_LOOP ;If not goto continous loop
MOVF TMP_TX,W ;Load TMP_TX
MOVWF TXREG ;to TXREG

;We load TMP_TX on the interrupt routine,
;when an information received from RX.
GOTO MAIN_LOOP ;Continous loop

interrupt:
BCF INTCON,7 ;Disable all interrupts
BTFSS PIR1,5 ;Check if the RCIF flag is set
GOTO quit_int ;If not return back to the main loop
MOVF RCREG,W ;Move the received byte to W
MOVWF PORTA ;Move W to PORTA
MOVWF TMP_TX
BCF PIR1,5
quit_int:
RETFIE

  • Membro VIP
Postado

Outra forma seria caso o PIC tiver um recurso que todo AVR com USART possui, que é o modo MPCM (Multi-processor Communication Mode).

Nesse modo, o receptor só entra numa rotina de interrupção da serial se o bit 9 estiver setado. Caso positivo e os 8 bits restantes conter o número do dispositivo a receber os dados então ele pega os próximos dados. Caso contrário, retorna da interrupção e aguarda a próxima.
 

  • Curtir 1
Postado

Mais uma vez agradeço aos companheiros do forum por me ajudar a solucionar mais uma

consegui implementar um protocolo que receba os bytes a partir do envio de um bit9 setado, e a partir deste os bytes sao indexados

O topico esta resolvido

Espero poder ajudá-los em uma proxima oportunidade

 

Código do receptor para quem queira saber:

 

ORG 0X04 
GOTO interrupt

(...)

 

interrupt:
BTFSC  TXSTA,TX9D   ;testa se tem o 9°bit setado
GOTO RECEBER          ;se tem pressegue
RETFIE                          ;se não tem retorna

RECEBER
MOVF RCREG,W           ;armazena o byte
MOVWF V_1
CLRF  RCREG
BCF   PIR1,5                  
BTFSS PIR1,5                 ;aguarda novo byte
GOTO  $-1
MOVF  RCREG,W           ;armazena o segundo byte
MOVWF V_2
BCF PIR1,5                     ;repete se necessario para mais informação
RETFIE                           ;retorna

Visitante
Este tópico está impedido de receber 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...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!