saludos farroyogarcia, bienvenido al foro.
Mira talvez te sirva comenzar por el ensamblador, si es que no conoces mucho de micros, siempre es bueno comenzar por la estructura de un dispositivo y ver como funciona internamente, ello lo lograras con el ensamblador y el mplab, despues puedes pasarte a otro lenguaje que sea de alto nivel, como el C de ccs, el basic o proton, lo que veas mas facil
para comenzar tb te servira mucho la hoja de datos del pic, esa la consigues de la pagina de microchip no tiene costo las descargas, en ello puedes tb darle una mirada a las intrucciones, registros, seguramente que tienes principios de electronica digital ya que ahi habla de registros, memoria, direcciones, etc.
mira el programa que hice para encender un led por interrupcion externa, te lo comento todo, para que puedas entenderlo:
bueno aca el programa explicado:
LIST P=16F84A ;define que micro es el que vas a usar
#INCLUDE <P16F84A.INC> ;incluye las definiciones usadas para el micro, por ejemplo, PORTB=0x06,INTCON,INTE, etc
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF ;esta el la palabra de configuracion, son algunas caracteristicas con las que funcionara el micro
; dice qeu usaremos un oscilador XT (<4MHz)
; WDT_OFF deshabilita el perro guardian, que es un timer que resetea al micro cuando desborda, se lo usa cuando sea necesario, aca no
; PWRTE_ON es el power up timer, si no me equivco es para que el micro espere un tiempo hasta que la tension sea la adecuada para comenzar a ejecutar el programa
; CP_OFF es proteccion del codigo, en off esta desprotegido, este lo habilitas para que no te copien el programa desde el micro
ERRORLEVEL -302 ; solo quita algunos warning que te da el mplab
CBLOCK 0x0C ; una definicion de variables que van desde la posiscion 0x0c de la ram
PDel0,PDel1 ; los nombres de las variables
ENDC ; fin del bloque de variables
ORG 0X00 ; origen del programa en la direccion 0
GOTO INICIO ; nos vamos a la etiqueta de inicio
ORG 0X04 ; declaracion de ll vector de interrupcion
GOTO INTERRUPT
;-----------------------------------------
;**************RUTINA RETARDO************* esta rutina fue elaborada con el programa PICDEL (PDEL)
;-----------------------------------------
DELAY movlw .55 ; 1 set numero de repeticion (B)
movwf PDel0 ; 1 |
PLoop1 movlw .181 ; 1 set numero de repeticion (A)
movwf PDel1 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
clrwdt ; 1 ciclo delay
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
RETURN ; 2+2 Fin.
;---------------------------------------------------------
;***********RUTINA QUE ATIENDE LA INTERRUPCION************
;---------------------------------------------------------
INTERRUPT ; esta rutina se ejecuta cada vez que ocurra una interrupcion
CALL DELAY ; llamamos a la rutina DELAY para generar un retardo de 50ms antirrebotes
MOVLW B'00000010' ; cargamos el acumulador W con el valor binario 10
XORWF PORTB,F ; realizamos un OR-Exclusivo entre el PUERTOB y el valor binaio cargado anteriormente
BCF INTCON,INTF ; ponemos a cero la bandera de interrupcion externa, para poder detectar otra interrupcion posteriormente
RETFIE ; retornamos de la interrupcion al programa principal, de donde fue interrumpido
;-----------------------------------------
;***********PROGRAMA PRINCIPAL************
;-----------------------------------------
INICIO
CLRF PORTA ; inicializamos puerto A
CLRF PORTB ; y puerto B
BSF STATUS,RP0 ; nos vamos al banco 1, para configurar los puertos a entradas y salidas
MOVLW B'11111101' ; cargamos el acumulador W con el valor binario
MOVWF TRISB ; movemos el valor binario anterior al registro TRISB que contiene la configuracion de I/O del puerto B
; los '1' definen el pin como entrada; los '0' como salida 1=IN 0=OUT
; el puerto B entonces tiene todos los pines como entradas, excepto el pin RB1, que sera la salida
; es mejor si no se usara un pin configurarlo como entrada, apra evitar corto circuitos que lo puedan dañar
MOVLW B'11111111' ; cargamos el acumulador W con el valor binario
MOVWF TRISA ; movemos el valor binario anterior al registro TRISA que contiene la configuracion de I/O del puerto A
BSF OPTION_REG,INTEDG ; definimos que la interrupcion se dara en el flanco de subida, ya que ponemos a '1' el bit INTEDG del registro OPTION_REG
BCF STATUS,RP0 ; nos vamos al banco 0 para la manipulacion del siguiete registro y el puerto B que estan en el banco 0
BCF INTCON,INTF ; ponemos a '0' la abndera de interrupcion externa
BSF INTCON,INTE ; ponemos a '1' el bit de interrupcion externa, para habilitar la interrupcion
BSF INTCON,GIE ; ponemos a '1' el bit de interrupcion global, para habilitar el uso de las interrupciones
CICLO ; bucle infinito
GOTO CICLO ; donde se trabajara hasta que haya interrupcion, en este caso no hay nada ya que la interrupcion hace lo necesario
END ; fin del programa
creo que esta mas corto y claro que el codigo generado por el niple, si simulas con proteus lo podras ver, o armando lo veras tb, jeje, talvez ajustar un poco el retardo si es que no funciona mbien para los rebotes
pulsador en RB0 y led en RB1
vcc-----pulsador------10k-----tierra
|
v
al micro
RB0
te colgue el codigo, el .hex y la simulacion en proteus
aca