# Programar PICs y usar MPLAB desde 0



## Guest (Abr 27, 2009)

Bueno, reslta que he olvidado TODO lo que aprendi sobre programacion de pics, y resulta frustrante puesto que llege a hacer casi un game of life en 1D, hace algun tiempo cambie de SO y ayer me baje el MPLAB a ver si el WINe me lo movia, al final con buenos resultados, sin embargo y por desgracia me di cuenta que ya no tenia ni puta idea de usar el mplab.

En concreto neceesito saber su funcionamiento basico, por ejemplo, yo escribo codigo, y ¿a que boton le doy despues? ¿en que formatos me compila? ¿que formatos necesito? ¿me saca directamente un HEX?

Si, ya se que resulta un poco dificil asumir que olvide todo esto, pero es cierto!, me da que segui alguna guia que me decia que hacer sin explicar el porque y de ahi que se me olvide (siempre me preocupo de saber el porque de las cosas).

Tengo mil dudas mas, pero creo que estas son las primeras que he de despejar, tengo un codigo con el puedo ir probando sin miedo a que este mal compilado.

Echadme una mano porfa.


----------



## shadown (Abr 27, 2009)

Mira aqui, tiene mucha información acerca de los pic, asi como links para información adicional

https://www.forosdeelectronica.com/f24/curso-tutorial-pic16f877-13694/


----------



## Guest (Abr 27, 2009)

Ese hilo ya le tengo mirado, pero lo que necesito son respuestas simples a preguntas simples, mucha parte de la base ya la tengo, lo que tambien tengo son unos huecos terribles en esa base, de ahi este tema, necesito "arrancar", no ahogarme en un mar de información, y para el que use MPLAB a diario responder estas 4 preguntas no supone ningun esfuerzo


----------



## mabauti (Abr 27, 2009)

> En concreto neceesito saber su funcionamiento basico, por ejemplo, yo escribo codigo, y ¿a que boton le doy despues?


Salvalo como asm, y luego oprime  quickbuild miarchivo.asm




> ¿en que formatos me compila?


basicamente en asm, si tienes terceros programs puedes acoplarlo (PIC C , PIC nbasic, etc.)



> ¿que formatos necesito?


elaborate please



> ¿me saca directamente un HEX?


cuando lo compilas si


----------



## Guest (Abr 27, 2009)

mabauti dijo:
			
		

> > En concreto neceesito saber su funcionamiento basico, por ejemplo, yo escribo codigo, y ¿a que boton le doy despues?
> 
> 
> Salvalo como asm, y luego oprime  quickbuild miarchivo.asm
> ...



Wuo wuo! mil gracias!

Mas dudas: 

"¿que formatos necesito?" Quiero decir, se supone que es el HEX el que mando al icprog, pero ¿necesito algun otro formato?, ademas, cuando lo he compilado me han salido como 4 archivos mas ¿para que son?


¿porque me pide un .err un .cod y no se que mas si abro un asm que no he echo yo?

¿como puedo hacer para que me marque colores (estos colorines para discriminar funciones facilmente) antes de guardar en asm?

¿para que sirve la ventana pequeña llamada "unlited workspace"?

¿como es eso de PIC C? ¿puedo programar directamente en C y me saca el HEX?


----------



## marco_chip (Abr 28, 2009)

Hola a todos , le cuento que soy nuevo en el tema y estaba buscando información de como escribir el programa en mplab v7.40 ( algunos ejemplos simples como prender un led) porque la verdad hice un curso hace un año aprox y no me acuerdo mucho, por ejemplo , el programa se escribia en "program memory" pero despues no me acuerdo como era para ver si tenia errores y todo eso.
Desde ya les agradezco y espero sus respuestas, gracias! (x ahora)


----------



## Guest (Abr 28, 2009)

marco_chip dijo:
			
		

> Hola a todos , le cuento que soy nuevo en el tema y estaba buscando información de como escribir el programa en mplab v7.40 ( algunos ejemplos simples como prender un led) porque la verdad hice un curso hace un año aprox y no me acuerdo mucho, por ejemplo , el programa se escribia en "program memory" pero despues no me acuerdo como era para ver si tenia errores y todo eso.
> Desde ya les agradezco y espero sus respuestas, gracias! (x ahora)



Abri el tema para mi y pensando en gente como tu, la vedad, con las instrucciones ya dadas me ha funcionado bien, no se que no has pododo entender. para mirar si has echo algo mal, solo se que te dize que no ha podido construir, ahora, donde esta el error ya no lo se.


----------



## Guest (Abr 28, 2009)

Nueva duda con un programa, bueno, pues usando un programa del otro hilo que he abierto: https://www.forosdeelectronica.com/f24/ejercicios-simulacion-entrenamiento-pic-16f870-20042/ decidi hacerme uno simple para ir viendo, me hize este:


```
;
;Control de los leds RB0 y RB1 desde el interruptor RC0. RB0 refleja el estado de RC0,
;RB1 el complemento de RC0
		
		List	p=16F870		;Tipo de procesador
		include	"P16F870.INC"	;Definiciones de registros internos

		ORG	0xB0

Inicio	        clrf 	PORTB		;Borra los latch de salida
		bsf	STATUS,RP0	;Selecciona banco 1
		clrf	TRISB		;Puerta B se configura como salida
		movlw	0xFF
		movwf	TRISC		;Puerta C se configura como entrada
		bcf	STATUS,RP0	;Selecciona banco 0

Loop		clrwdt			;Refresca el WDT timer
		btfsc	PORTC,0		;RC0 = 1 ?
		goto	RC0_es_1	;Si
		bcf	PORTB,0		;No, desconecta RB0
		bsf	PORTB,1		;Conecta RB1
		goto	Loop		;Buble sin fin

RC0_es_1	bsf	PORTB,0		;Activa RB0
		bcf	PORTB,1		;Activa RB1
		goto	Loop		;Bucle sin fin

              end
```
Basicamente enciende un led si un interruptor esta activado, y si esta desactivado lo apaga y enciende otro, todo listo le hize esta modificacion para que me encendiese otros leds con otro interruptor a la par:


```
;
;Control de los leds RB0 y RB1 desde el interruptor RC0. RB0 refleja el estado de RC0,
;RB1 el complemento de RC0
		
		List	p=16F870		;Tipo de procesador
		include	"P16F870.INC"	;Definiciones de registros internos

		ORG	0xB0

Inicio	        clrf 	PORTB		;Borra los latch de salida
		bsf	STATUS,RP0	;Selecciona banco 1
		clrf	TRISB		;Puerta B se configura como salida
		movlw	0xFF
		movwf	TRISC		;Puerta C se configura como entrada
		bcf	STATUS,RP0	;Selecciona banco 0

Loop		clrwdt			;Refresca el WDT timer
		btfsc	PORTC,0		;RC0 = 1 ?
		goto	RC0_es_1	;Si
		bcf	PORTB,0		;No, desconecta RB0
		bsf	PORTB,1		;Conecta RB1
		goto	Loop		;Buble sin fin

RC0_es_1	bsf	PORTB,0		;Activa RB0
		bcf	PORTB,1		;Activa RB1
		goto	Loop		;Bucle sin fin

Loop2		clrwdt			;Refresca el WDT timer
		btfsc	PORTC,1		;RC1 = 1 ?
		goto	RC1_es_1	;Si
		bcf	PORTB,2		;No, desconecta RB2
		bsf	PORTB,3		;Conecta RB3
		goto	Loop2		;Buble sin fin

RC1_es_1	bsf	PORTB,2		;Activa RB2
		bcf	PORTB,3		;Activa RB3
		goto	Loop2		;Bucle sin fin

		end			;Fin del programa fuente
```

Peeero no funciona, se me queda encendido siempre un led, y el segundo opera en funcion al primer interruptor, y el segundo interruptor no haze nada, los leds adicionales previstos no encienden.

¿alguien me puede indicar el error cometido?


----------



## marco_chip (Abr 28, 2009)

Gracias Hemp por contestar , pero he aqui una de mis grandes dudas: ¿porque el programa esta escrito en codigo fuente? ¿no se puede escribir en "program memory"? (en mplab) porque asi es como me enseñaron en el curso . ¿sera que es mas complicado?


----------



## Vegetal Digital (Abr 28, 2009)

sobre los .err .cod no se para que estan, no son necesarios (capaz que los use el mplab por las dudas no los borres).

Ic prog usa solamente el .hex

Para que te marque con colores y todo re bonito tenes que agregar el archivo al proyecto
(Proyect->Add files to proyect y seleccionas el asm(c en mi caso ))
Despues vas a view->proyect y en source files seleccionas el archivo
ahora te pinta todo
Al menos yo hago asi, hay que aclarar que yo uso ccs y quiza no sirva con ensamblador

Por ultimo:
un programa en C necesita ser compilado y necesito un programa aparte que ejecuta el mplab
con ensamblador no necesite nada, le di a un botoncito que decia make y me iso el .hex

Espero que te sirva...


----------



## diego_z (Abr 28, 2009)

Hemp dijo:
			
		

> Nueva duda con un programa, bueno, pues usando un programa del otro hilo que he abierto: https://www.forosdeelectronica.com/f24/ejercicios-simulacion-entrenamiento-pic-16f870-20042/ decidi hacerme uno simple para ir viendo, me hize este:
> 
> 
> ```
> ...


bueno lo primero es que empiesas en la direccion 0xb0 y por lo menos a mi no me lo simula si en 0x00
segundo detalle no apagas todo el puerto b antes de empezar con el programa principal y tercero a esta rutina

```
Loop2      clrwdt         ;Refresca el WDT timer 
                btfsc   PORTC,1      ;RC1 = 1 ? 
               goto   RC1_es_1   ;Si 
      bcf   PORTB,2      ;No, desconecta RB2 
      bsf   PORTB,3      ;Conecta RB3 
      goto   Loop2      ;Buble sin fin
```
 nunca llega el programa no pasa  por no llamarla en ningun momento distinto seria si en loop haces un call a loop2


pdta no me estas cargando no?


----------



## Guest (Abr 29, 2009)

diego_z dijo:
			
		

> bueno lo primero es que empiesas en la direccion 0xb0 y por lo menos a mi no me lo simula si en 0x00
> segundo detalle no apagas todo el puerto b antes de empezar con el programa principal y tercero a esta rutina
> 
> ```
> ...



Primero de todo, gracias por atenderme. Ire por partes:


> bueno lo primero es que empiesas en la direccion 0xb0 y por lo menos a mi no me lo simula si en 0x00



Supongo que querras decir: "bueno lo primero es que empiesas en la direccion 0xb0 y por lo menos a mi no me lo simula si *no esta* en 0x00" solo que no entiendo que es eso de 0xb0 y 0x00



> segundo detalle no apagas todo el puerto b antes de empezar con el programa principal


No se ni como apagarlo ni para que sirve apagarlo.

El tercer punto ya le consegui entender, he estado probando, mando al loop2 desde el loop, y al final de loop2 mando a loop, solo que no consigo el efecto deseado, consigo hacer una especie de compuerta and, tendre que estudiar un poco la parida que hize, te la posteo por si te guia:


```
;
;Control de los leds RB0 y RB1 desde el interruptor RC0. RB0 refleja el estado de RC0,
;RB1 el complemento de RC0
		
		List	p=16F870		;Tipo de procesador
		include	"P16F870.INC"	;Definiciones de registros internos

		ORG	0xB0

Inicio	        clrf 	PORTB		;Borra los latch de salida
		bsf	STATUS,RP0	;Selecciona banco 1
		clrf	TRISB		;Puerta B se configura como salida
		movlw	0xFF
		movwf	TRISC		;Puerta C se configura como entrada
		bcf	STATUS,RP0	;Selecciona banco 0

Loop		clrwdt			;Refresca el WDT timer
		btfsc	PORTC,0		;RC0 = 1 ?
		goto	RC0_es_1	;Si
		bcf	PORTB,0		;No, desconecta RB0
		bsf	PORTB,1		;Conecta RB1
		goto	Loop2		;Buble sin fin

RC0_es_1	bsf	PORTB,0		;Activa RB0
		bcf	PORTB,1		;Activa RB1
		goto	Loop		;Bucle sin fin

Loop2		clrwdt			;Refresca el WDT timer
		btfsc	PORTC,1		;RC1 = 1 ?
		goto	RC1_es_1	;Si
		bcf	PORTB,2		;No, desconecta RB2
		bsf	PORTB,3		;Conecta RB3
		goto	Loop		;Buble sin fin

RC1_es_1	bsf	PORTB,2		;Activa RB2
		bcf	PORTB,3		;Activa RB3
		goto	Loop2		;Bucle sin fin

		end			;Fin del programa fuente
```



> pdta no me estas cargando no?


 Si por cargando quieres decir entendiendo, no mucho la verdad; si te refieres a cargarlo en el pic, pues si, es la unica forma de testarlo puesto que no se emularlo.


----------



## Guest (Abr 29, 2009)

marco_chip dijo:
			
		

> Gracias Hemp por contestar , pero he aqui una de mis grandes dudas: ¿porque el programa esta escrito en codigo fuente?


No soy un experto, pero diria que si no lo escribes en codigo fuente... no se en que otra cosa lo puedes escribir.



			
				marco_chip dijo:
			
		

> ¿no se puede escribir en "program memory"? (en mplab) porque asi es como me enseñaron en el curso . ¿sera que es mas complicado?



Lo lamento, no se que es program memory


----------



## Guest (Abr 29, 2009)

Vegetal Digital dijo:
			
		

> sobre los .err .cod no se para que estan, no son necesarios (capaz que los use el mplab por las dudas no los borres).
> 
> Ic prog usa solamente el .hex
> 
> ...



En proyect->add files  no me sale "highligth" (remarcado) no puedo selecionarlo, y no encuentro view->proyect.


----------



## Meta (Abr 29, 2009)

Hemp dijo:
			
		

> Bueno, reslta que he olvidado TODO lo que aprendi sobre programacion de pics, y resulta frustrante puesto que llege a hacer casi un game of life en 1D, hace algun tiempo cambie de SO y ayer me baje el MPLAB a ver si el WINe me lo movia, al final con buenos resultados, sin embargo y por desgracia me di cuenta que ya no tenia ni puta idea de usar el mplab.
> 
> En concreto neceesito saber su funcionamiento basico, por ejemplo, yo escribo codigo, y ¿a que boton le doy despues? ¿en que formatos me compila? ¿que formatos necesito? ¿me saca directamente un HEX?
> 
> ...



Estoy aprendiendo con el libro http://www.pic16f84a.org/ 

Es lo mejor para empezar y hacer maravillas.

http://www.ra-ma.es/libros/MICROCONTROLADOR-PIC16F84/2504/978-84-7897-917-2







Prueba de ellos en:
http://www.youtube.com/metaconta

Saludo.


----------



## diego_z (Abr 29, 2009)

Meta dijo:
			
		

> Estoy aprendiendo con el libro http://www.pic16f84a.org/
> 
> Es lo mejor para empezar y hacer maravillas.
> 
> ...


si el libro es muy bueno , pero tiene la contra que te da todo echo y si sos comodo no te da la posibilidad de aprender  todos los recursos del pic , ya que en las librerias esta todo echo ,


----------



## Meta (Abr 29, 2009)

Lo que te da todo hecho es para aprender de él. Si eres cómodo y no lo haces tu, el problema eres tu, no el libro.


----------



## diego_z (Abr 29, 2009)

Hemp dijo:
			
		

> Supongo que querras decir: "bueno lo primero es que empiesas en la direccion 0xb0 y por lo menos a mi no me lo simula si *no esta* en 0x00" solo que no entiendo que es eso de 0xb0 y 0x00


imaginate esto , te mandan a hacer compras , primero a la ferreteria de pedro a comprar un tornillo que esta en la direccion 0x00 despues a la de jose a buscar una tuerca para ese tornillo que esta en la direccion 0x0b si vas primero a lo jose como vas a saber que tuerca comprar , algo parecido ocurre aca , primer direccion de memoria asignada para escribir el codigo es la 0x00 por eso pones 

```
org 0x00 y empiezas a escribir en caso que desees usar interrupciones debes poner 
org 0x00  
goto empieza 
0x04 ; direccion de interrupciones 
codigo
codigo
codigo
empieza ; escribes tu codigo 
ya que si no harias asi solo tendrias solo 3 o 4  lineas para escribir codigo entre 0x00 y 0x04, empieza lo puedes poner en cualquier direccion
```



> No se ni como apagarlo ni para que sirve apagarlo.


lo borras o apagas con clrf puerto , o bcf bit depende lo que necesites , debes apagarlo ya que a veces si no lo haces un bit de un determinado puerto al iniciar el micro puede quedar en alto , imagina una prensa que al encendrla empieze a bajar el bastago sin control ! seria un desastre caro


> El tercer punto ya le consegui entender, he estado probando, mando al loop2 desde el loop, y al final de loop2 mando a loop, solo que no consigo el efecto deseado, consigo hacer una especie de compuerta and, tendre que estudiar un poco la parida que hize, te la posteo por si te guia:.


puedes hacerlo asi o incluir tu rutina en el programa principal por ej 

```
;
Loop		clrwdt			;Refresca el WDT timer
		btfsc	PORTC,0		;RC0 = 1 ?
		goto	RC0_es_1	;Si
		bcf	PORTB,0		;No, desconecta RB0
		bsf	PORTB,1		;Conecta RB1
		btfsc	PORTC,1		;RC1 = 1 ?
		goto	RC1_es_1	;Si
		bcf	PORTB,2		;No, desconecta RB2
		bsf	PORTB,3		;Conecta RB3
		goto	Loop		;Buble sin fin
```



> Si por cargando quieres decir entendiendo, no mucho la verdad; si te refieres a cargarlo en el pic, pues si, es la unica forma de testarlo puesto que no se emularlo .


lo digo por lo que dices en el primer post y me parece improbable que no te acuerdes ni como se borra un puerto jeje
hay unos videos que hizo leon elec , que me ayudaron un monton


----------



## diego_z (Abr 29, 2009)

Meta dijo:
			
		

> Lo que te da todo hecho es para aprender de él. Si eres cómodo y no lo haces tu, el problema eres tu, no el libro.


yo dije lo contrario ?


----------



## Guest (Abr 29, 2009)

diego_z dijo:
			
		

> Hemp dijo:
> 
> 
> 
> ...



No entendi muy bien el simil, perdona.



			
				diego_z dijo:
			
		

> > No se ni como apagarlo ni para que sirve apagarlo.
> 
> 
> lo borras o apagas con clrf puerto , o bcf bit depende lo que necesites , debes apagarlo ya que a veces si no lo haces un bit de un determinado puerto al iniciar el micro puede quedar en alto , imagina una prensa que al encendrla empieze a bajar el bastago sin control ! seria un desastre caro
> ...


Wow, no se me ocurrio esa forma, hoy me he llevado la PDA y he estado estudiandolo en el autobus, le encontre solucion, pero mas compleja:

```
;
;Control de los leds RB0 y RB1 desde el interruptor RC0. RB0 refleja el estado de RC0,
;RB1 el complemento de RC0
		
		List	p=16F870		;Tipo de procesador
		include	"P16F870.INC"	;Definiciones de registros internos

		ORG	0xB0

Inicio	        clrf 	PORTB		;Borra los latch de salida
		bsf	STATUS,RP0	;Selecciona banco 1
		clrf	TRISB		;Puerta B se configura como salida
		movlw	0xFF
		movwf	TRISC		;Puerta C se configura como entrada
		bcf	STATUS,RP0	;Selecciona banco 0

Loop		clrwdt			;Refresca el WDT timer
		btfsc	PORTC,0		;RC0 = 1 ?
		goto	RC0_es_1	;Si
		bcf	PORTB,0		;No, desconecta RB0
		bsf	PORTB,1		;Conecta RB1
		goto	Loop2		;Buble sin fin

RC0_es_1	bsf	PORTB,0		;Activa RB0
		bcf	PORTB,1		;Activa RB1
		goto	Loop2		;Bucle sin fin

Loop2		clrwdt			;Refresca el WDT timer
		btfsc	PORTC,1		;RC1 = 1 ?
		goto	RC1_es_1	;Si
		bcf	PORTB,2		;No, desconecta RB2
		bsf	PORTB,3		;Conecta RB3
		goto	Loop		;Buble sin fin

RC1_es_1	bsf	PORTB,2		;Activa RB2
		bcf	PORTB,3		;Activa RB3
		goto	Loop		;Bucle sin fin

		end			;Fin del programa fuente
```

Sin embargo le escribi de esta forma que no me ha dejado compilar, a ver si puedes decirme porque:

```
List	p=16F87
	incluide	"P16F87.INC"

	ORG	0xb0

Inicio	clrf	PORTB
		bsf	STATUS,RP0
		clrf	TRISB
		movlw	0xFF
		movwf	TRISC
		bcf	STATUS,RP0

Loop1	clrwdt
		btfsc PORTC,0
		goto SubLoop1
		bcf PORTB,0
		bsf PORTB,1
		goto Loop2

SubLoop1	bsf PORTB,0
		bcf PORTB
		goto Loop2

Loop2 clrwdt
		btfsc PORTC,1
		goto SubLoop2
		bcf PORTB,2
		bsf PORTB,3
		goto Loop1 

SubLoop2	bsf PORTB,2
		bcf PORTB,3
		goto Loop1 

		end
```

Ahora cuando vuelva del gimnasio probare tu metodo, aunque solo sea por aprender, el mio he comprobado que funciona. ¿que diferencia hay entre ambos, cual es mejor y porque?



			
				diego_z dijo:
			
		

> > Si por cargando quieres decir entendiendo, no mucho la verdad; si te refieres a cargarlo en el pic, pues si, es la unica forma de testarlo puesto que no se emularlo .
> 
> 
> lo digo por lo que dices en el primer post y me parece improbable que no te acuerdes ni como se borra un puerto jeje
> hay unos videos que hizo leon elec , que me ayudaron un monton



Lo hize copipasteando como ahora y no funcionaba del todo. ¿me puedes pasar la url de esos videos?


----------



## Guest (Abr 29, 2009)

Meta dijo:
			
		

> Hemp dijo:
> 
> 
> 
> ...



mmm... Gracias, parece efectivo   Me lo pasare a la PDA para leermelo mañana a cachos en el autobus.


----------



## diego_z (Abr 29, 2009)

leon elec es un integrante de este foro y tambien lo e visto en otro foro que es donde estan los videoshttp://www.todopic.com.ar/foros/index.php?topic=19177.0aca tenes algo bueno en este mismo foro https://www.forosdeelectronica.com/about28343.html


----------



## Sojue (Jul 24, 2013)

necesito algún manual en español que me de a conocer la función de cada una de las condiciones, yo se que hay varias fuentes de lenguajes pues me gustaría que me proporcionaran del tipo de lenguaje que se utiliza en este ejemplo ya que esa es la que estoy viendo en clase. 
ha qui estoy utilizando el pic 16f628a

trisa=%00000000
trisb=%00000000
porta=0
portb=0
inicio:
 portb.0=1
 pause 1000
 portb.0=0
 pause 1000
goto inicio
end ...


----------



## emz102009 (Sep 30, 2014)

Hola tengo una duda sobre si existe un comando que realice lo siguiente, uso el pic16f628, para encender dos leds del puerto B uso la siguiente instrucción. 

INICIO
    btfss   PORTA, 0    
    GOTO    ENAP     
    bSf     PORTB,0        
    bSf     PORTB,1
    GOTO    INICIO 

ENAP
    bCf     PORTB,0         ;Apagar Led
    bCf     PORTB,1
    GOTO    INICIO

    END             ;Fin de Programa



Mi duda es si puedo omitir esto:

  bSf     PORTB,0        
  bSf     PORTB,1

a qui uso dos lineas para encender dos led, quisiera saber si hay un comando donde solo utilice una linea para encender los dos led para a si no utilizar estas dos lineas. ...


----------



## Miembro eliminado 356005 (Sep 30, 2014)

```
movlw    B'00000011'	; indicamos en binario la disposición de los LED
    movwf    PORTB
```


----------

