Problema programando 16F877A

Muy buenas a todos!

Estoy empezando a programar PICs e intentando realizar el holamundo de estos cacharritos, encender un LED.
Estoy usando un 16F877A porque me han dicho que es bastante educativo. El caso es que ya he hecho mi primer programita, pero nada, no funciona. He buscado y rebuscado hasta no poder más y no se en qué puedo estar fallando.

Este es mi código.

#include <P16F877A.INC>

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

ORG 0

; Vamos a configurar el puerto B, y pondremos RB7 como una salida
; e intentaremos encender y apagar un led (blink) con RB7

; Cambiamos al banco 0 para poder operar sobre los registros

BCF STATUS,RP0
BCF STATUS,RP1

; Ya estamos en el banco de memoria 0

CLRF PORTB
CLRF PORTA

BSF STATUS,RP0 ; Me muevo al banco 1

movlw b'11111110'
movwf TRISB ; Configuro todas las salidas excepto la RB0 como entradas, RB0 salida

BCF STATUS,RP0

; Y encendemos el led

BSF PORTB,0x01 ; Lo ponemos a 1

END

Uso un cristal de 20 MHz con un par de condensadores de 22pF (Configuración típica), una alimentación de 5V que de echo cojo directamente de un USB. La alimentación y la tierra la conecto (cada una a cada cual) a los pines 11,12,31,32.

El LED que pongo a la salida de RB0 (pin 33) ni se inmuta. De echo, si paso el dedo por encima del PIC a veces se ilumina!! :S

El pic no está mal porque esto mismo me pasa al intentarlo con un 18F2550 (que también he probado a hacer esto, con igual resultado).

¿Qué puedo estar haciendo mal?

¿Qué estoy haciendo mal?
 
Hola, dos cositas:
> Al usar BSF PORTB,0x01... (para mi se ve raro) pero con ese número lo que haces es poner a '1' el pin RB1 pero según como explicas el LED lo tienes en RB0, entonces seria BSF PORTB,0
> Debes de cerrar el ciclo, es decir que cuando ejecuta la instrucción BSF el procesador pasa a la siguiente instrucción pero no encuentra nada, lo que te falta es un GOTO a un 'label'... por ejemplo.

Código:
...
    BSF PORTB.0
Bucle:
    GOTO Bucle ; Eso hace que el PIC ya no se pierda.
END

saludos
 
Mil perdones, lo de 0x01 lo cambié para copiar aquí el código, se me fué la pinza. Ya he puesto el bucle también.

Pero me sigue pasando igual :S:S:S:S

He probado con otro cristal, he testeado el LED, he cambiado los condensadores... y nada :(:(
Me hace lo mismo.
 
Has escogido bien el PIC?, en la cabecera falta algo como:
PROCESSOR 16F877A
o
list p=16F877A

En los fuses el '_XT_OSC' es para cristales entre 4 - 10Mhz, cambia a _HS_OSC para cristales hasta 20Mhz.

Código:
ORG 0x00
banksel  TRISB
clrf    TRISB
banksel  PORTB
clrf    PORTB
bsf    PORTB,0

Loop:
goto  Loop
END

PD: Aparece algún warning? al compilar? cuales.
si ya no funciona eso es algo en el hardware.

saludos
 
Última edición:
Lo del HS (High Speed) lo configuré anteriormente, pero por ver ejemplos por ahí lo cambié. Pero nada, sigue igual. La cabecera la he puesto, e igual.

El caso es que es muy raro que sea el hardware. Me llegó ayer el PIC, y no he hecho más que esto. Hasta probé diferentes puertos por si usando un LED con una resistencia de 820ohm había matado algun puerto (cosa que dudo mucho, pues son 6mA).

Ya lo que más me mata es que he configurado un 18F2550 igual (con sus cosillas) y me pasa exactamente lo mismo. Además que si paso la mano por encima del pic y toqueteo, se enciende el led, pero se vuelve a apagar. Es super raro :S:S:S

Este era mi código del 18F2550

Código:
    #include <p18f2550.inc>

    
    CONFIG FOSC = INTOSCIO_EC  ; Ponemos el oscilador interno a funcionar. Así nos olvidamos de cacas, por ahora.
    CONFIG FCMEN = OFF
    CONFIG WDT = OFF
    CONFIG MCLRE = ON
    CONFIG LVP = OFF


    ORG 0

    MOVLW    0xFF    
    MOVWF    BSR, 0 ; Me he movido al banco 15, para manejar los registros

    CLRF    TRISB
    CLRF    PORTB ; Configuramos el puerto B como salida, y ademas lo borramos.

    MOVLW    0x00 ; Marcamos un 1 en el bit menos significativo de un byte
    MOVWF    PORTB


    END

Aaaaaaaaaaaaaaaaaaaaaaaaaaaaahggg
 
Ahí también falta el goto a un Label, de otro modo el procesador del PIC ya no sabe que hacer y se pierde.
Para los P18 dicen que es lo mismo pero prefiero configurar I/O en los TRISx, leer datos de los PORTx y escribir en los LATx...

Ahora eso ya es raro, si estás usando un protoboard, tal vez sea eso ya que si me dices que con el dedo se prende, hay un mal contacto por ahí... para casos prácticos otros ponen todos los pines que no usan como salidas, para de ese modo no absorba ruido... lo veo exagerado pero prueba... También si conoces el programa proteus, puedes simular ahí tu código.

Date un paseo por aquí: ASM desde 0 (ASM desde cero)

saludos.
 
Mil gracias Axel.

Por cierto, me equivoqué en el último, el código correcto es:

Código:
    #include <p18f2550.inc>

    
    CONFIG FOSC = INTOSCIO_EC  ; Ponemos el oscilador interno a funcionar. Así nos olvidamos de cacas, por ahora.
    CONFIG FCMEN = OFF
    CONFIG WDT = OFF
    CONFIG MCLRE = ON
    CONFIG LVP = OFF


    ORG 0

    MOVLW    0x0F    
    MOVWF    BSR,0 ; Me he movido al banco 15, para manejar los registros

    CLRF    TRISB
    CLRF    PORTB ; Configuramos el puerto B como salida, y ademas lo borramos.

    MOVLW    0x01 ; Marcamos un 1 en el bit menos significativo de un byte
    MOVWF    PORTB


    END

Sigue sin funcionarme, no me explico por qué. Ya hasta adjunto una foto de mi cacharrito



Puse el bucle también en el 18F2550 y en las mismas. Medí también la salida del puerto y me marca 0 o 5 en funcion de la distancia de mi dedo al pic :p

Que desesperación. Son mis primeras veces y no se en qué la estoy cagando para que pase esto...
 
Última edición:
En función al dedo :LOL: ... creo que si hay ruido por ahí...

Usé esta config a 8Mhz para el PIC18F2550:

Código:
	CLRF   TBLPTRU
	BCF    RCON.IPEN
	CLRF   FSR0H
	CLRF   FSR0L
	MOVLW  0x70
	MOVWF  OSCCON
	MOVF   OSCCON,W
	MOVF   ADCON1,W
	ANDLW  0xC0
	IORLW  0x0F
	MOVWF  ADCON1
	MOVLW  0x07
	MOVWF  CMCON
	MOVLW  0xF6
	MOVWF  OSCCON
	MOVLW  0x00
	MOVWF  TRISB

Main:
	MOVLW  0x00
	MOVWF  TRISB
	CLRF   LATB
	
	BSF    LATB.0
Loop:
	BRA    Loop
	
	END
, no lo tengo pero simula bien en el proteus y con CONFIG MCLRE = ON creo que debes de poner una resistencia al MCLR a V+.

saludos
 
BINGO

Fue el MCLR. Es evidente ahora que lo pienso!!!! Si es el reset, si no lo tengo determinado, el pic estará continuamente reseteándose en funcion al potencial que obtenga la patilla por la buena de Dios. De ahí que si acerco la mano y demás, el MCLR a veces no resetee y se ejecute el programa. En cuanto aparto la mano, resetea y bye bye programa.

Genial ByAxel, me has dado una gran lección de experiencia :p

Aunque ensablador se! (Aunque con las instrucciones de Intel).


Muchisísimas gracias. Ojalá muchos que como yo tengan este problema lean este post y resuelvan su duda.

¡¡A Trastear!!


(Hasta que no consiga hacer funcionar a la perfección un LCD no me quedo contento)


Jeje, saludos a todos!!!!
 
Hola, no es necesario que pongas el código para seleccionar el pin..ya el mplab trae los define de todos los pines de todos los puertos..

asi: antepone una Rx, donde x es el puerto (A,B,C,D,o E).

PORTB,RB0

y yo por buena costumbre encierro todo en un bucle infinito..

Código:
                    #include<p16f877a.inc>
                    #list p=16f877a

                    VARIABLE EQU XXXX

                    org           0
                    goto         PROGRAMA
                    org           4
                    goto         RSI
 
PROGRAMA      bcf          status,rp0
                    clrf          portx                
                    bla
                    bla
                    goto        PRINCIPAL
 
RSI               
                    btfss        portb,RB0                         ;determinas cual sea la fuente de interrupcion
                    goto        INTERRUPCION_EXT
                    btfss        INTCON,T0IF
                    goto        INTERRUPCION_TIMER
                    bla
                    bla
                    movlw       xxx
                    subwf        xxx
                    bla
                    bla
                    bla
                    retfie 

                   END
 
Atrás
Arriba