# Error al simular con PIC 18F4620 proteus *.asm



## jujoramo (Abr 21, 2012)

Buenas noches !!

Estoy simulando un sencillo circuito en proteus, pero no hay manera, alguien podria hecharme un cable en donde puede estar el error ?

La idea es sencilla, 
si RA3=1, RB7 y RB6 = 1
si RA3=0, RB7 y RB5 = 1

pero al darle al interruptor de RA3, veo la luz roja o azul (1 o 0) pero no cambia las salidas, siempre tengo RB6 y 7 a 1.

; LEDS.ASM
;REGISTROS DEL SISTEMA
#INCLUDE P18F4620.INC
LIST P=PIC18F4620
;INICIO DE PROGRAMA
ORG 0X0000
GOTO INICIO
;PROGRAMAMOS PUERTOS
INICIO BSF STATUS,5 ;Ir a Banco 1 
BSF TRISA,RA3 ;RA3 se configura como entrada 
CLRF TRISB ;RB0 a RB7 se configura como salida
BCF STATUS,5 ;Regresar al Banco 0
EXPLORA BTFSS PORTA,RA3 ;RA3 = 1 ? si es 1, salta 1 paso, vamos a 5
GOTO TRES ;RA3=0 Mostrar 3 en display 
GOTO CINCO ;paso obvio, va cinco
CINCO movlw B'10100000' ;RA3=1, Mostrar 5 en display 
movwf PORTB ;Mostramos 5 en display
GOTO EXPLORA ;seguimos explorando el BIT RA3
TRES movlw B'11000000' ;RA3=0, Mostrar 3 en display 
movwf PORTB ;Mostramos 3 en display
GOTO EXPLORA ;seguimos explorando el BIT RA3 
END







Muchas gracias de antemano


----------



## ByAxel (Abr 21, 2012)

Hola:
Me parece que es tu primer programa con un PIC18F... revisa su hoja de datos, revisa los registros de los 18F que tienen 15 en total (no 4 como los 16F) y además algo que me sorprende, es que lo estás programando como un 16F...
Otra cosa que generalmente el PORTA está asignado al módulo ADC y no veo que lo configures.

Un saludo.


----------



## jujoramo (Abr 21, 2012)

quizas quiero correr demasiado, nose, pero creo que la mejor manera de aprender es probar probar y probar.... todo teoria no puede ser, asi que por eso me he metido a simular.

Practicamente no he entendido nada de lo que has dicho.

El programa es mas que posible que sea para 16, pero aun siendo para 16, creia que se escribia = y luego el hex ya hacia lo suyo para cada uno.

Entiendo lo del BTFSS... que salta uno si es 1 pero no funciona la vuela a EXPLORE, seguro que será por lo que comentas que es para 16, pero vaya que ni idea... gracias !

Por cierto, si es mas o menos mi primer programa. ;-)


----------



## ByAxel (Abr 23, 2012)

Hola.
Si perdón me apresuré un poco. El echo de ver la teoria es porque estás  pasando de una gama a otra y pues hay varias diferencias con respecto a  los 16F.

- En los 18F hay unos 15 bancos con registros de configuración y de  usuario, el acceso a estos de más directo; por ejemplo para configurar  el PORTA es simplemente escribir un valor en el registro TRISA sin  cambiar de banco. Este ejemplo es de la misma hoja de datos del PIC18  que mencionas.


> CLRF PORTA ; Initialize PORTA by
> ; clearing output
> ; data latches
> CLRF LATA ; Alternate method
> ...



Según veo en el código que pones no estás configurando el PORTA como IO *digital*,  recuerda que este puerto comparte sus pines con el módulo ADC del PIC y  por defecto está comfigurado para este, así que hace falta configurar  el registro ADCON1 y CMCON como en el ejemplo.

- El set de instrucciones para los 18F es más amplio.



jujoramo dijo:


> pero aun siendo para 16, creia que se escribia = y luego el hex ya hacia lo suyo para cada uno.


- Hay muchas difrencias de una gama a otra de PICs.
- Generalmente otros pasan a los 18F o mayores programando en lenguaje C  por ser más portable, es decir que prácticamente va a funcionar para  cualquier PIC de cualquier gama sin tantos cambios (claro que a veces no  se cumple), por eso felicitaciones por entrar a los 18F en asm... jeje.

- Por último, configurar los Fuses son muy importantes, de otro modo  nada va a funcionar como se debe... te recomiendo ver un poco la hoja de  datos http://ww1.microchip.com/downloads/en/devicedoc/39626b.pdf del PIC18 con el que estes practicando y busca ejemplos en asm dentro del foro que hay varios.

Saludos.


----------



## jujoramo (Abr 23, 2012)

Gracias, he buscado varios ejemplos y no he encontrado ninguno para pic18f en asm, todo en c o para 16f a patadas, tanto here como google.

el data del 4620 ya lo tengo, 390 páginas de un precioso inglés jeje.

la idea es partir de algo que pueda simular en proteus, una vez hecho esto, agregar, modificar, quitar o ir agregando cositas poco a poco, pero esk ni tengo ni eso, ni un triste programa que pueda simular en proteus con el 18f4620.

si pudieras hecharme un cable seria de gran ayuda.

p.d. tal como dices te paso un programa que nos ha pasado el profe, que por lo visto, por lo que dices no es muy correcto creo, corrijeme si me equivoco:

;  LEDS.ASM
;REGISTROS DEL SISTEMA
       #INCLUDE  P18F4620.INC
       LIST      P=PIC18F4620

;REGISTROS DEL USUARIO
TIEMPO    EQU 0X10
TIEMPO_1  EQU 0X11
TIEMPO_2  EQU 0X12
;VECTOR DE RESET
  ORG  0X0000
  GOTO INICIO_PROGRAMA
;INICIO DE PROGRAMA
  ORG 0X0100

INICIO_PROGRAMA
REPITE
;PROGRAMAMOS PUERTOS
  BCF  TRISB,RB0  ;Salida         puesta a 0 (C=clear), cada bit del tris li 
  BCF  TRISB,RB1  ;SALIDA         diu al bit port com te que funcionar
  BCF  TRISB,RB2  ;SALIDA
  BCF  TRISB,RB3  ;SALIDA

  BSF  TRISB,RD0  ;ENTRADA        puesta a 1 (S=set)

;DESACTIVAMOS SALIDAS

  BSF PORTB,RB0   ;Pone en 1 (Set) RB0 
  BSF PORTB,RB1
  BSF PORTB,RB2
  BSF PORTB,RB3

;INICIALIZAMOS REGISTROS USUARIO
  CLRF  TIEMPO  ;Pone a 0 los 8 bits de tiempo ?
  CLRF  TIEMPO_1
  CLRF  TIEMPO_2

;SALTAMOS A PROGRAMA PRINCIPAL
PROGRAMA_PRINCIPAL  

  BCF PORTB,RB0
  BSF PORTB,RB1
  BSF PORTB,RB2
  BSF PORTB,RB3

  CALL  TEMPORIZA  

  BSF PORTB,RB0
  BCF PORTB,RB1
  BSF PORTB,RB2
  BSF PORTB,RB3

  CALL  TEMPORIZA

  BSF PORTB,RB0
  BSF PORTB,RB1
  BCF PORTB,RB2
  BSF PORTB,RB3

  CALL  TEMPORIZA

  BSF PORTB,RB0
  BSF PORTB,RB1
  BSF PORTB,RB2
  BCF PORTB,RB3

  CALL  TEMPORIZA


  BSF PORTB,RB0
  BSF PORTB,RB1
  BCF PORTB,RB2
  BSF PORTB,RB3

  CALL  TEMPORIZA

  BSF PORTB,RB0
  BCF PORTB,RB1
  BSF PORTB,RB2
  BSF PORTB,RB3

  CALL  TEMPORIZA  

  GOTO  REPITE

;TEMPORIZADOR
TEMPORIZA
  CLRF TIEMPO
  CLRF TIEMPO_1
  MOVLW 0X08
  MOVFF WREG,TIEMPO_2

TEMPORIZA_1
  DECFSZ  TIEMPO,F
  GOTO    TEMPORIZA_1
  DECFSZ  TIEMPO_1,F
  GOTO    TEMPORIZA_1
  DECFSZ  TIEMPO_2,F
  GOTO    TEMPORIZA_1

  RETURN 
  END


----------



## ByAxel (Abr 26, 2012)

Hola:
Ya lo pruebo.
- El asm es el mismo que para los 16F pero son más intrucciones que  soporta los P18 ya que su arquitectura lo permite; te adjunto un pequeño  manual.

- Para todo lo principal es la configuración del PIC y básicamente es lo mismo, por ejemplo.

```
List p=18f452
    #include <p18f452.inc>
    
CONFIG OSC = XT
CONFIG OSCS = OFF
CONFIG BOR = OFF
CONFIG BORV = 25
CONFIG WDT = OFF
CONFIG CCP2MUX = OFF
CONFIG STVR = OFF
CONFIG LVP = OFF
CONFIG DEBUG = OFF
 

COUNT1 equ 0x01
COUNT2 equ 0x02
```
-  Según la hoja de datos, el registro STATUS ya no contiene los bits para  pasar de banco como los P16; la arquitectura de los P18 lo controla de  otra manera; a grandes razgos todo es directo.


```
org 0x0000

clrf TRISC
clrf LATC
```
- Además hay nuevas instrucciones que es necesario conocer.


```
Main bsf LATC,4
    rcall Pausa200ms
    bcf LATC,4
   rcall Pausa200ms
    bra Main
```
Si,  generalmente la información es poca y en ingles para el asm de los P18,  pero solo es necesario conocer las instrucciones y parte de su  arquitectura para poder volar...

Un saludo


----------



## jujoramo (Abr 26, 2012)

Perfecto, muchas gracias, si tienes algo más, será un placer recibirlo


----------

