Ir ao conteúdo
  • Cadastre-se

Comunicação Serial Assembler na mão


Posts recomendados

Ola 

 

Amigos

 

Fostaria de fazer uma comunicação serial Pic + Pic na mão utilizando I/O + interrupção .... estou um pouco sem norte mais vamo lá..

 

Preciso de dois pinos I/O (Rx/Tx)

Preciso da interrupção timer1 para o Baud Rate

preciso de uma interrupção para iniciat a transmissão (no codigo do transmissor)

e no receptor preceso de uma interrupção para quando receber um bit

 

é isso? precisa de mais alguma coisa?

 

Obrgado 

 

Att

Robson Teles

 

Link para o comentário
Compartilhar em outros sites

Perai, antes me esclareça, quando você diz na mão é fazer uma software UART? Ou usando hardware para comunicação serial que já existe no PIC e quais os registradores?

Vale lembrar que programas: UART, I2C, SPI e etc consomem e muita CPU do processador, para tratar todos os eventos de comunicação.

Mas vamos lá esclareça isso, que ja podemos começar a te nortear. 

Abs

Link para o comentário
Compartilhar em outros sites

O Felipe ja disse e perguntou o que você quer.

 

Explicando novamente, ja existe o registrador UART para serial (2 buffer físicos se não me engano) para fazer bit paridade. O que você quer é fazer por qualquer outro pino fazendo o UART por software (programação em ASM), é isso né?

Link para o comentário
Compartilhar em outros sites

@rafael.luc

 

Isso mesmo, sem usar nada do hardware do PIC gostaria de fazer a comunicação tudo por software, apenas curiosidade amigo, gosto de entender no bit, é possivel me ajudar?

 

e gostaria de fazer em assembler para depois contar os ciclos de maquinas e ver quanto tempo demora realmente :D

 

Obrigado..

 

Att,

Robson Teles

Link para o comentário
Compartilhar em outros sites

@Robson Lopes, tudo bem?

Bit banging é legal e chato ao mesmo tempo, fiz esse pequeno transceiver UART bem rudimentar numa meia hora que fiquei ocioso no trabalho, acho que da pra você ter uma ideia de como sair manipulando os bits, repare no entanto que o codigo é generico e precisa ser entendido e adaptado aos poucos para seu chip, além disso as rotinas de delay qye vão dar o baudRate tambem nao foram implementadas (uartDelay e HalfDelay) vou deixar isso a seu criterio como estudo extra.

No mais, se tiver duvidas pergunta ai que a gente responde, agora o codigo:
 

;;Transceiver UART rudimentar para PIC16;Autor: FSN;;cblock 0x20 	;declara algumas variaveistxCharrxChartmpreceivedCharbitCountintconTempstatusTempendc;;; UartTx - Envia um caractere pela Uart em bitbanging; O caractere é passado em w, o TX fica em RB0 para melhorar a performance;;UartTx:			movf  INTCON, w		;faz um push em intcon		movwf intconTemp	;		bcf	  INTCON, GIE	;		movf  STATUS, w		;faz um push em status		movwf statusTemp	;								clrf  tmp			;		movwf txChar		;passa para o buffer de transmissao		movlw bitCount, .8	;numero de bits a transmitir				bcf   STATUS, C		;derruba o carry				bcf	  PORTB,0		;gera o startbitTxLoop:		call  uartDelay		;aguarda o tempo de 1 bit		rrf   txChar,f		;rotaciona o bit de transmissao corrente pelo carry		movf  PORTB,w		;		movwf tmp			;		movlw 0xFE			;		andwf tmp,f			;faz reset virtual do pino de TX		movf  STATUS,w		;toma o carry, nele contem o bit a ser transmitido		andlw 0x01			;		iorwf tmp, w		;		movwf PORTB			;Finalmente transfere o novo bit ao pino de TX		TxLoop_a:		decfsz bitCount,f	;repete ate transmitir todos os bits		goto  TxLoop		;		bsf	  PORTB,0		;stop bit		call  uartDelay		;				movf  statusTemp,w	;restaura o estado dos registtrps		movwf STATUS		;		movf  intconTemp,w	;		movwf INTCON		;restaura interrupts		return		;;; UartRx - Retira um caractere vindo do bitbanging; O caractere retorna em w;;UartRx:		movf STATUS,w		;		movwf statusTemp	;salva resgitrador de status				btfss receivedChar,7;checa se tem caractere no buffer		goto  NoChar		;				bcf	  receivedChar,7;indica que nao tem mais caractere a recberNoChar:				movf statusTemp,w	;		movwf STATUS		;restaura contexto aritmetico		movf  rxChar, w		;toma o caractere				return		;;ReceiveISR: rotina para tomada de caracterese pela UART;;ReceiveISR:					movf  STATUS, w		;faz um push em intcon		movwf statusTemp	;								;O primeiro bit é sempre o start		movlw .8			;		movwf bitCount		;quantidade de bits a receber:		clrf  rxChar		;		call  halfDelay		;aguarta um tempo igual a metade do bit 		bcf   STATUS,C		;		ReceiveLoop:		call  uartDelay		;aguarda o tempo de bit:		rlf   PORTB,w		;toma estado do bit recebido		movwf tmp			;		rlf   tmp			;desloca mais uma posicao para ficar no bit3		swapf tmp,f			;troca os nibbles e desloca para o bit7 MSB		movlw 0x80			;		andwf tmp,w			;mascara o que nao interessa		iorwf rxChar,f		;finalmente insere no buffer		rrf	  rxChar,f		;roda a direira, LSBs First		decfsz bitCount,f		goto ReceiveLoop	;repete ate receber todos os bits		bsf	 receivedChar,7 ;sinaliza que tem caractere no buffer				movf statusTemp,w	;		movwf STATUS		;restaura contexto		retfie			    ;encerra rotina de recepcao.									
Link para o comentário
Compartilhar em outros sites

 

 

Muitas vezes tenho que usar rotinas RS232,I2C etc por software pois a maioria dos PICs comuns tem a mania de ter pinos dedicados a estes hardwares no meio de um port

Boa observação @vtrx, porém tem um ponto que pode ser pesado, o que vale mais, perder alguns ciclos e fazer alguns bitwises para leituras quebradas em ports diferentes, ou gastar a CPU inteira apenas para ter a comodidade de posicionais os IOs da forma que bem entender?

Eu vejo o uso de interfaces dessas por microcontroladores pequenos, que são muitas vezes usados como hardware periferico inteligente e precisam falar com algum master.

 

Abs.

Link para o comentário
Compartilhar em outros sites

 

Boa observação @vtrx, porém tem um ponto que pode ser pesado, o que vale mais, perder alguns ciclos e fazer alguns bitwises para leituras quebradas em ports diferentes, ou gastar a CPU inteira apenas para ter a comodidade de posicionais os IOs da forma que bem entender?

Vai depender da aplicação.

Algumas aplicações fazem o uso da serial ou I2c apenas para inicializar variáveis,e usam um PORT e real time.

Temos também o uso das rotinas por software ,por exemplo, em micros que não tem estes periféricos,como alguns DSP que por algum motivo vão se comunicar com um protocolo destes.

Link para o comentário
Compartilhar em outros sites

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