Hooooola, como va .
Hemos aprendido a empezar y acabar los programas , sabemos que tenemos 68 registros para nuestro uso , sabemos configurar las puertas como muy bien ha dicho " Chile_irc " y " Abago ".
En el programa se suelen poner comentarios para poder entender mejor el programa , los comentarios va detras de ; todo lo que este detras del punto y coma, el mpasm no lo tendra en cuenta.
Bien, tambien hay unos registros de funciones especiales estos van desde la direccion 0x00 hasta 0x0B ( 12 registros ) .
Luego estan las etiquetas , es una manera de identificar los registros dandole un nombre que nosotros queramos , asi sera mucho mas facil que poner una direccion.
Un ejemplo, el registro estado esta en la direccion 0x03 ( se me olvidava todo numero que vaya precedido por un 0x esta en base hexadecimal, tambien trabajaremos en base decimal y binario ) si en vez de identificarlo con la direccion 3 le pongo una etiqueta me sera mas facil saber cual es . ¿ como ? ESTADO EQU 0x03 con un Equ,
Esto quedaria asi.
Codigo:
LIST P=16F84A ;EL PIC QUE VAMOS A UTILIZAR.
;***************************************************************
;ETIQUETAS DEL PROGRAMA.
ARCHIVO_1 EQU 0X0C ;1ªDIRECCION LIBRE PARA NUESTRO USO.
ESTADO EQU 0X03 ;ESTADO, ESTA EN LA DIRECCION 3
;***************************************************************
;AQUI EMPIEZA EL PROGRAMA.
ORG 0 ;ORIGEN DEL PROGRAMA, AQUI EMPIEZA.
goto INICIO ;VA A INICIO PARA SOBREPASAR EL
ORG 5 ;VECTOR DE INTERRUPCION.
INICIO bsf ESTADO,5 ;ME SITUO EN EL BANCO 1
movlw b"11111" ;PUERTAA COMO ENTRADA.
movwf PUERTAA
clrf PUERTAB ;PUERTAB COMO SALIDA.
bcf ESTADO,5 ;NOS SITUAMOS EN EL BANCO 0.
END
Me imagino que habras muchas dudas , asi que empezar a preguntar.
Propongo analizar el siguiente programa:
Codigo:
; Por el Puerto B se obtiene el dato de las cinco líneas del Puerto A al que está conectado
; un array de interruptores. Por ejemplo, si por el Puerto A se introduce "---11001", por
; el Puerto B aparecerá "xxx11001" (el valor de las tres líneas superiores no importa).
; ZONA DE DATOS **********************************************************************
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC ; Configuración para el
; grabador.
LIST P=16F84A ; Procesador.
INCLUDE <P16F84A.INC> ; Definición de los operandos utilizados.
; ZONA DE CÓDIGOS ********************************************************************
ORG 0 ; El programa comienza en la dirección 0 de memoria de
; programa.
Inicio bsf STATUS,RP0 ; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1.
clrf TRISB ; Las líneas del Puerto B se configuran como salidas.
movlw b"11111111"
movwf TRISA ; Las líneas del Puerto A se configuran como entradas.
bcf STATUS,RP0 ; Pone a 0 el bit 5 de STATUS. Acceso al Banco 0.
Principal
movf PORTA,W ; Lee el Puerto A.
movwf PORTB ; El contenido de W se visualiza por el Puerto B.
goto Principal ; Crea un bucle cerrado.
END ; Fin del programa.
Hola que tal , los ORG significa " origen " y le dice al ensamblador en que direccion empieza el programa, ORG 0 empezara a grabar en la direccion 0 , 
, GOTO , si te das cuenta al lado del goto se pone otra palabra en este caso INICIO con esta instruccion el programa salta hasta donde se en cuentre INICIO, va a la direccion donde esta, 2 direcciones mas abajo.
Con los EQU, tu mismo te has dado cuenta para que sirve , es lo mismo , me explico el registro " ESTADO " ( recuerda que esta en la direccion 3 de la memoria de datos ), tiene 8 bits y el bit que hace que cambiemos de banco es el bit 5, que se llama RP0, yo he puesto ESTADO,5 , y ADRIAN ESTADO, RP0, el ha utilizado un EQU , ( bueno aunque no lo veas , por que esta incluido en el include , que de este ya hablaremos ), como ya te dije es una forma de identificar mas rapido de que bit se trata. esto quedaria mas o menos asi.
Codigo:
LIST P=16F84A ;EL PIC QUE VAMOS A UTILIZAR.
;***************************************************************
;ETIQUETAS DEL PROGRAMA.
ARCHIVO_1 EQU 0X0C ;1ªDIRECCION LIBRE PARA NUESTRO USO.
ESTADO EQU 0X03 ;ESTADO, ESTA EN LA DIRECCION 3
RP0 EQU 0X05 ;RP0 EQUIVALE A 5.
;***************************************************************
;AQUI EMPIEZA EL PROGRAMA.
ORG 0 ;ORIGEN DEL PROGRAMA, AQUI EMPIEZA.
goto INICIO ;VA A INICIO PARA SOBREPASAR EL
ORG 5 ;VECTOR DE INTERRUPCION.
INICIO bsf ESTADO,RP0 ;ME SITUO EN EL BANCO 1
movlw b"11111" ;PUERTAA COMO ENTRADA.
movwf PUERTAA
clrf PUERTAB ;PUERTAB COMO SALIDA.
bcf ESTADO,5 ;NOS SITUAMOS EN EL BANCO 0.
END
Fijate como ha cambiado, utilizando los EQU .
Con lo de la configuracion del grabador es una manera, mediante el programa de configurar los parametros que utilizamos para grabar el pic en el ic-prog con esto no haria falta señalar las casillas que le corresponden . Creo que sera mejor explicarlo cuando hayamos terminado el programa y vayamos a grabarlo . ok.
Bueno espero haberme explicado bien si os queda alguna duda , preguntarla. 



Hola que tal, " doppel " el vector de interrupcion se encuentra en la direccion 4 como has dicho , esa es la direccion que hay que saltar, coloque el comentario de la interrupcion en la posicion 5, pero este comentario se referia a la direccion 4 , ya lo he corregido. 

He añadido las equ de las puertas , he empleado la instruccion btfsc para explorar el pulsador que se encuentra en el bit 0 , pin nº 17, y ha esperar que se produzca la pulsacion.
Codigo:
LIST P=16F84A ;EL PIC QUE VAMOS A UTILIZAR.
;***************************************************************
;ETIQUETAS DEL PROGRAMA.
ARCHIVO_1 EQU 0X0C ;1ªDIRECCION LIBRE PARA NUESTRO USO.
ESTADO EQU 0X03 ;ESTADO, ESTA EN LA DIRECCION 3
RP0 EQU 0X05 ;RP0 EQUIVALE A 5.
PUERTAA EQU 0X05 ;PUERTAA SE ENCUENTRA EN LA DIRECCION 5.
PUERTAB EQU 0X06 ;PUERTAB SE ENCUENTRA EN LA DIRECCION 6.
;***************************************************************
;AQUI EMPIEZA EL PROGRAMA.
ORG 0 ;ORIGEN DEL PROGRAMA, AQUI EMPIEZA.
goto INICIO ;VA A INICIO PARA SOBREPASAR EL VECTOR DE INTERRUPCION.
ORG 5
INICIO bsf ESTADO,RP0 ;ME SITUO EN EL BANCO 1
movlw b"11111" ;PUERTAA COMO ENTRADA.
movwf PUERTAA
clrf PUERTAB ;PUERTAB COMO SALIDA.
bcf ESTADO,5 ;NOS SITUAMOS EN EL BANCO 0.
ARRIBA btfsc PUERTAA,0
goto ARRIBA
END
Os comento la instruccion btfsc testea la entrada de la puerta y si vale 0 salta para encender el led , para que valga 0 tiene que estar presionado el pulsador , si no se pulsa a la entrada le llega un 1 , y la siguiente instruccion sera goto ARRIBA es decir va a la instruccion anterior y asi hasta que se produzca la pulsacion .
Si hay algo que no entendais , preguntarlo.
P.D. ALGUIEN PODRIA DECIRME COMO SUBIR UNA IMAGEN , GRACIAS.
Hola , que tal , bueno parece que ya tenemos el veranito aqui , ¡¡¡¡¡¡¡¡¡¡ y se acerca ese mes de vacaciones !!!!!!!!!! 





Chile_irc, ya ha colgado la memoria de datos, podeis ver que direccion tiene cada registro , ok , ( que por cierto me tiene que decir como lo ha hecho ), los EQU como tu bien has dicho significa equivale, vamos a poner un ejemplo a ver si asi se entiende mejor Codigo:
;VAMOS A PONER UN 1 EN EL BIT 5 DEL REGISTRO ESTADO SIN UTILIZAR LOS EQU.
;EL BSF PONE A 1 EL BIT DEL REGISTRO QUE PONGAMOS A CONTINUACION,
;EL REGISTRO QUE HEMOS PUESTO ESTA EN LA DIRECCION 3,
;Y EL BIT QUE HAY QUE MODIFICAR SE COLOCA DETRAS DE LA COMA.
;EN ESTE CASO EL BIT QUE NOS INTERESA ES EL Nº5.
;*******************************************************************************************
bsf 0x03,5
;*******************************************************************************************
;PUES AHORA LO VAMOS A HACER CON LOS EQU.
;FIJAROS QUE SI ESTADO EQUIVALE A 3 Y RP0 A 5 ,¡¡¡¡ ES LO MISMO !!!!!
;¿POR QUE SE HACE ESTO ? IMAGINATE EN UN PROGRAMA MUY LARGO, QUE LOS HAY, TODO LLENO DE NUMERITOS ,
;TE VOLVERIAS LOCO, CON LOS EQU IDENTIFICAS MAS RAPIDO DE QUE REGISTROS O BITS SE TRATAN.
;*******************************************************************************************
ESTADO EQU 0X03 ;ESTADO, ESTA EN LA DIRECCION 3.
RP0 EQU 0X05 ;Y AL BITE 5 LE VAMOS A LLAMAR RP0.
bsf ESTADO,RP0
Entonces continuamos , el programa esta testeando continuamente la puertaa RA0, y cuando pulsas se enciende el led y cuando dejas de pulsar se apaga , DE MOMENTO NO VOY A PONER UNA PERDIDA DE TIEMPO PARA EVITAR LOS REBOTES, PARA NO LIARNOS , YA LO COMENTAREMOS , solo deciros que cuando se pulsa no hay solo un contacto entre las laminillas del pulsador hay muchos y eso puede dar errores de lectura , para evitarlo en el primer contacto el pic va a una rutina para perder tiempo mas o menos 20 ms , con eso se suele evitar los rebotes.
Aqui os dejo el programa terminado echarlo un vistazo y vemos las dudas , en cuanto no hayan dudas pasamos a ensamblarlo y a grabar el pic y probar nuestro primer circuito.
Codigo:
LIST P=16F84A ;EL PIC QUE VAMOS A UTILIZAR.
;***************************************************************
;ETIQUETAS DEL PROGRAMA.
ARCHIVO_1 EQU 0X0C ;1ªDIRECCION LIBRE PARA NUESTRO USO.
ESTADO EQU 0X03 ;ESTADO, ESTA EN LA DIRECCION 3
RP0 EQU 0X05 ;RP0 EQUIVALE A 5.
PUERTAA EQU 0X05 ;PUERTAA SE ENCUENTRA EN LA DIRECCION 5.
PUERTAB EQU 0X06 ;PUERTAB SE ENCUENTRA EN LA DIRECCION 6.
;***************************************************************
;AQUI EMPIEZA EL PROGRAMA.
ORG 0 ;ORIGEN DEL PROGRAMA, AQUI EMPIEZA.
goto INICIO ;VA A INICIO PARA SOBREPASAR EL VECTOR DE INTERRUPCION.
ORG 5
INICIO bsf ESTADO,RP0 ;ME SITUO EN EL BANCO 1
movlw b"11111" ;PUERTAA COMO ENTRADA.
movwf PUERTAA
clrf PUERTAB ;PUERTAB COMO SALIDA.
bcf ESTADO,RP0 ;NOS SITUAMOS EN EL BANCO 0.
clrf PUERTAB ;BORRO LA PUERTAB PARA EMPEZAR
ARRIBA btfsc PUERTAA,0 ;TESTEA EL PIN 17 DEL PIC,RA0.SALTA SI VALE A PASAR 0
goto ARRIBA ;VA UNA DIRECCON MAS ARRIBA.
ENCIENDE bsf PUERTAB,0 ;ENCIENDE EL LED.
btfss PUERTAA,0 ;TESTEO PARA VER SI HA DEJADO DE PULSAR
goto ENCIENDE ;SI ESTA PULSADO VA A ENCIENDE.
bcf PUERTAB,0 ;SE DEJO DE PULSAR, APAGO EL LED.
goto ARRIBA ;Y SE DEJO DE PULSAR VA ARRIBA.
END
UN SALUDO
Esto puedo intentar explicarlo bajo mi punto de vista y viéndolo desde lejos y a groso modo .
Los pic incorporan un microprocesador entre otras cosas que se le llama Unidad Centrar de Proceso CPU y no es nada mas que un monton de puertas entrelazadas para poder realizar operaciones matematicas y otras cosas (muy pocas cosas) sumar y restar , and , or , etc . (yo no me preocuparia de momento de como funciona internamente , aunque es interesante ).
¿ pero como es posible que estos bichos hagan estas cosas tan increibles si estan tan limitados en operaciones y no disponen de inteligencia ? .
Aqui es cuando entra el ser humano para ir combinando todas estas pequeñas posivilidades e ir formando una aplicacion .
La CPU por si sola no nos sirve para nada , así que necesita de mas hardware para poder hacer algo practico y util para nosotros.
Todo este hardware es paralelo a la CPU y son necesarias unas lineas para poder acceder a la direccion donde se encuentre dicho hardware (se llaman lineas de direcciones ) , por ejemplo el PortA se encuentra en la direccion 5 , asi que se lo indicaremos para poder acceder a el .
Con direccionarlo no nos sirve para mucho , así que lo ideal es poder leer y escrivir sobre el , para esto la CPU incorpora el (bus de dados 8 en este caso ) y finalmente el bus de (control) , que son otras lineas necesarias ( por ejemplo una de ellas seria si se lee o escribe sobre el dispositivo , CS para seleccionar un dispositivo ).
La CPU necesita de un medio de almacenamiento para ir leyendo las ordenes que nosotros queremos que realice y obrar en consecuencia , a esto se le llama juego de instrucciones y este medio puede ser RAM , ROM , EEPROM , FLASH etc . lo mas lojico es que sea de alguno de los tipos que no se borran al cortar la alimentacion , jejej. se llama memoria de programa .
Es aqui donde pondremos nuestro codigo y la CPU ira leyendo y ejecutando fielmente cada una de ellas al ridmo de un reloj .
Una memoria del tipo RAM para guardar valores temporales que se borraran al quitar la alimentacion .
Necesita de un hardware para entradas y salidas (creo que no hace falta comentar lo que es ) .
En el caso de los pics pueden incluir Timmers, usart etc. solo hay que direccionarlos y actuar sobre sus registros para configurarlos , leerlos etc .
Podeis ver la si arquiectura con mas detalle en los Datas.
En el caso de los 16Fxxx La CPU se situará en la dirección 0000 de la memoria de programa al resetearse y empezara a ejecutar lo que encuentre alli . Lo normal es saltar a una direccion superior ya que en al generarse una interrupcion la CPU emezara a ejecutar lo que encuentre en la posicion 4 y hay que dejarla libre .
por ejemplo , solo para que veais como nos podemos mober por la flash .
Codigo:
org 0x0003
nop
org 0x03FF
nop
end
si esto tal cual está se compila con Mpasm y abrimos Winpic800-IcProg seleccionando un 16f84 veremos un 0x0000 en la direccion 0x3 y en la direccion 0x3FF , que es el valor equivalente al nop (no operacion)
Espero haya aclarado alguna cosita aunque sea u poco .
Hola , 
bueno estoy un poco liado asi que intentare sacar tiempo de donde pueda, primero que nada agradecer las explicaciones de Pocher y Sispic 
.
Piriots si has hecho alguna placa ya, a lo mejor te interesa hacerte la te- 20 se, he encontrado un monton de paginas donde esta el fotolito , utiliza tu buscador favorito, de todos modos te dejo aqui una direccion, por si te interesa http://www.zackyfiles.info/nagra1/grabadores/te20.htm , recuerda escoge la version SE
Bueno el circuito ya lo he probado y funciona , incluso sin rutina antirrebotes , yo cuando empeze en los circuitos muy simples no ponia rutinas antirrebotes y no he tenido problemas , pero en los circuitos mas complejos es muy conveniente utilizarla.
Los componentes que de momento nos haran falta es el Codigo:
PIC 16F84A
CRISTAL 4Mhz
2 CONDENSADORES 27PF
1 CONDENSADOR 100K
2 PULSADORES, NORMALMENTE ABIERTO
1 DIODO 1N4148
RESISTENCIAS DE 10K, 100 Ohm, 330 Ohm
DIODO LED
Bueno , esperaremos un poco a que tengais lo necesario, si teneis alguna duda .
UN SALUDO
Hola , vamos a ensamblar el programa y asi lo vamos viendo, he de deciros que os voy a contar como lo hago yo, tambien se puede hacer utilizando el mplab , ya deje un enlace de un tutorial en castellano de como hacerlo.
El programa yo lo hago en el bloc de notas , si no lo habeis hecho en el bloc de notas copiarlo del mensaje ( boton derecho del raton, copiar y luego pegar ), vamos a " archivo " y " guardar como " , aqui le damos un nombre y le ponemos por extension asm , mas o menos quedaria asi le llamaremos Primero, Primero.asm , lo guardaremos en una carpeta que tengamos localizada.
Ya os comente que me hize un acceso directo del mpasm, abri la carpeta del mplab y localize el mpasmwin.exe , boton derecho y crear acceso directo, y luego lo arrestre, hasta el escritorio
Abrimos el programa Mpasm, localizamos el programa Primero.asm con el boton BROWSE y apretamos Assemble .
Si no tenemos ningun error, lo ensamblara y nos crea unos archivos en la carpeta donde guardamos el programa Primero.asm, el que nos interesa tiene una extension hex , Primero .hex ese es el que utilizaremos para grabar el programa en el pic.
Os tiene que haber salido esto: Codigo:
:020000000528D1
:06000A0083161F30850083
:1000100086018312860105180B280614051C0D287D
:0400200006100B2893
:00000001FF
Pues ya podeis ir probando .
UN SALUDO
Escrives esto pero sin los espacios en blanco , es decir todo junto .
Codigo:
[ c o d e ]
bla,bla
bla,bla
[ / c o d e ]
Tambien hacerle caso a Meybel , es mejor ver los resultados en tiempo real para empezar y aprender .
Por cierto , cual entrenador haveis escogido ? para montarlo .
saludos.
Está muy bien,YF-21.
Ahora fíjate en los cambios que he hecho y te comento las cosillas que yo veo.
Codigo:
#include <16c84.h> // Dispositivo a utilizar
#use delay(clock=10000000) // Frecuencia del cristal
#fuses HS,NOWDT,NOPUT,NOPROTECT // Fusibles
#byte puertaa = 5 // Posición de la puerta A
#byte puertab = 6 // Posición de la puerta B
void main(/* aquí dentro no es necesario poner el "void" */) {
int valor; // Valor temporal
set_tris_a(0xff); // Oxff ---> TRISA
set_tris_b(0x00); // 0x00 ---> TRISB
while(TRUE) { // Bucle infinito
valor = puertaa; // PuertaA --> valor
valor +=2; // se incrementa valor en 2
puertab = valor;
}
} // Llave que se abra,llave que se debe cerrar
No se te puede pasar especificar la velocidad del oscilador,y también hay que especificar en la parte de los fusibles de qué tipo es (HS > 4 MHz)
Los fusibles que hemos usado son:
Oscilador de tipo HS.
Watchdog desactivado.
Power up timer desactivado.
Protección de código desactivada.
En cuanto al uso que haces del do-while,es totalmente correcto,pero ten en cuenta que dicho bucle se va a ejecutar,sin condición alguna,siempre, por lo que es más práctico usar un while normal y corriente.El do-while se usa para cuando queremos que nuestro bucle se ejecute al menos una vez,sean cuales sean las circunstancias.De esta forma,el siguiente bucle se ejecutaría una vez:
Codigo:
do {
delay_ms(1000) // Retardo de 1 segundo
}while(FALSE);
Otra cosa que yo tendría en cuenta es que "valor" es una variable de tipo entero cuyo valor puede estar comprendido entre -128 y 127(8 bits),por lo que cuando esta variable alcanza su valor máximo y la vuelves a incrementar,toma de nuevo su valor mínimo(-128),y así de forma indefinida.
Saludos