# PIC 16f84A Programa basico



## maurorgonzalez (Nov 27, 2008)

Recien comienzo con este del PIC y este seria mi primer programa que deseo hechar a andar, pero me encuentro con un extraño problema..... 

el asunto esta en que al tirar el programa a correr en MPLAB, se frena sin siquiera pasar una linea, en " bsf STATUS,5 ". La cual es la primer setencia de trabajo!. (y no me tira error alguno ) por favor, ustedes me podrian ayudar?.
Mi programa es muy sencillo. Todo lo que hace es correr los leds del puerto B hacia un costado cuando pulsamos un puerto de A en particular.... segun que entrada para que lado corre. Mi intensión es que realize eso.... 

al oprimir R0 se mueve para un lado... R1 se mueven para el otro... y R2 se complementa el puerto B.


PD: El proteus me recrimina lo mismo, no avanza!... pero tampoco me da error alguno.

--------------------------------------------------------------------------------


```
list      p=16F84A           
    #include <p16F84a.inc>   

    __CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC


j equ h'11'
K equ h'12'

  org 0 ; Empieza el prog en la primera posicion libre

  ;Definiendo B

  bsf STATUS,5
  movlw b'00000000' ; cargo el registro de trabajo con 0
  movwf PORTB ; mando W=0 a tris B (0 salida, 1 entrada)definiendo
  
  bcf STATUS,5
  movlw b'00000011' ; cargo w=3
  movwf PORTB ; mando W=3 al puerto para definir el on-off dando 5v donde es 1

  ;Definiendo A

  bsf STATUS,5
  movlw b'1111111' ; cargo el registro de trabajo con 254
  movwf PORTA ; mando W=0 a tris A (0 salida, 1 entrada)definiendo
  bcf STATUS,5


  ;comienzo con un valor 0

  clrw

  ;Lectura continua del puerto A

relectura movlw PORTA
  movwf j

  btfsc j,0
  rlf j,1 ;la entrada del 0 bit rota el puerto b hacia derecha

  btfsc j,1
  rrf j,1  ;la entrada del 1 bit rota el puerto b hacia izquierda

  btfsc j,2
  comf j,1 ;la entrada del 2 bit complementa las salidas

  movwf PORTB


  goto relectura


  ;finalizacion
  end
```

---------------------------------------------------------------


----------



## coty (Nov 27, 2008)

Hola Mauro, Analizando tu código veo que no estas definiendo los puertos como entradas o salidas al parecer si lo quieres hacer pero estas enviando los datos del registro W al PORTA y B y no a los TRISA y B que es donde se realiza la configuracion de entradas o salidas.

"movwf PORTB ; mando W=0 a tris B (0 salida, 1 entrada)definiendo " 

y debes revisar la parte de las rotaciones pues estas rotando el puerto A y enviandolo al puerto B (a menos que eso sea lo que quieras hacer).

ademas te recomiendo que para seleccionar los bancos uses la directiva "banksel" pues en este PIC no es problema porque solo tiene 2 bancos pero ¿en los que tienen 4 o mas? es complicado aprenderce en que banco estan los registros. yo lo hice funcionar pero la idea no es hacertelo ¿no?. cualquier duda me comentas.


----------



## pic-man (Nov 27, 2008)

Hola, tu programa tiene algunas omisiones, le hice algunos cambios para que funcione bien, pero de todas formas eso no explica por qué no podías compilar tu programa y por qué no te marcaba ningún error. Este código funciona:
	
	



```
list p=16F84A 
#include <p16F84a.inc> 

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC 


j equ h'11' 
k equ h'12' 

org 0 ; Empieza el prog en la primera posicion libre 

;Definiendo B 
	bsf		STATUS,5 
	movlw	b'00000000' ; cargo el registro de trabajo con 0 
	movwf	PORTB ; mando W=0 a tris B (0 salida, 1 entrada)definiendo 

	bcf		STATUS,5 
	movlw	b'00000011' ; cargo w=3 
	movwf	PORTB ; mando W=3 al puerto para definir el on-off dando 5v donde es 1 

;Definiendo A 
	bsf		STATUS,5 
	movlw	b'1111111' ; cargo el registro de trabajo con 254 
	movwf	PORTA ; mando W=0 a tris A (0 salida, 1 entrada)definiendo 
	bcf		STATUS,5 


;comienzo con un valor 1
	movlw	b'00000001'
	movwf	k

;Lectura continua del puerto A 

relectura	
	movf	PORTA,w 
	movwf	j 

	btfsc	j,0 
	rlf		k,1 ;la entrada del 0 bit rota el puerto b hacia derecha 

	btfsc	j,1 
	rrf		k,1 ;la entrada del 1 bit rota el puerto b hacia izquierda 

	btfsc	j,2 
	comf	j,1 ;la entrada del 2 bit complementa las salidas 

	movf	k,0
	movwf	PORTB 

goto relectura 


;finalizacion 
end
```
 coty, no hace falta que utilice los nombres TRISA y TRISB ya que cuando hace el cambio al registro 1 (con ese bsf STATUS,5) da igual si usa PORTB o TRISB ya que ambos nombres corresponden al valor 0x06, por lo que si esta configurando los puertos como entrada y salida.

mauro prueba el código y observa los cambios que le hice.


----------



## coty (Nov 27, 2008)

Gracias Pic-man por la aclaración no lo sabia,


----------



## maurorgonzalez (Nov 28, 2008)

Me llama la atensión que me hallas arreglado lo sig: 

relectura   
   movf   PORTA,w;    quitandome la funcion movlw ? por alguna razon en particular?
   movwf   j 

Les pregunto si es que lo saben, el proteus puede emular un OSCILADOR de entrada RC (en el PIC) ? es que aun con este codigo cambiado SIGUE SIN ANDAR! (y requiere realmente del cristal de cuarzo, el proteus para funcionar por oscilador XT ? )

Es que sospecho que simplemente el programa, no avanza....  como que no corre.

PD: ya les pase el circuito (por las dudas en el .rar). En rigor ambos codigos deberian funcionar, como dijo. Pero tambien es cierto que queda mucho mas lindo como lo paso PICMAN.

Yo ya lo estoy montando en la protoboard (esperemos que este bien escrito!). Deseenme suerte!.


----------



## pic-man (Nov 28, 2008)

cuando haces ese "movlw PORTA" lo que en realidad quieres hacer es cargar en W el valor de PORTA, eso con movlw no se puede hacer ya que con esa instrucción le cargas el valor de una literal a W, si usas esa instrucción creo que siempre estarías cargando un 5 en W, en cambio con "movf PORTA,w" estás moviendo el valor del registro PORTA a W.

En proteus creo que basta con que en las propiedades del pic indiques la frecuencia de trabajo para que puedas simular.


----------



## Meta (Dic 31, 2009)

pic-man dijo:


> Hola, tu programa tiene algunas omisiones, le hice algunos cambios para que funcione bien, pero de todas formas eso no explica por qué no podías compilar tu programa y por qué no te marcaba ningún error. Este código funciona:
> 
> 
> 
> ...



No no está usando lo mismo.


```
;----- Register Files------------------------------------------------------

INDF                         EQU     H'0000'
TMR0                         EQU     H'0001'
PCL                          EQU     H'0002'
STATUS                       EQU     H'0003'
FSR                          EQU     H'0004'
PORTA                        EQU     H'0005'
PORTB                        EQU     H'0006'
EEDATA                       EQU     H'0008'
EEADR                        EQU     H'0009'
PCLATH                       EQU     H'000A'
INTCON                       EQU     H'000B'

OPTION_REG                   EQU     H'0081'
TRISA                        EQU     H'0085'
TRISB                        EQU     H'0086'
EECON1                       EQU     H'0088'
EECON2                       EQU     H'0089'
```

Usa 06 y el otro 86. aún no entiendo que esto sea así. Hasta el 16F88 es igual, jejeje.


----------

