Microcontroladores - trasmision serie por pic

 
Vista:

trasmision serie por pic

Publicado por Alcon_99 (1 intervención) el 25/10/2006 16:41:22
Hola que tal me gustaria saber si alguien tiene un programa para comunicarse via serie echo en assembler para el pic16f877 que ande, porque yo ya intente con todo y no me anda nada, no se que estoy haciendo mal, por eso me gustaria si alguien tiene algo que me lo pueda suministrar para poder compararlo con lo mio.
Gracias

Esto es lo que hice yo:

;**********************************************************************
; PROGRAMA : portseriemat.asm
; Funcion : Transmite un 1 (en ASCII) por el puerto serie del pic.
; Serial port config: 9600 baudios,8 bits,paridad = none
;
; Fecha : 23/10/2006 Programa para : PIC16F877
; CPU Clock : 10 MHz Reloj instruccion : 2.5 MHz = 0.4 us
; WDT : Deshabilitado Tipo de reloj : HS
; Code Prot : OFF PWRTE : ON
;**********************************************************************
list p=16f877 ;list directive to define processor

#include <p16f877.inc> ;processor specific definitions

errorlevel -302 ;suppress "not in bank 0" message

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC


;**********************************************************************
; Declaración de variables que voy a utilizar
; en el programa
;**********************************************************************

CONT EQU H'23'
CONT1 EQU H'24'
CONT2 EQU H'25'
RB0 EQU H'00'
RB1 EQU H'01'

Banco0 MACRO ;macro to select data RAM bank 0
bcf STATUS,RP0
bcf STATUS,RP1
ENDM

Banco1 MACRO ;macro to select data RAM bank 1
bsf STATUS,RP0
bcf STATUS,RP1
ENDM

Banco2 MACRO ;macro to select data RAM bank 2
bcf STATUS,RP0
bsf STATUS,RP1
ENDM

Banco3 MACRO ;macro to select data RAM bank 3
bsf STATUS,RP0
bsf STATUS,RP1
ENDM

org 00h
nop
goto configurar

org 06h
configurar
bcf INTCON,GIE ;Deshabilito las interrupciones
clrf STATUS ;Borra todo el registro estado
Banco1
movlw B'11111101' ;todos los bit como entrada salvo RB1
movwf TRISB ;se lo cargo al TRIS
Banco0
clrf PORTB ;Pone en cero el registro PORTB
goto main ;voy al comienzo del programa

;***********************************************************
; Empieza el Programa
;***********************************************************
main
btfss PORTB,RB0
goto main
call retardo
bsf PORTB,RB1 ;prende un led avisando de que esta preparado para trasmitir;
call conf_serie
bcf PORTB,RB1 ;Apaga el led
call retardo
repeat
bsf PORTB,RB1 ;prendo el led
call retardo
call trasmitir
bcf PORTB,RB1 ;Apaga el led
call retardo
goto repeat

;***********************************************************
; Configuro la Transmición Asincronica
;***********************************************************
conf_serie
Banco1
movlw B'11111111' ;todos los bit como entrada salvo RC6(TX)
movwf TRISC ;se lo cargo al TRISC

movlw D'64'
movwf SPBRG ;cargo el literal en el este reg y sel un baudrate de 9600 con error de 0.16%

movlw B'00100100'
movwf TXSTA ;TX en On, modo asíncrono con 8 bits y alta velocidad

Banco0
movlw H'90' ;enable serial port and reception
movwf RCSTA ;bsf RCSTA,SPEN ;Habilito transmición
return

;***********************************************************
; Esta subrutina lo que hace es trasmitir los datos
;***********************************************************

trasmitir
Banco1
tras
btfss TXSTA,TRMT ;esto me dice si el TSR esta vacio
goto tras

Banco0
esperar
btfss PIR1,TXIF ; esto me dice si esta vacio el TXREG
goto esperar

movlw B'10101010'
movwf TXREG
return

;***********************************************************
; Esta subrutina lo que hace es esperar 5 seg
;**********************************************************
retardo
Banco0
movlw B'00000001'
movwf CONT1
movlw B'01000001'
movwf CONT
movlw B'00000001'
movwf CONT2

retardopro
incfsz CONT2,1
goto retardopro
decfsz CONT1,1
goto retardopro
decfsz CONT,1
goto retardopro
return
;<<<--------------------- fin --------------------->>>

end
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:trasmision serie por pic

Publicado por AFICIONADO (3 intervenciones) el 30/10/2006 23:35:23
Repasa esta linea de codigo.
movlw B'11111111' ;todos los bit como entrada salvo RC6(TX)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:trasmision serie por pic

Publicado por Daniel (2 intervenciones) el 24/12/2006 05:47:26
LIST P=16F874A
#INCLUDE "P16F874A.inc"
ERRORLEVEL 0,-302
CBLOCK 0X20
DATO
ENDC

ORG 0x00
GOTO INICIO
ORG 0X30

INICIO:
CLRW ;LIMPIAR W
MOVWF DATO ;LIMPIO LA VARIABLE DATO

BCF STATUS,RP0 ;SELECCIONO EL BANCO 0
BSF RCSTA,SPEN ;PONE BIT SPEND =1 (HABILITA PUERTO SERIE)
BSF RCSTA,CREN ;HABILITA LA RECEPCION
BSF STATUS,RP0 ;SELECCIONO EL BANCO 1

MOVLW 0X19 ;VALOR PARA 9600 BAUDIOS
MOVWF SPBRG ;CONFIGURA A 9600 BAUDIOS
MOVLW 0XA4 ;CSRC/TXEN (RELOJ INTERNO, 8 BITS MODO ASINCRONO, ALTA VELOCIDAD)
MOVWF TXSTA ;ESCRIBE EL CONTROL DE REGISTRO DE TRANSMISIÓN

BCF STATUS,RP0 ;SELECIONO EL BANCO 0
MOVLW 0X44 ;VALOR PARA LA ACTIVACIÓN
MOVWF DATO ;GUARDO EL VALOR DE LA ACTIVACIÓN EN DATO
CLRF PORTB ;INICIALIZO PUERTO C A 0
BSF STATUS,RP0 ;SELECCIONO EL BANCO 1
MOVLW 0X00 ;VALOR USADO PARA INICIALIZAR LA DIRECCIÓN DE LOS DATOS
MOVWF TRISB ;CONFIGURO TODO EL PUERTO COMO SALIDA

BSF STATUS,RP0 ;SELECCIONO EL BANCO 1
CICLO: CALL RECIBE ;RECIBE UN CARACTER DEL PUERTO SERIE
SUBWF DATO,W ;COMPARA EL CODIGO RECIBIDO
BTFSS STATUS,Z ;CHECA SI ES CORRECTO
GOTO CICLO ;NO ES CORRECTO, VOLVER A CHECAR EL PUERTO SERIE
CALL CHECA ;SI ES CORRECTO, VERIFICA ESTADO DEL PUERTO C
GOTO CICLO

RECIBE: BCF STATUS,RP0 ;SELECCIONA EL BANCO 0
RECIB1: BTFSS PIR1,RCIF ;CHECA EL BUFFER DE RECPCION
GOTO RECIB1 ;SI NO HAY DATO, ESPERA
MOVF RCREG,W ;SI HAY DATO, LEERLO
BCF PIR1,RCIF ;LIMPIA LA BANDERA DE INTERRUPCIÓN
RETURN

CHECA: BTFSS PORTB,1 ;VERIFICA SI EL PUERTO C ESTA ACTIVO
GOTO ACTIV ;DE NO ESTARLO, LO ACTIVA
BCF PORTB,1 ;SI LO ESTA, DESACTIVARLO
RETURN ;REGRESO A CICLO

ACTIV: BCF STATUS,RP0 ;SELECCIONO EL BANCO 0
BSF PORTB,1 ;ACTIVO EL BIT 0 DEL PUERTO C
GOTO CICLO

END

Este codigo lo utilice para comunicar el pic con la PC, la Pc mandaba un dato "A" en hhexa y el PIC monitoreaba la recepcion en el puerto serie, si el dato llegaba encendia el bit 1 del puerto c, si no era el dato correcto, no hacia nada, funciona a la perfeccion, espero te guien los comentarios.

conectado con un oscilador de 4Mhz, configurado 9600 baudios, paridad no, con datos de 8 bits modo asincrono.

Solo congigura el bit 5 del txsta del pic para habilitar el transmisor, es decir, cambialo de receptor a transmisor y lo que ocupes que haga.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:trasmision serie por pic

Publicado por felipe martinez (1 intervención) el 24/04/2008 08:47:18
hola

oye necesito transmitir desde el puerto serial al pic y del pic a una pantalla lcd hasta ahora he hecho hasta aqui (codigo adjunto) pero no se como hacerlo llegar al display.

; felipe martinez

LIST P= 16F877
#INCLUDE P16F877.INC

DELAY1 EQU 20H
DELAY2 EQU 21H
DELAY3 EQU 22H
DATO EQU 23H
DATO2 EQU 24H

ORG 00H
GOTO INICIO

RETARDO MOVLW 04H
MOVWF DELAY1
RETA1 MOVLW 0FFH
MOVWF DELAY2
RETA2 MOVLW 0FFH
MOVWF DELAY3
RETA3 DECFSZ DELAY3,F
GOTO RETA3
DECFSZ DELAY2,F
GOTO RETA2
DECFSZ DELAY1,F
GOTO RETA1
RETURN

TX_PC MOVWF TXREG
WAIT_TX BTFSS PIR1,TXIF
GOTO WAIT_TX
CLRF PIR1
RETURN

RX_PC BTFSS PIR1,RCIF
GOTO RX_PC
MOVF RCREG,W
MOVWF DATO
CLRF PIR1
RETURN

CONVER BSF ADCON0,02H
WAIT BTFSC ADCON0,02H
GOTO WAIT
RETURN

;**********************INICIO_LCD********************************

INICIO_LCD ;PROPIEDADES DE LA PANTALLA LCD
CLRF PORTB
CLRF PORTD
;ACTIVAR PANTALLA
MOVLW B'00001110' ;SE PONE EN
MOVWF PORTB ;BINARIO
BSF PORTD,06H ;PORQUE
CALL RETARDO ;ES MÁS FÁCIL
BCF PORTD,06H ;Y PRACTICO
;FUNCION PANTALLA ;PROGRAMAR
MOVLW B'00110100' ;EL LCD.
MOVWF PORTB
BSF PORTD,06H
CALL RETARDO
BCF PORTD,06H
;MODO DE INGRESO
MOVLW B'00000110'
MOVWF PORTB
BSF PORTD,06H
CALL RETARDO
BCF PORTD,06H
;DESPLAZAMIENTO DEL CURSOR
MOVLW B'00010000'
MOVWF PORTB
BSF PORTD,06H
CALL RETARDO
BCF PORTD,06H
;BORRAR PANTALLA (CURSOR A HOME)
MOVLW B'00000001'
MOVWF PORTB
BSF PORTD,06H
CALL RETARDO
BCF PORTD,06H
;FINAL
RETURN

INICIO BSF STATUS,05H
MOVLW 01H
MOVWF TRISA
CLRF TRISB
MOVLW 80H
MOVWF TRISC
CLRF TRISD
CLRF TRISE
MOVLW 0EH
MOVWF ADCON1
MOVLW 24H
MOVWF TXSTA
MOVLW 19H
MOVWF SPBRG
BCF STATUS,05H
MOVLW 90H
MOVWF RCSTA
CALL RETARDO

CICLO1 CALL RX_PC
MOVLW 0AAH
XORWF DATO,W
BTFSS STATUS,Z
GOTO CICLO1
CALL CONVER
MOVF ADRESH,W
CALL TX_PC
BSF STATUS,05H
MOVF ADRESL,W
BCF STATUS,05H
CALL TX_PC
GOTO CICLO1

gracias por tu colaboracion de antemano
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar