# Mi primer programa de led con  pic 16f84



## poroto2009 (Jul 6, 2009)

Estoy fascinado con el mundo del pic, realice mi primer proyecto el "hola mundo" del pic o sea encender un led, por lo que veo la señal se activa pero no le da tension, me pueden ayudar la verdad es que no encuentro el error?

les envio los fuentes  

Muchas gracias por su ayuda


----------



## blackpic (Jul 7, 2009)

bueno amigo en tu circuito lo que tienes que hacer es ponerle una tierra al circuito (GND) y veras como funciona ah y otra cosa siempre recuerda que los pic solo trabajan con una alimentacion de 5v si los pasas de hay los quemas, ten muy presente eso............

espero haver ayudado en algo..........


----------



## elosciloscopio (Jul 7, 2009)

En que idioma programas?


----------



## poroto2009 (Jul 7, 2009)

elosciloscopio dijo:
			
		

> En que idioma programas?



Esta en asembler, pero me parece que el problema viene por el lado del circuito, lo estoy probando con proteus.

Gracias


----------



## arubaro22 (Jul 7, 2009)

poroto, yo no he tenido buenos resultados simulando PIC en proteus, fijate si puedes conseguir el PIC SIMILATOR IDE, es una herrramienta muy util para probar nuestros programas de pic


----------



## Vick (Jul 7, 2009)

1. Si le pones 12V a un PIC16F84A lo vas a freir en cuanto enciendas la fuente (aunque en el simulador funcione)...

2. En Proteus no necesitas poner el cristal, el simulador genera la señal de reloj de forma automática.

3. Ve a las propiedades del PIC y ajusta la frecuencia del oscilador.

4. Como ya te dijeron te falta un símbolo de tierra y vas a ver como si funciona.


----------



## poroto2009 (Jul 7, 2009)

Gracias  a todos por sus aportes, realmente los necesito.

Muchas Gracias Nuevamente


----------



## Meta (Jul 7, 2009)

Vick dijo:
			
		

> 1. Si le pones 12V a un PIC16F84A lo vas a freir en cuanto enciendas la fuente (aunque en el simulador funcione)...



En cualquier PIC. Los de 16 y 32 bits no tengo idea de cuanta tensión son.


----------



## rednaxela (Jul 7, 2009)

Solo un consejo alimenta tu PIC con un cargargador de celular cualquiera pero de 5v, para pruebas que no demanden mucha corriente, esto evitara que se te queme el PIC por si conectas mal la alimentación o si haces algún corto, a mí me salvo de muchas quemadas   .


----------



## Vegetal Digital (Jul 7, 2009)

Probe tu circuito y anda bien, eso creo. Probe con una simulacion mía y anda bien, no tiene los reguladores 78xx, no son necesarios.
Cuando RA0 esta en 0 el pin RB0 genera una onda cuadrada.

Te mando el archivo para que pruebes...

PD: cambiale la velocidad al micro para que ande a 4mhz y no a 1mhz.

Saludos


----------



## Vegetal Digital (Jul 7, 2009)

Mira, grabe tu programa (el hex porque yo programo en C) y lo filme para que veas que anda.
El pic esta tapado por un adaptador para protoboard que yo cree para grabar el micro con ICSP.
La camara es mala, de mi celular y no se alcanza a ver el parpadeo, pero funciona muy bien!
http://www.youtube.com/watch?v=Wq2AAJglPzw


Saludos


----------



## poroto2009 (Jul 7, 2009)

Vegetal Digital dijo:
			
		

> Mira, grabe tu programa (el hex porque yo programo en C) y lo filme para que veas que anda.
> El pic esta tapado por un adaptador para protoboard que yo cree para grabar el micro con ICSP.
> La camara es mala, de mi celular y no se alcanza a ver el parpadeo, pero funciona muy bien!
> http://www.youtube.com/watch?v=Wq2AAJglPzw
> ...



Excelente muchas gracias Vegetal Digital, te hago una consulta con que programa programas en C ya que me resultaria mucho mas facil en C ya que lo conozco bastante.


Gracias por tu ayuda


----------



## Vegetal Digital (Jul 7, 2009)

Creo que te referis al compilador:
Yo uso ccs, también esta el hitech (o algo así) pero nunca lo use...
Saludos


----------



## Meta (Jul 7, 2009)

Con el MPLAB v8.33 el c se llama C18.

http://www.ucontrol.com.ar/forosmf/programacion-en-c/tutorial-mplab-c18-desde-0/

Saludo.


----------



## rednaxela (Jul 7, 2009)

También puedes "fusionar" el MPLAB con el PIC-C para que puedas depurar tus programas ya que de por si solo el PIC-C no lo puede hacer, bueno al menos la versión que se descarga gratis.


----------



## Vick (Jul 7, 2009)

Meta dijo:
			
		

> Vick dijo:
> 
> 
> 
> ...



El PIC16F84A soporta un máximo de 7.5V de alimentación con 12V lo mandas al cielo de los PICs, la tendencia es reducir cada vez más los voltajes de alimentación para ahorrar energía y permitir aplicaciones con baterías de forma más fácil, para los PICs de 16 bits la alimentación es de entre 1.8 y 3.6V:

http://www.microchip.com/ParamChartSearch/chart.aspx?branchID=8181&mid=14&lang=en&pageId=75

Y soportan un máximo de 5V (esto lo investigue por curiosidad nunca he manejado PICs de 16 y mucho menos de 32 bits, hasta ahora...)

Si estas comenzando con el PIC16F84A no temetas aún con C, primero metele al ensamblador, es más eficiente, al menos para programas cortos y PICs con poca memoria de programa, ya que conozcas bien el ensamblador y avances a PICs con más memoria entonces ya dale al C. Yo siempre he preferido programar en ensamblador, no me parece que sea tan dificil...

Saludos.


----------



## Meta (Jul 7, 2009)

Tengo una ganas de hecha la mano a los PIC32, en ASM me han contado que es un autentico quebradero de cabeza, si estoy acostumbrado a los de 8 Bit, olvidarse.

Con C dicen que es fácil, muy fácil y rápdio. Haber si alguien traducen o hacen un libro en español. Se que la revista Resistor hay tutoriales de ello que hacen cada dos meses.

















www.mypic32.com

Saludo.


----------



## poroto2009 (Jul 8, 2009)

Estimados muchas gracias por sus aportes ,les hago una consulta mas basica aun, se puede utilizar el pin ra4 como entrada? segun lei si pero les pregunto a ustedes que saben, es para representar este numero :

si pongo a positivo  ra0 + ra1 +ra2 +ra3 +ra4 obtengo este numero cierto?

11111

Gracias


----------



## Meta (Jul 8, 2009)

Sí,


----------



## poroto2009 (Jul 8, 2009)

Meta dijo:
			
		

> Sí,



Ok , si pongo a positivo  ra0 + ra1 + ra2+ ra3 + ra4  obtengo 11111 el cual en decimal es 31, es el munero maxiomo que puedo ingresar? o se puede utilizar un rb0 como entrada tambien?

Consulta ,como seteo una variable dentro del pic  con ese numero?

Disculpen que sea tan simple la consulta es que estoy aprendiendo

Gracias


----------



## Meta (Jul 8, 2009)

poroto2009 dijo:
			
		

> Meta dijo:
> 
> 
> 
> ...


----------



## poroto2009 (Jul 8, 2009)

Meta dijo:
			
		

> poroto2009 dijo:
> 
> 
> 
> ...





claro, declaro una variable llamada posicion_actual

y en esa variable quiero almacenar el numero obtenido por las entradas  (positivo ra0 + ra1 + ra2+ ra3 + ra4  =11111 = 31 =  0x1F)

se entendio?

Gracias amigo


----------



## Meta (Jul 8, 2009)

Aquí ves soluciones en archivo adjunto.


```
;********************************* Aritmética_01.asm ************************************
;
;	===================================================================
;	  Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;	  E. Palacios, F. Remiro y L. López.		www_pic16f84a_org
; 	  Editorial Ra-Ma.  www_ra-ma_es
;	===================================================================
;
; Programa para comprobar el funcionamiento de los operandos UPPER, HIGH y LOW. Para ello:
; - En la primera línea del LCD se visualiza un número de dos bytes.
; - En la segunda línea del LCD se visualiza un número de tres bytes.
;
; ZONA DE DATOS *************************************************************************

	LIST		P=16F84A
	INCLUDE		<P16F84A.INC>
	__CONFIG	_CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

	CBLOCK	0x0C
	ENDC

NUMERO_A	EQU	0x1B3C					; Por ejemplo este número de dos bytes.
NUMERO_B	EQU	0xF85ACB				; Por ejemplo este número de tres bytes.

; ZONA DE CÓDIGOS ***********************************************************************

	ORG 	0
Inicio
	call	LCD_Inicializa
	call	LCD_Linea1				; Coloca el cursor al principio de la pantalla.
	movlw	HIGH NUMERO_A			; El operador HIGH extrae el byte alto de 
	call	LCD_Byte				; de dos.
	movlw	LOW NUMERO_A			; El operador LOW extrae el byte más bajo de 
	call	LCD_ByteCompleto		; dos.
	call	LCD_Linea2				; Coloca el cursor al principio de la segunda línea.
	movlw	UPPER NUMERO_B			; El operador UPPER extrae el byte más alto de 
	call	LCD_Byte				; tres.
	movlw	HIGH NUMERO_B			; El operador HIGH extrae el byte medio de 
	call	LCD_ByteCompleto		; tres.
	movlw	LOW NUMERO_B			; El operador LOW extrae el byte más bajo de 
	call	LCD_ByteCompleto		; tres.
	sleep							; Pasa a modo de bajo consumo.

	INCLUDE	<RETARDOS.INC>
	INCLUDE	<LCD_4BIT.INC>
	END
	
;	===================================================================
;	  Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;	  E. Palacios, F. Remiro y L. López.		www_pic16f84a_org
; 	  Editorial Ra-Ma.  www_ra-ma_es
;	===================================================================
```

Si quieres aprender de verdad...

http://www.pic16f84a.org/

Saludo.


----------



## Vick (Jul 8, 2009)

Si te refieres a almacenar en algún registro el dato leido por el Puerto A, es bastante simple, depués de haber configurado el puerto como entrada simplemente lees los datos:

movf PORTA, W ;Lee los datos del Puerto A y lo pasa a W.
movwf posicion_actual ;Pasa el contenido de W al registro que le indiques.

Eso es todo...

Con respecto a tu pregunta de si puedes usar RA4 como entrada... SI, como cualquier otro pin de los puertos, el detalle está cuando lo usas como salida, ese pin es de drenador abierto, como entrada no hay problema, pero si lo necesitas usar como salida debes colocarle un resistor de pull-up.

Suerte...


----------



## poroto2009 (Jul 8, 2009)

Vick dijo:
			
		

> Si te refieres a almacenar en algún registro el dato leido por el Puerto A, es bastante simple, depués de haber configurado el puerto como entrada simplemente lees los datos:
> 
> movf PORTA, W ;Lee los datos del Puerto A y lo pasa a W.
> movwf posicion_actual ;Pasa el contenido de W al registro que le indiques.
> ...




Ahhhh ahora sii, yo no sabia que si hacia PORTA leia todas las entradas juntas


ok entoces :

puertoA equ d'5'
puertoB equ d'6'

si inicio el programa y hago
movlw b'00000'
tris puertoA
movlw b'11111111'
tris puertoB

hasta aca configure todos los a como salida y los b como entrada cierto?

si  rb0 , rb1 y rb3  los pongo en positivo y hago

movf PORTB, W 

en W  me deberia quedar 00001011 no ?

es correcto?


----------



## Meta (Jul 8, 2009)

El ejemplo puede ser este el que buscas.


```
; 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

Inicio							; programa.

	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 y lo almacena en W.

	movwf	PORTB				; El contenido de W se visualiza por el Puerto B.

	goto 	Principal			; Crea un bucle cerrado.



	END							; Fin del programa.
```

- Si en el puerto a has introducido b'00010001' (mofv PORTA, W), se alamcena en W.

- Los datos almacenados en W que es el b'00010001', (movwf	PORTB), mueve los datos de almacenados en W al PORTB y te lo muestra, así y vuelta empezar.

Saludo.


----------



## poroto2009 (Jul 8, 2009)

Meta dijo:
			
		

> El ejemplo puede ser este el que buscas.
> 
> 
> ```
> ...




Excelenteee    ya estoy entendiendo.
Muchisimas Graciias


----------



## Meta (Jul 8, 2009)

- Si en el puerto a has introducido b'00010001' (mofv PORTA, W), se alamcena en W.

- Los datos almacenados en W que es el b'00010001', (movwf PORTB), mueve los datos de almacenados en W al PORTB y te lo muestra, así y vuelta empezar.

Si quieres datos al contrario 0 por los 1 y al revés. Utiliza la instrucción* comf*.


----------



## Vegetal Digital (Jul 8, 2009)

una idea en CCS
lo que hace es fijarse la entrada de ra0, si esta en 1 a la variable le suma 1. después va con ra1, si esta en 1 a v le suma 2. después con ra2, si esta en 1 le suma 4 a la variable...
con esta forma, si tenemos 29 (11101), va a hacer esto: suma 1 a la variable, NO suma 2, suma 4, suma , suma 16 RESULTADO v= 29

Después de obtener el valor, lo muestra por el puerto B con un monitor de leds (poco útil)


```
#bit IN0 = PORTA.0   // le ponemos un nombre a cada entrada
#bit IN1 = PORTA.1
#bit IN2 = PORTA.2
#bit IN3 = PORTA.3
#bit IN4 = PORTA.4

(...)

main
	{
	unsigned int8 	v=0;// la variable V va ser la que tenga el valor
	while(TRUE)
		{
		if(IN0)	v=v+1;
		if(IN1)      v=v+2;
		if(IN2)	v=v+4;
		if(IN3)       v=v+8;
		if(IN4)	v=v+16;

		PORTB=V;
		V=0; //reseteamos la variable
		}
	}
}
```


----------



## Meta (Jul 8, 2009)

¿No hay un método que lea los datos del puerto A en CCS y los guarde en una variable, después de esa variable o registro de trabajo lo envía al puerto B?

No he manejado CCS pero digo yo.


----------



## Vegetal Digital (Jul 8, 2009)

Sí, existe pero yo no la conozco.
Estoy buscando.


----------



## Meta (Jul 8, 2009)

Es como el ASM pero en C, debería ser más fácil.


----------



## jhony85 (Jun 9, 2010)

valdria como alimentacion del pic una pila de petaca (4.5 V)


----------



## patolucaslj83 (Ago 9, 2010)

DISCULPA META COPIE TU EJEMPLO Y me genero este error 

----------------------------------------------------------------------Debug build of project `C:\Documents and Settings\Particular\Mis documentos\mplab80\2x.mcp' started.Preprocessor symbol `__DEBUG' is defined.Mon Aug 09 23:20:02 2010----------------------------------------------------------------------Clean: Deleting intermediary and output files.Clean: Done.Executing: "C:\Archivos de programa\Microchip\MPASM Suite\MPASMWIN.exe" /q /p16F84A "2x.asm" /l"2x.lst" /e"2x.err" /o"2x.o" /d__DEBUG=1Message[302] C:\DOCUMENTS AND SETTINGS\PARTICULAR\MIS DOCUMENTOS\MPLAB80\2X.ASM 31 : Register in operand not in bank 0.  Ensure that bank bits are correct.Message[302] C:\DOCUMENTS AND SETTINGS\PARTICULAR\MIS DOCUMENTOS\MPLAB80\2X.ASM 35 : Register in operand not in bank 0.  Ensure that bank bits are correct.Executing: "C:\Archivos de programa\Microchip\MPASM Suite\MPASMWIN.exe" /q /p16F84A "C:\Archivos de programa\Microchip\MPASM Suite\Template\Object\16F84ATMPO.ASM" /l"16F84ATMPO.lst" /e"16F84ATMPO.err" /o"16F84ATMP" /d__DEBUG=1Skipping link step.  The project contains no linker script.----------------------------------------------------------------------Debug build of project `C:\Documents and Settings\Particular\Mis documentos\mplab80\2x.mcp' failed.Preprocessor symbol `__DEBUG' is defined.Mon Aug 09 23:20:13 2010----------------------------------------------------------------------BUILD FAILED


e estado probando varios programas asm con el mplab de aqui de la pagina y en todos me ha mandado ese error. como si no reconociera la instruccion del TRISA o B segun lo ponga. Me podrian ayudar es que necesito realizar un trabajo con el pic 16f84A, pero me manda ese error y por lo tanto no compila como para probarlo en el proteus. a y en otro programa que saque de uno de los foros me dice error 173, que excedi los 62 caracteres. alguien me podria ayudar o decirme a que seccion me debo meter para resolver ese tipo de problemas??'


----------



## franmoi7 (Jul 6, 2011)

Hola amigos, yo también soy bastante novato en el mundo de los microcontroladores.
Sólo he programado el pic16f676 con la placa de practicas de la universidad y ahora me veo solo con el pic y el grabador...
Leyendo los post, he sacado buenas conclusiones pero me asalta siguiente pregunta: ¿Cómo puedo ver los ficheros con extensión .DSN, qué programa necesito?, creo que es con el OrCad, pero ¿hay alguno que no sea de pago?
Muchísimas gracias.



poroto2009 dijo:


> Estoy fascinado con el mundo del pic, realice mi primer proyecto el "hola mundo" del pic o sea encender un led, por lo que veo la señal se activa pero no le da tension, me pueden ayudar la verdad es que no encuentro el error?
> 
> les envio los fuentes
> 
> Muchas gracias por su ayuda


----------



## villa86 (Sep 26, 2014)

Hola a todos, aprovecho este hilo para exponer mi duda.

Hace poco me compré un par de PIC16f84A, armé un grabador y un entrenador para el mismo. El caso es que estoy aprendiendo a programar en ensamblador y he empezado realizando programas sencillos. 

He hecho el típico programa de hacer parpadear un LED utilizando retardos anidados y ahora me gustaría saber si es posible hacer un programa en el cual un LED cambie de estado cada 200ms (por ejemplo) durante 5s. Pasado este tiempo, el LED deberá apagarse para siempre. 

No quiero el código de programación, simplemente si alguien pudiera orientarme lo agradecería, ya que no se me ocurre ni por donde empezar...

¡Gracias!


----------



## Miembro eliminado 356005 (Sep 26, 2014)

Suponiendo que no queremos una precisión máxima, podríamos hacer lo siguiente:


Repetir 25 veces
Cambiar el estado del LED
Leer el valor del puerto
Invertir el valor (negación binaria)
Poner el nuevo valor
 
Hacer una espera de 200 ms

Apagar LED
Entonces, 25 * 200 ms = 5 s (despreciando los ciclos que intervienen en el cambio del valor del LED).

Una modificación mejor sería usar una variable externa, para no tener que leer el puerto:


Inicializar la variable a 0
Repetir 25 veces
Cambiar el estado del LED
Dar al LED el valor de la variable
Invertir el valor de la variable (negación binaria)
 
Hacer una espera de 200 ms

Apagar LED


----------



## villa86 (Sep 26, 2014)

Gracias Joaquin!

Creo que entiendo por donde va la cosa. Este fin de semana intentaré implementar el programa.


----------

