Mi primer programa de led con pic 16f84

poroto2009 dijo:
Meta dijo:

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?

Y en Hex es el 0x1F.

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

¿En qué sentido te refieres setear? ¿Introducir cualquier valor?

Disculpen que sea tan simple la consulta es que estoy aprendiendo

Preguntar significa persona que quiere aprender...

Gracias
 
Meta dijo:
poroto2009 dijo:
Meta dijo:

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?

Y en Hex es el 0x1F.

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

¿En qué sentido te refieres setear? ¿Introducir cualquier valor?

Disculpen que sea tan simple la consulta es que estoy aprendiendo

Preguntar significa persona que quiere aprender...

Gracias



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
 
Aquí ves soluciones en archivo adjunto.

Código:
;********************************* 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.
 

Adjuntos

  • pic_ejercicio_1_04_133.pdf
    50.4 KB · Visitas: 75
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...
 
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.

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...


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?
 
El ejemplo puede ser este el que buscas.

Código:
; 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.
 
Meta dijo:
El ejemplo puede ser este el que buscas.

Código:
; 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.

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

	goto 	Principal			; Crea un bucle cerrado.



	END							; Fin del programa.

Saludo.


Excelenteee ya estoy entendiendo.
Muchisimas Graciias
 
- 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.
 
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)

Código:
#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
		}
	}
}
 
¿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.
 
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"16F84ATMPo_O" /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??'
 
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.

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 :rolleyes:

Muchas gracias por su ayuda
 
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!
 
Suponiendo que no queremos una precisión máxima, podríamos hacer lo siguiente:

  1. Repetir 25 veces
    1. Cambiar el estado del LED
      1. Leer el valor del puerto
      2. Invertir el valor (negación binaria)
      3. Poner el nuevo valor
    2. Hacer una espera de 200 ms
  2. 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:

  1. Inicializar la variable a 0
  2. Repetir 25 veces
    1. Cambiar el estado del LED
      1. Dar al LED el valor de la variable
      2. Invertir el valor de la variable (negación binaria)
    2. Hacer una espera de 200 ms
  3. Apagar LED
 
Última edición por un moderador:
Atrás
Arriba