TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Peliparado en 06 de Abril de 2005, 14:40:00
-
Buenas, tengo mi circuito armado para transmitir datos a traves del puerto serial (rs232) con MAX232, uso el PIC16F877A. Mi problema es que cuando mando un dato al computador, éste se repite infinitamente (en el hyperterminal), yo solo quiero que se muestre una vez y pare.
El codigo es muy simple:
LIST P=16F877A
INCLUDE <P16F877A.INC>
CONT EQU 20
DATO EQU 21
TRUCO EQU 22
DATO_A EQU 23
DATO_B EQU 24
ORG 0x00
GOTO INICIO
ENVIAR CALL E5MS
BANKSEL SPBRG
MOVLW .25
MOVWF SPBRG
BSF TXSTA,BRGH
BANKSEL RCSTA
BCF RCSTA,SYNC
BSF RCSTA,SPEN
BANKSEL TXSTA
BCF TXSTA,TX9
BSF TXSTA,TXEN
BANKSEL TXREG
MOVF DATO,0
MOVWF TXREG
REP BTFSS PIR1,TXIF
GOTO REP
BCF PIR1,TXIF
RETURN
MENSAJE ADDWF PCL,1
RETLW "J"
RETLW "u"
RETLW "l"
RETLW "i"
RETLW "a"
RETLW "n"
RETLW " "
RETLW "A"
RETLW "n"
RETLW "d"
RETLW "r"
RETLW "e"
RETLW "s"
RETLW " "
INICIO BSF STATUS,5
CLRF TRISC
BCF STATUS,5
CLRF CONT
CLRF DATO
MOVLW .14
MOVWF TRUCO
GOTO LEER
LEER MOVF CONT,0
CALL MENSAJE
MOVWF DATO
MOVF CONT,0
SUBWF TRUCO,0
BTFSC STATUS,2
GOTO FIN
CALL ENVIAR
INCF CONT,1
GOTO LEER
;E5MS genera una temporizacion de 5mS
E5MS MOVLW 0x1a
MOVWF DATO_B
CLRF DATO_A
DELAY_1 DECFSZ DATO_A,1
GOTO DELAY_1
DECFSZ DATO_B,1
GOTO DELAY_1
RETURN
FIN NOP
END
En este caso me muestra "julian andres" mil veces, sabiendo que solo quiero que me la muestre una sola vez. Alguien puede ayudarme ?, que me falta o que estoy haciendo mal ?
Gracias
-
La unica diferencia es que especifique donde es tu programa principal y que la rutina solo lo realice solo una vez.
El error esta en GOTO LEER como siempre se encuentre en ese ciclo siempre lee el mensaje y lo manda por le puerto serial y lo vez en la hiperterminal quita esa instruccion y evitaras tantos problemas....
LIST P=16F877A
INCLUDE <P16F877A.INC>
CONT EQU 20
DATO EQU 21
TRUCO EQU 22
DATO_A EQU 23
DATO_B EQU 24
ORG 0x00
GOTO INICIO
ENVIAR CALL E5MS
BANKSEL SPBRG
MOVLW .25
MOVWF SPBRG
BSF TXSTA,BRGH
BANKSEL RCSTA
BCF RCSTA,SYNC
BSF RCSTA,SPEN
BANKSEL TXSTA
BCF TXSTA,TX9
BSF TXSTA,TXEN
BANKSEL TXREG
MOVF DATO,0
MOVWF TXREG
REP BTFSS PIR1,TXIF
GOTO REP
BCF PIR1,TXIF
RETURN
MENSAJE ADDWF PCL,1
RETLW "J"
RETLW "u"
RETLW "l"
RETLW "i"
RETLW "a"
RETLW "n"
RETLW " "
RETLW "A"
RETLW "n"
RETLW "d"
RETLW "r"
RETLW "e"
RETLW "s"
RETLW " "
INICIO BSF STATUS,5
CLRF TRISC
BCF STATUS,5
CLRF CONT
CLRF DATO
MOVLW .14
MOVWF TRUCO
GOTO LEER
LEER MOVF CONT,0
CALL MENSAJE
MOVWF DATO
MOVF CONT,0
SUBWF TRUCO,0
BTFSC STATUS,2
GOTO FIN
CALL ENVIAR
INCF CONT,1
; GOTO LEER ;Quitar este ciclo para dejar de enviar
;E5MS genera una temporizacion de 5mS
E5MS MOVLW 0x1a
MOVWF DATO_B
CLRF DATO_A
DELAY_1 DECFSZ DATO_A,1
GOTO DELAY_1
DECFSZ DATO_B,1
GOTO DELAY_1
RETURN
FIN NOP
END
-
No, espera, ese GOTO LEER es para que continue mostrando los caracteres, desde la J hasta la s, mira tambien que tengo un GOTO FIN, cuando termine de imprimir los caracteres debe entrar a GOTO FIN e irse a dormir o a no se que ...
En el PICSIMULATOR tambien me repite los datos ....
-
A mi me parece que esta bien, creo que el problema esta en
fin
nop ; aqui debes de poner sleep , y grabar el pic con perro guardian oof
end
saludos
-
Efectivamente el fallo esta en la etiqueta "FIN" que solo realizas un NOP. de esta forma, el micro seguirá ejecutando las instrucciones que hay depués de esta en la memoria de programa que son todas "ANDLW 0xff" y de que llega a la última dirección te salta al principio, al vector de reset.
Pon esto:
FIN GOTO FIN y listo el micro entra en bucle infinito.
-
muchas gracias !!!!