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