No funciona placa de desarrollo, PIC16F877A

Hola a todos,

me veo obligado a preguntar por algo básico...

He estoy haciendo una placa de desarrollo con un PIC 16F877A. Ya sé que debí haber comprado una hecha, pero esta ya la terminé y no la voy a botar por tener un solo y seguramente simple error.

No funciona. La parte del botón Reset está bien hecha (5V sin presionar y 0V aprox. al presionar). Un oscilador XT de 16Mhz. El PIC recibe correctamente el voltaje en sus entradas de voltaje. Un programa de prueba (que prende y apaga todas las salidas configuradas como IO) se graba perfectamente y la verificación también funciona (lo programo por ICSP). En una simulación en Proteus todo funciona perfectamente.

Pero no hace nada.

Cómo puedo probar si el cristal funciona? (aunque el cristal y condensadores están nuevos) y según yo, bien conectados, según tradición.
¿La entrada del Reset (pin 1) hay que configurarla para que funcione como tal? (yo veo que no).

No sé qué más podría ser...

El PIC se entibia levemente en su parte superior al tenerlo conectado por mucho tiempo (5 min). El PIC está nuevo, y todavía lo puedo reprogramar muy bien.

Alguna otra idea?
Gracias!!!
 
Cómo puedo probar si el cristal funciona? (aunque el cristal y condensadores están nuevos) y según yo, bien conectados, según tradición.
Medí con el tester en uno de los extremos del cristal (el que va a OSC2), si está oscilando vas a tener aprox. la mitad de la tensión. Si no, 0 o 5V.
 
Muy estimado!!

Cierto, me alegra saber que ése es el problema. El voltaje me marca muy cercano a cero (en ningún caso la mitad). Muy bien, cambiaré el cristal (ya que son baratos, y los condensadores son nuevos y ya los había cambiado una vez). Además, no tengo ningún cortocircuito (según mediciones de continuidad).

Habrá que tener alguna precaución al soldar un cristal? Por ejemplo, para que no se sobrecaliente como en el caso de los transistores?

Lo pregunto, para saberlo y para no romper otro más.

Muchas gracias! Al fin sé cómo medir si un cristal funciona.

Saludos!
 
Si bien el problema puede ser el cristal, pienso que debe ser que la configuración del oscilador no se corresponde con el tipo de cristal --> Fijate en el datasheet (configuración del oscilador) si lo programado se corresponde con el cristal usado.


Ah! Ojo con eso de medir con el tester sobre el cristal. Ahí lo podés hacer porque OSC2 es una salida de baja impedancia, pero en otros casos no (ni hablar sobre OSC1!) porque le matás la oscilación.
 
Que tal puedo ver de acuerdo a tu descripción tu programa esta con un tipo de cristal XT, esto es para cristales de baja velocidad en los PICS algún día tuve un problema similar con uno de 12 MHZ y todo se resolvió cambiando de XT a HS (High Speed)..... Prueba no pierdes nada....
Saludos!!!
 
Ya, hay un acercamiento.

Al menos ya parpadearon (extrañamente) unos LEDs de prueba (con sus debidas resistencias). Extrañamente, porque no va según el programa. Pero antes no ocurría ni eso, así que bien.

Entre todas las pruebas que hice, medí también el voltaje en OSC1, por si acaso. Según tu (Eduardo), rompí algo?

Leí el Datasheet, y efectivamente: para frecuencias mayores a 4MHz, es necesario usar HS, y el circuito se mantiene.

Voy a comprar otro cristal. En fin, no vale mucho. Después les cuento.

Saludos! y Gracias!!!
 
Sigo sin resultados, y con V=0 en OSC2.

Cambié los condensadores, el oscilador, probé continuidad para ver si hay cortocircuito, configuré oscilador HS (condensadores 22pF) ...

Notar que la parte superior (cerca de los primeros pines) se pone tibio el PIC. No tengo cortocircuitos... Normal? (no creo)...

Se me acabaron las ideas...
 
Última edición:
Los Fuses que tengo puesto son:

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _HS_OSC & _LVP_ON

Alguna otra idea?
Algún problema con el Reset?

Gracias!!!
 
Muy estimado,

Puse LVP_OFF y funcionó!!!

O sea, curiosamente el programa que hice todavía no funciona, pero eso ya es otro tema.

Al menos ya tengo el voltaje deseado en OSC2 y se ve alguna reacción más deseable por parte del PIC.

Agradezco por su paciencia y respuestas!!

Saludos!!!
 
Si, disculpa que no haya publicado antes el código. Era solo que mi pregunta iba por otro lado (más tipo hardware).
Probé con BODEN_OFF y lo que ocurre es, que todas las salidas están activas, y nunca se desactivan.
Lo que debiera hacer, es activar todas > esperar 1 segundo > desactivar todas > esperar 1 segundo > loop. Aparte envía algo por RS232 cada 1 segundo. Según simulación en Proteus, es así como funciona, pero para variar, está lejos de la realidad.

Código a continuación.
Muy agradecido por tu respuesta!

Código:
list		p=16F877A
#include	<p16F877A.inc>

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _LVP_OFF

;Primera Var en 0x20
	PDel0	EQU 0x20
	PDel1	EQU 0x21
	PDel2	EQU 0x22	
;Última Var en 0x7F

org 0x00
	goto	INICIO

org 0x04	;ISR
	retfie

INICIO ; Inicialización de todo
	;PORTA
	bsf	STATUS,RP0	;Bank 1
	bcf	STATUS,RP1
	movlw	0x06		;Todos como digitales
	movwf	ADCON1
	movlw	B'000000'	;Entradas y salidas
	movwf	TRISA
	bcf	STATUS,RP0	;Bank 0
	clrf	PORTA

	;PORTB
	bsf	STATUS,RP0	;Bank 1
	movlw	B'00000000'
	movwf	TRISB
	bcf	STATUS,RP0	;Bank 0
	clrf	PORTB

	;PORTC
	bsf	STATUS,RP0	;Bank 1
	movlw	B'00000000'
	movwf	TRISC
	bcf	STATUS,RP0	;Bank 0
	clrf	PORTC

	;PORTD
	bsf	STATUS,RP0	;Bank 1
	movlw	B'00000000'
	movwf	TRISD
	bcf	STATUS,RP0	;Bank 0
	clrf	PORTD

	;PORTE
	bsf	STATUS,RP0	;Bank 1
	movlw	B'000'
	movwf	TRISE
	bcf	STATUS,RP0	;Bank 0
	clrf	PORTE

	;TX de RS232, Baud, etc.
	movlw	D'31'		;BaudRate Generator
	movwf	SPBRG
	bsf	TXSTA,TXEN	;Enable transmission

LOOP
	movlw	B'11111111'	;Activar todas las entradas
	movwf	PORTA
	movwf	PORTB
	movwf	PORTC
	movwf	PORTD
	movwf	PORTE
	movlw	'a'
	call	Transmit_RS232_9600
	call	DEMORA		;Esperar 1 segundo
	clrf	PORTA		;Desactivar todas las entradas
	clrf	PORTB
	clrf	PORTC
	clrf	PORTD
	clrf	PORTE
	movlw	'b'
	call	Transmit_RS232_9600
	call	DEMORA		;Esperar 1 segundo
	goto	LOOP

Transmit_RS232_9600
	movwf	TXREG
	bsf		STATUS,RP0			; Pág 1 RAM
Espere
	btfss 	TXSTA,TRMT        	; transmision completa si es alto
    goto 	Espere
    bcf	STATUS,RP0          ; Pág 0 RAM
    return

DEMORA  movlw     .165      ; 1 set numero de repeticion  (C)
        movwf     PDel0     ; 1 |
PLoop0  movlw     .41       ; 1 set numero de repeticion  (B)
        movwf     PDel1     ; 1 |
PLoop1  movlw     .147      ; 1 set numero de repeticion  (A)
        movwf     PDel2     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
        clrwdt              ; 1 ciclo delay
        decfsz    PDel2, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel1,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (C)
        goto      PLoop0    ; 2 no, loop
        return              ; 2+2 Fin.

END
 
Que tal he dado un vistazo rapido a tu código y parece que tienes mal configurado la comunicación serie y puede ser... de acuerdo a lo que dices las entradas se prenden pero nunca se apagan lo que se me ocurre que el programa puede perderse justamente en la transmisión de datos, una sugerencia más por que no vas probando parte por parte, primero solo prende las entradas delay y las apagas.... despues lo de transmisión de datos te comparto una pequeña libreria que hice para el mismo pic pero con un cristal de 4 mhz y observa la parte de configuración ya que el pin rx del pic deberá ser configurado como entrada


;ESTA LIBRERIA ESTA DISEÑADA PARA TRABAJAR A 9600 BAUDIOS
;CON UN CRISTAL DE 4MHZ
CONFIGURA_RS232
BSF STATUS,RP0
BSF TRISC,7
BCF TRISC,6
MOVLW 0XFF
MOVWF TRISB
MOVLW .25
MOVWF SPBRG
MOVLW B'00100100'
MOVWF TXSTA
BCF STATUS,RP0
MOVLW B'10010000'
MOVWF RCSTA
RETURN
TX_DATO
BCF PIR1,TXIF
MOVWF TXREG
BSF STATUS,RP0
TX_DATO_ESP
BTFSS TXSTA,TRMT
GOTO TX_DATO_ESP
BCF STATUS,RP0
RETURN
RX_DATO
BCF PIR1,RCIF
BTFSC RCSTA,FERR
GOTO RX_DATO
MOVF RCREG,0
RETURN
 
Existe alguna forma de dejarte un "Like" o algo así?
Con esto expreso mi agradecimiento a ti y al de más arriba, el que me dijo lo del OSC2.

Tendré en cuenta tu librería, aunque lo que necesito para este proyecto solamente es enviar señales y no necesito interrupciones.
Pero por eso no me preocuparé ahora, ya que antes ya había logrado enviar señales exitosamente.

O sea, que al fin funcionó todo lo que más quería.

Te agradezco mucho!!!
Saludos!
 
Estimados!!

Necesito ayuda con este simple programa de prueba.

Lo que hace, es prender y apagar todas las salidas de un Pic 16F877 (tengo LEDs conectados), y además, enviar algún dato por TX (en RS232, una 'a' y una 'b'). Pero, nada funciona una vez que activo el módulo USART,TX.

O sea, cuando saco todo lo que tenga que ver con USART, las salidas se prenden y apagan perfectamente. Notar, que solamente deseo usar TX, y por lo cual, no considero necesario utilizar interrupciones.

He revisado ejemplos, implementado sugerencias, y leído MUY bien el Datasheet del Pic, pero aún así no consigo que funcione.

Se los publico.

Mil gracias!! Muchas gracias por su paciencia.

Código:
list		p=16F877A
#include	<p16F877A.inc>

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _LVP_OFF

;Primera Var en 0x20
	PDel0	EQU 0x20
	PDel1	EQU 0x21
	PDel2	EQU 0x22	
;Última Var en 0x7F

org 0x00
	goto	INICIO

org 0x04	;ISR
	retfie

INICIO ; Inicialización de todo
	;PORTA
	bsf	STATUS,RP0	;Bank 1
	bcf	STATUS,RP1
	movlw	0x06		;Todos como digitales
	movwf	ADCON1
	movlw	B'000000'	;Entradas y salidas
	movwf	TRISA
	bcf	STATUS,RP0	;Bank 0
	clrf	PORTA

	;PORTB
	bsf	STATUS,RP0	;Bank 1
	movlw	B'00000000'
	movwf	TRISB
	bcf	STATUS,RP0	;Bank 0
	clrf	PORTB

	;PORTC
	bsf	STATUS,RP0	;Bank 1
	movlw	B'00000000'
	movwf	TRISC
	bcf	STATUS,RP0	;Bank 0
	clrf	PORTC

	;PORTD
	bsf	STATUS,RP0	;Bank 1
	movlw	B'00000000'
	movwf	TRISD
	bcf	STATUS,RP0	;Bank 0
	clrf	PORTD

	;PORTE
	bsf	STATUS,RP0	;Bank 1
	movlw	B'000'
	movwf	TRISE
	bcf	STATUS,RP0	;Bank 0
	clrf	PORTE

	;TX de RS232, Baud=9600 para 20 MHz, etc.
	bsf	STATUS,RP0	;Bank 1
	bsf	TXSTA,BRGH	;HighSpeed
	movlw	D'129'		;BaudRate Generator = 9600 Baud
	movwf	SPBRG
	bsf	TXSTA,TXEN	;Enable transmission

LOOP
	movlw	B'11111111'	;Activar todas las salidas
	movwf	PORTA
	movwf	PORTB
	movwf	PORTC
	movwf	PORTD
	movwf	PORTE
	movlw	'a'
	call	Transmit_RS232_9600
	call	DEMORA		;Esperar 1 segundo
	clrf	PORTA		;Desactivar todas las entradas
	clrf	PORTB
	clrf	PORTC
	clrf	PORTD
	clrf	PORTE
	movlw	'b'
	call	Transmit_RS232_9600
	call	DEMORA		;Esperar 1 segundo
	goto	LOOP

Transmit_RS232_9600
	bcf	STATUS,RP0		;Bank 0, por si acaso.
	bcf	STATUS,RP1
	bcf	PIR1,TXIF
	bsf	STATUS,RP0		;Bank 1
	bcf	TXSTA,TRMT
	bcf	STATUS,RP0		;Bank 0
	movwf	TXREG
	bsf	STATUS,RP0		;Bank 1
EspereTX
	btfss 	TXSTA,TRMT		; transmision completa si es alto
    goto 	EspereTX
    bcf	STATUS,RP0		;Bank 0
    return

DEMORA	;Demora de 1 segundo a 20 MHz
		movlw     .165      ; 1 set numero de repeticion  (C)
        movwf     PDel0     ; 1 |
PLoop0  movlw     .41       ; 1 set numero de repeticion  (B)
        movwf     PDel1     ; 1 |
PLoop1  movlw     .147      ; 1 set numero de repeticion  (A)
        movwf     PDel2     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
        clrwdt              ; 1 ciclo delay
        decfsz    PDel2, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel1,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (C)
        goto      PLoop0    ; 2 no, loop
        return              ; 2+2 Fin.

END
 
Atrás
Arriba