• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

belinelectronic

Ajuda pic 16f84..

18 mensagens neste tópico

ola amigos como faço no programa em assembly para receber um byte da porta rs232 (serie) e ligar um led ou motor ???? :P:):P:)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nao queria alguma ajuda para fazelo mas ja encontrei qualquer coisa na net q vai ajudar m imensso mas s tiveres ideias agradeco obrigado.. :P:)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

No teu tópico tens escrito ajuda para o pic 16f84... ,

1) Tens um programador de pics compativel com esse modelo?

2) O mais importante é tirares o datasheet desse modelo disponível no site da microchip.

3) Retirar o programa MPLAB (Salvo erro é assim o nome) também disponível no site da microchip. Ou sempre podes usar outro se estiveres mais habituado.

Depois disto é só leres o datasheet que vem bastante completo.......com as instruções no final que deves utilizar e os registos que deves configurar.

Eu pessoalmente não conheço este modelo porque só trabalhei com o 18F458, mas o que faria seria configurar um timer como contador para receber um sinal externo e colocaria um valor nesse timer(agora a funcionar como contador) no seu limite. Ou seja quando houvesse um impulso numa porta configurada como input, iria ocorrer uma soma no contador activando uma flag. Que indica que o contador atingiu o seu limite.

Despultando depois as acções que desejas.

Eu estou a dizer como talvez o faria, podendo não ser a solução mais correcta....eu talvez ainda tenha alguns ficheiros de exemplo que talvez te possam ajudar se não conseguires avançar.

Abraço.........e boa programação

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estive a ver o datasheet disponivel nas paginas que forneceste......

Basicamente isso não tem muito que se lhe diga, depois de fazeres a montagem.

Tens na saida uma "Salida con onda cuadrada, frecuencia máxima de 2 kHz.", tens de te certificar que a frequencia com que lês a porta de entrada do pic é superior. E que a amplitude da saída está dentro dos limites estabelecidos para ser considerado pelo PIC como valor logico 1.

Na saída do pc tens de fazer uma montagem que te faça a conversão usb para série.......pois o emissor apenas tem uma entrada........

primeiramente aconselhava-te a experimentar isso pondo um gerador de sinais com uma onda quadrada de uma determinada frequencia, depois avançaria para a interface PC/emissor.

http://www.box.net/shared/qqzfot4ebh          faz o download desse pdf pode-te "inspirar"

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se já tiveres todo o hardware pronto e o teu problema for apenas o software diz qualquer coisa, que em relação a isso já tenho alguma experiência. Posso até postar aqui um pequeno programa que fiz exactamente com estre micro que fazia uma coisa parecida ao que tu queres.

Se ainda não tens nada aconselho-te a arranjar um KIT de desenvolvimento ou pelo menos um programador para o PIC, porque ainda é complicado descarregar o programa para o micro (é necessário tensões especiais de programação em determinados pinos).

Se a base do teu projecto são as comunicações série, e se o projecto é complexo (muito código)acosselho-te também a pensar noutro micro desta família, é que este micro tem pouca memória de programa (1024 instruções) e algumas vão ser "consumidas" pelas comunicações.

cumprimentos e bom trabalho!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

belinelectronic, não me leves a mal mas prefiro não utilizar o msn para partilhar estas coisas. O objectivo dos foruns, na minha perspectiva, é partilhar conhecimentos e que estes fiquem disponíveis para os outros membros. Desta forma, quando algum dia algum membro tiver um problema parecido a resposta está disponível e pode usa-la rapidamente sem ter que estar a perguntar outra vês!

Aqui está uma das primeiras esperiências que eu fiz usando a comunicação série no PIC16F84.

Os pinos usados para comunicação são:

RXD - 6 (RB0)

TXD - 7 (RB1)

O cristal era de 4Mhz e a baud rate gerada era 9600bps.

Para além da porta série este pequeno teste também tinha um LCD, os pinos usados para o LCD são os seguintes:

DB4 - 13 (RB7)

DB5 - 12 (RB6)

DB6 - 11 (RB5)

DB7 - 10 (RB4)

RS - 9 (RB3)

E -2 (RA3)


;*********************************************************************
;
;    Filename:	    PIC-serie.asm
;    Date:          05/Mai/2006                                       
;    File Version:  v 0.0.1  (teste)                                  
;                                                                     	
;    Author:        Luís Silva                                        
;                                                                     	
;*********************************************************************


    list      p=16F84             ; list directive to define processor
    #include <p16F84.inc>         ; processor specific variable definitions

    __CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

; '__CONFIG' directive is used to embed configuration data within .asm file.
; The lables following the directive are located in the respective .inc file.
; See respective data sheet for additional information on configuration word.




; *** Definição dos pinos que contolam o LCD ***
; Pinos da PORTA B
#DEFINE	DB4	0x07	; DB4
#DEFINE	DB5	0x06	; DB5
#DEFINE	DB6	0x05	; DB6
#DEFINE	DB7	0x04	; DB7
#DEFINE	RS	0x03	; RS
; Pinos da PORTA A
#DEFINE	E	0x03	; E


; *** Definição dos pinos que controlam a PORTA SÉRIE ***
; Pinos da PORTA B
#DEFINE RXD	0x00
#DEFINE TXD	0x01

#DEFINE	CNT_INIT	0x3F
#DEFINE	CNT_INIT_2	0xAE



;***** VARIABLE DEFINITIONS *****
; Variáveis do LCD
CONTA		EQU		0x0C 
CONTA1		EQU		0x0D
CONTA2		EQU		0x0E
DADO		EQU		0x0F

;Variáveis da PORTA SÉRIE
SBUF		EQU		0x10	; Buffer da Porta Série
CNT_BIT		EQU		0x12	; Contador de bits
AUX			EQU		0x13

SFLG		EQU		0x11	; Registo de Flags da Porta Série
#DEFINE		TIF		0x00	; Flag de Inicio da Transmissão
#DEFINE		RIF		0x01	; Flag de Inicio da Recepção
#DEFINE		RNF		0x02	; Flag de Novo Byte Recebido

; Variáveis para buffer temporário dos reg. do sistema no momento
; em que é executada a rotina de interrupção
w_temp		EQU		0x44		; variable used for context saving 
status_temp	EQU		0x43		; variable used for context saving



;**********************************************************************
;************************* INICIO DO CÓDIGO ***************************
;**********************************************************************
        ORG     0x000             ; processor reset vector
        GOTO    MAIN              ; go to beginning of program



;**********************************************************************
;                          PROGRAMA PRINCIPAL
;**********************************************************************
        ORG     0x060
MAIN:
    CALL	INIT_LCD		; Inicialização do LCD
    CALL	INIT_COM		; Inicialização da Porta Série
    

; *** PROGRAMA 01 ***;
; 1ª parte: teste da recepção - OK!
; 2ª parte: teste da transmissão - OK!
; 3ª parte: teste da escrita no LCD - OK!
LOOP_INFINITO:
    BTFSS	SFLG, RNF
    GOTO	LOOP_INFINITO
    CALL	GET_CHAR
    MOVWF	DADO
    CALL	PUT_CHAR
    MOVF	DADO, W
    CALL	ESCREVE_CARACTER
    GOTO	LOOP_INFINITO
;**********************************************************************
    

;*********************************************
;*        ROTINAS PARA CONTROLO DO LCD       *
;*********************************************
ESPERA_46:
    MOVLW	D'14'
    MOVWF	CONTA
LOOP_46:
    DECFSZ	CONTA, F
    GOTO	LOOP_46
    RETURN


ESPERA_1000:
    MOVLW	D'250'
    MOVWF	CONTA
LOOP_1000:
    NOP
    DECFSZ	CONTA, F
    GOTO	LOOP_1000
    RETURN


ESPERA_N_MS:
    MOVWF	CONTA1
LOOP_N_MS:
    CALL	ESPERA_1000
    DECFSZ	CONTA1, F
    GOTO	LOOP_N_MS
    RETURN

    
ENVIA_NIBBLE:
    BCF		PORTB, DB4	; DB4
    BCF		PORTB, DB5	; DB5
    BCF		PORTB, DB6	; DB6
    BCF		PORTB, DB7	; DB7
    
    BTFSC	DADO, 0x00
    BSF		PORTB, DB4
    BTFSC	DADO, 0x01
    BSF		PORTB, DB5
    BTFSC	DADO, 0x02
    BSF		PORTB, DB6
    BTFSC	DADO, 0x03
    BSF		PORTB, DB7
    BSF		PORTA, E
    NOP
    BCF		PORTA, E
    RETURN


ENVIA_BYTE:
    MOVWF	DADO
    SWAPF	DADO, F
    CALL	ENVIA_NIBBLE
    SWAPF	DADO, F
    CALL	ENVIA_NIBBLE
    RETURN

ESCREVE_COMANDO:
    BCF		PORTB, RS
    CALL	ENVIA_BYTE
    CALL	ESPERA_1000
    CALL	ESPERA_1000
    RETURN

ESCREVE_CARACTER:
    BSF		PORTB, RS
    CALL	ENVIA_BYTE
    CALL	ESPERA_46
    RETURN

INIT_LCD:
    BSF		STATUS, RP0
    BCF		TRISA, E		; Configura pino E da Porta A como SAÍDA
    BCF		TRISB, DB4		; Configuração da Porta B
    BCF		TRISB, DB5
    BCF		TRISB, DB6
    BCF		TRISB, DB7
    BCF		TRISB, RS
    BCF		STATUS, RP0

    BCF		PORTB, RS
    MOVLW	D'15'
    CALL	ESPERA_N_MS
    MOVLW	0X03
    MOVWF	DADO
    CALL	ENVIA_NIBBLE
    MOVLW	D'5'
    CALL	ENVIA_NIBBLE
    CALL	ESPERA_46
    CALL	ESPERA_46
    CALL	ESPERA_46
    CALL	ESPERA_46
    CALL	ENVIA_NIBBLE
    CALL	ESPERA_46
    MOVLW	0X32
    CALL	ESCREVE_COMANDO
    MOVLW	0X28
    CALL	ESCREVE_COMANDO
    MOVLW	0X08
    CALL	ESCREVE_COMANDO
    MOVLW	0X0C
    CALL	ESCREVE_COMANDO
    MOVLW	0X06
    CALL	ESCREVE_COMANDO
    CALL	LIMPA_LCD
    RETURN



ESCREVE_MENSAGEM:
    CLRF	CONTA2
LOOP_MSG:
    MOVF	CONTA2, W
    CALL	MENSAGEM
    CALL	ESCREVE_CARACTER
    
    INCF	CONTA2, F
    MOVLW	D'10'		; Comprimento da Mensagem
    SUBWF	CONTA2, W
    BTFSS	STATUS, Z
    GOTO	LOOP_MSG
    RETURN
    

; Exemplo de escrita de mensagem	
MENSAGEM:
    ADDWF	PCL, F
    RETLW	'O'
    RETLW	'L'
    RETLW	'A'
    RETLW	' '
    RETLW	'M'
    RETLW	'U'
    RETLW	'N'
    RETLW	'D'
    RETLW	'O'
    RETLW	'!'
    RETURN


LIMPA_LCD:
    MOVLW	0x01
    CALL	ESCREVE_COMANDO
    RETURN
;*********************************************


;*********************************************
;     ROTINAS PARA CONTROLO DA PORTA SÉRIE    
;*********************************************
INIT_COM:
    MOVLW	0xB0
    MOVWF	INTCON			; Configuração das Interrupções

    BSF		STATUS, RP0
    MOVLW	0x08
    MOVWF	OPTION_REG		; Configuração do TIMER 0
    BSF		TRISB, RXD
    BCF		TRISB, TXD
    BCF		STATUS, RP0

    MOVLW	CNT_INIT
    MOVWF	TMR0
    BSF		PORTB, TXD
    BSF		PORTB, RXD
    CLRF	SFLG		; Limpa todas as flags da PORTA SÉRIE
    RETURN

PUT_CHAR:
    BTFSC	SFLG, TIF
    GOTO	PUT_CHAR
    MOVWF	SBUF
    MOVLW	0x0A
    MOVWF	CNT_BIT
    BSF		SFLG, TIF
    RETURN

GET_CHAR:
    BTFSS	SFLG, RNF
    GOTO	GET_CHAR
    MOVF	SBUF, W
    BCF		SFLG, RNF
    RETURN
;*********************************************



; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;                        ROTINA DE INTERRUPÇÃO                         
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    ORG     0x004             ; interrupt vector location
INTERRUPT:
    movwf   w_temp            ; save off current W register contents
    movf	STATUS,w          ; move status register into W register
    movwf	status_temp       ; save off contents of STATUS register

    BTFSC	INTCON, T0IF
    GOTO	TIMER_INT
    BTFSS	INTCON, INTF
    GOTO	LABEL_1


; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
EXT_INT:
    BCF		INTCON, INTF	; Apaga a Flag da Int. EXTERNA
    BTFSC	PORTB, RXD		; Verifica se foi um START BIT que provocou a interrupção
    GOTO	LABEL_1

    BCF		INTCON, INTE	; Até ao fim da recepção desactiva esta interrupção
    BSF		SFLG, RIF		; Activa Flag de inicio de Recepção
    MOVLW	0x0A			; Põe contador de bits com o valor 9
    MOVWF	CNT_BIT
    MOVLW	CNT_INIT_2
    MOVWF	TMR0
    GOTO	LABEL_1
        
        
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
TIMER_INT:
    BCF		INTCON, T0IF
    MOVLW	CNT_INIT
    MOVWF	TMR0
    BTFSS	SFLG, RIF
    GOTO	TRANSMIT

; ** RECEPÇÃO **
    MOVF	CNT_BIT, W
    XORLW	0x01
    BTFSC	STATUS, Z
    GOTO	LABEL_4
    BTFSS	PORTB, RXD
    GOTO	RXD_LOW
RXD_HIGH:
    BSF		STATUS, C
    GOTO	RODA
RXD_LOW:
    BCF		STATUS, C
RODA:
    RRF		SBUF, F
        

LABEL_4:
    DECFSZ	CNT_BIT, F
    GOTO	LABEL_1

LABEL_5:
    BCF		SFLG, RIF
    BSF		SFLG, RNF
    BCF		INTCON, INTF
    BSF		INTCON, INTE	; Activa Interrupção Externa
    BTFSS	SFLG, TIF
    GOTO	LABEL_1
    BCF		INTCON, INTF
    MOVLW	CNT_INIT
    MOVWF	TMR0
    MOVLW	0x0A
    MOVWF	CNT_BIT
    GOTO	LABEL_1

; ** TRANSMISSÃO **		
TRANSMIT:
    BTFSS	SFLG, TIF
    GOTO	LABEL_1
    MOVF	CNT_BIT, W
    XORLW	0x0A
    BTFSS	STATUS, Z
    GOTO	LABEL_6
    BCF		PORTB, TXD
    BCF		INTCON, INTE
    GOTO	LABEL_3

LABEL_6:
    MOVF	CNT_BIT, W
    XORLW	0x01
    BTFSS	STATUS, Z
    GOTO	LABEL_2
    BSF		PORTB, TXD
    GOTO	LABEL_3

LABEL_2:
    RRF		SBUF, F
    BTFSS	STATUS, C
    GOTO	TXD_LOW
TXD_HIGH:
    BSF		PORTB, TXD
    GOTO	LABEL_3
TXD_LOW:
    BCF		PORTB, TXD

LABEL_3:
    DECFSZ	CNT_BIT, F
    GOTO	LABEL_1
    BCF		SFLG, TIF
    BCF		INTCON, INTF
    BSF		INTCON, INTE
        
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

LABEL_1:
    movf    status_temp,w     ; retrieve copy of STATUS register
    movwf	STATUS            ; restore pre-isr STATUS register contents
    swapf   w_temp,f
    swapf   w_temp,w          ; restore pre-isr W register contents
    RETFIE                    ; return from interrupt

;**********************************************************************


    END                     ; directive 'end of program'

Penso que não há mais nada a dizer.

cumps.

Bom trabalho!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

belinelectronic, não me leves a mal mas prefiro não utilizar o msn para partilhar estas coisas. O objectivo dos foruns, na minha perspectiva, é partilhar conhecimentos e que estes fiquem disponíveis para os outros membros. Desta forma, quando algum dia algum membro tiver um problema parecido a resposta está disponível e pode usa-la rapidamente sem ter que estar a perguntar outra vês!

Ora nem mais! :)
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ola amigos como faço no programa em assembly para receber um byte da porta rs232 (serie) e ligar um led ou motor ????

Pelo que tu referiste......as tuas necessidades são de receber um sinal e actuar qualquer coisa (led,motor). Não necessitando de pinos de comunicação. Até porque o receptor que tu estás a pensar usar é half-duplex. Sem existir turn-around, ou seja a comunicação apenas se processa do emissor para o receptor o que simplifica bastante a programação que tem de ser feita. Não existindo assim nenhum controlo de estado de como o receptor se comporta ou se recebeu. (Não existe feedback por parte do receptor)

Baseia-te no exemplo que o pixel disponibilizou que te vai ajudar bastante.....se precisares de mais algo relacionado com este penso que "projecto", posta aqui......que concerteza iras obter resposta...

Cumprimentos e bom trabalho

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ola amigos eu ja consigo ligar um led e outras coisas atraves do pc e o pic, mas queria agora que o pic recebe-se o byte do pc guardava no registo e enviar o mesmo byte para o emissor e do emissor para o receptor onde vai estar outro pic para receber o byte para fazer a comparaçao e ligar o led, é onde eu estou a ter dificuldades é nesta parte a sem fios com estes modulos. A ideia vai ser controlar um carrinho atraves do pc. Tambem ja vi uns modulos melhores os da XBEE so que sao mais caros. :D:):P :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok. Então a dúvida é mesmo como é que o PIC "fala" com os módulos emissor e receptor não como é feito o programa em assembly?!

Só tenho uma dúvida em relação à tua ideia:

Porquê é que o PC envia para um PIC que guarda e volta a enviar? Porquê é que o PC não envia directamente para o módulo emissor?

(é que isto assim tornasse complicado tens que gerir com o PIC emissor tanto as comunicações com o PC como as comunicações com o receptor, ou então eu não estou a perceber muito bem a ideia).

Vou dar uma olhadela aos datasheets os módulos emissor e receptor e depois digo qualquer coisa.

cumps.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Amigo pixel tambem tenho algumas duvidas com o programa eu é que encontrei um programa tipo  o teu e experementei e funcionou, a tua ideia de enviar do pc para o emissor tambem parece boa vou experementar, eu estava com duvidas em usar dois pics por causa da velocidade do receptor que é 2khz e o emissor é entre 3 e 4khz, e nao esquecer que quando tenho 1 no emissor vou ter 0 no receptor, mas usando uma ttl not ja resolvo o problema.obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se postares aqui os esquemas da montagem que estás a fazer ou o código que estas a escrever decerteza que te podemos ser mais úteis aqui......

:D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ola amigos vejam estes modulos de transmissao radio frequencia acho que sao melhores do que os meus da cebek nao sao?? da pra envio e recever mas eu so quero enviar???

link--http://cgi.ebay.com/2-pcs-Wireless-RF-Transceiver-915MHz-FSK-Data-Transfer_W0QQitemZ230319641901QQcmdZViewItemQQptZBI_Electronic_Components?hash=item230319641901&_trksid=p3286.c0.m14&_trkparms=72%3A1205|66%3A2|65%3A12|39%3A1|240%3A1318|301%3A1|293%3A1|294%3A50

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ola amigo quero pedir desculpa, mas tive este tempo todo a trabalhar no meu projecto, final do curso, o qual o consegui fazer com sucesso e como eu queria, já que tive muito trabalho para o fazer. Tive então  nota máxima neste trabalho, ja o apresentei. Queria agradecer muito aqueles que me tentaram ajudar e ajudaram quando precisei obrigado.  :biggrin: :cheesygrin: :confused::):P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes colocar aqui o teu trabalho, para que futuros utilizadores com problemas semelhantes possam obter o que procuram.

Abraço e "parabéns"

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora