Autor Tema: DUDA con mi simulacion en ISIS. (PIC16F877A)  (Leído 2818 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Oliver Karin

  • PIC10
  • *
  • Mensajes: 6
DUDA con mi simulacion en ISIS. (PIC16F877A)
« en: 04 de Abril de 2018, 02:51:02 »
Hola como estan, espero me puedan ayudar.
Me gustaria si saber si estoy utilizando mal el programa o mi codigo tiene algo mal.
Es el primer programa que hago en Pic ya ue siempre use Microcontrolador y lo que quiero que realice es que por medio de un dip switch yo pueda elegir entre dos secuencias de leds distintas que muestro en el puerto B, osea que si el dip esta en "0" muestre una secuencia y el dip esta en "1" muestre otra distinta(con un retardo de 1 seg que cree para cada cambio de estado en los leds durante la secuencias).
No me sale ningun error e Mlab y ya lo cargue en ISIS pero no hace nada, como si no cargara nada, sale esto en los mensajes del programa...


#INCLUDE<p16f877a.INC>
LIST p=16f877a
__CONFIG 0x3FF9
O EQU 0X21
N EQU 0X22
M EQU 0X23

BSF TRISE,0
CLRF TRISB

MOVLW D'7'
MOVWF CMCON

REGRESO1
BTFSS PORTE,0
GOTO corrida1
GOTO corrida2

corrida1
MOVLW B'10000000'
MOVFW PORTB
CALL RETARDO
MOVLW B'11100000'
MOVFW PORTB
CALL RETARDO
MOVLW B'11111000'
MOVFW PORTB
CALL RETARDO
MOVLW B'11111110'
MOVFW PORTB
CALL RETARDO
MOVLW B'00011000'
MOVFW PORTB
CALL RETARDO
GOTO REGRESO1

corrida2
MOVLW B'10000001'
MOVFW PORTB
CALL RETARDO
MOVLW B'11000011'
MOVFW PORTB
CALL RETARDO
MOVLW B'11100111'
MOVFW PORTB
CALL RETARDO
MOVLW B'111111111'
MOVFW PORTB
CALL RETARDO
MOVLW B'00011000'
MOVFW PORTB
CALL RETARDO
GOTO REGRESO1

RETARDO:
MOVLW D'10'
MOVWF O
TRES
MOVLW D'80'
MOVWF M
DOS
MOVLW D'250'
MOVWF N
UNO
NOP
NOP
DECFSZ N,1
GOTO UNO
DECFSZ M,1
GOTO DOS
DECFSZ P,1
GOTO TRES
RETURN

END

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:DUDA con mi simulacion en ISIS. (PIC16F877A)
« Respuesta #1 en: 04 de Abril de 2018, 08:50:32 »
Por ser tu primero programa te voy a decir algunas cosas que deberias ver paar que todo funcione correctamente y algunos otros errores.

- FUSES ( config )
No sabria decirte si esta correcto o no (podria, pero es mucho mas trabajo). Deberia ponerme a buscar que hace cada bits, en el .inc que incluis (al final del mismo) hay una forma facil de poder escibir los fuses y de forma legible
 ejemplo:

Código: ASM
  1. __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_OFF & _LVP_OFF & _DEBUG_OFF & _CP_OFF

En ves de un numero ahora tengo cada parte y es mas legible ya que puedo ver que tengo el watchdog deshabilitado, el oscilador configurado como XT, y etc.

- BANCOS
Un error es no cambiar de bancos, la RAM tiene 4 bancos, y solo puede accederse a 1 por ves, comenzas en el banco 0 (podes verlo en memory organization del datasheet ) donde tenes los PORTx. TRISx y CMCON se encuentran en el banco 1. Para cambiar de banco podes hacerlo vos con BSF/BCF al registro STATUS, bits RP0 y RP1. O usar lo que te provee el compilador para que te lo gerene de forma automatica y es BANKSEL. Te doy 2 codigos similares:

Código: ASM
  1. BSF  STATUS,RP0
  2.    BCF STATUS, RP1 ; Banco 1
  3.    BSF TRISE,0
  4.    CLRF TRISB
  5.  
  6.    MOVLW D'7'
  7.    MOVWF CMCON
  8.  
  9.    BCF  STATUS,RP0
  10.    BCF STATUS, RP1 ; Banco 0
  11.  
  12. REGRESO1
  13.    BTFSS PORTE,0
  14.    GOTO corrida1
  15.    GOTO corrida2

O.. como decia usar BANKSEL

Código: ASM
  1. BANKSEL TRISB ; Como el TRISB se encuentra en el Banco 1, el compilador genera los BSF/BCF para el banco 1
  2.    BSF TRISE,0
  3.    CLRF TRISB
  4.  
  5.    MOVLW D'7'
  6.    MOVWF CMCON
  7.  
  8.    BANKSEL PORTA ; Como el PORTA se encuentra en el Banco 0, el compilador genera los BSF/BCF para el banco 0
  9.  
  10. REGRESO1
  11.    BTFSS PORTE,0
  12.    GOTO corrida1
  13.    GOTO corrida2

- Vectores de inicio e interrupcion

Una buena practica es siempre definir los vectores de reset e interrupcion, por mas que no utilices el de interrupcion, los vectores se encuentran en 0x0000 y 0x0004 y te quedaria asi:

Código: ASM
  1. N EQU 0X22
  2.      M EQU 0X23
  3.  
  4.      ORG 0x00      ;Reset, encendido
  5.      GOTO INICIO
  6.      ORG 0x04      ;Interrupcion
  7.      RETURN
  8.  
  9. INICIO
  10.      BANKSEL TRISE
  11.      BSF TRISE,0
  12.      CLRF TRISB

- PORTE y su puerto analogico

Si te vas al datasheet sobre el puerto E, al final siempre de cada seccion ( en este caso del puerto E) te aparecen los registros que involucran a este puerto, y ahi te vas a encontrar con que hay 3 , bajo el titutlo de : SUMMARY OF REGISTERS ASSOCIATED WITH PORTE.
PORTE, TRISE y ADCON1
Donde ADCON1 define si son digitales o analogicos.

Buscando ADCON1 este se encuentra en el banco 1, y se debe cargar 0x07 para que se vuelvan todos digitales. Entonces:

Código: ASM
  1. MOVLW D'7'
  2. MOVWF CMCON
  3. MOVWF ADCON1

- Cnosideraciones con el delay y la lectura del pulsador

Si seguimos la logica el camino para una de las secuencias nos queda algo asi (simplifique todo y saque la otra secuencia para ver mas facil el problema):

Código: ASM
  1. REGRESO1
  2.    BTFSS PORTE,0
  3.    GOTO corrida1
  4.    GOTO corrida2
  5.  
  6. corrida1
  7.     ; Aca dentro tengo 5 delays
  8.    GOTO REGRESO1

Aca hay un problema, si me decis que tu delay tarda 1 segundo. Quiere decir que .. ahora sigamos el prorgama. Leo el DIP switch, entro a corrida 1, hace toda la secuencia que demora 5 segundos, salgo y leo el DIP switch, Y aca puede haber un problema o no segun lo que vos desees realizar, el problema esta en que el DIP switch se lee cada 5 segundos!, es decir que si queres cambiar de secuencia, primero debe pasar la otra por completo para que cambie. Y segun donde cambies el DIP switch el tiempo varia desde 0 a 5 segundos al cambio.

Tambien si queres agregar algo mas, quiere decir que tu micro va a estar 5 segundos haciendo la secuencia y recien ahi va a hacer eso extra que pusiste. Lo que por ahi no es tan bueno.
La solucion a esto podria ser el usar una tabla, y un Timer, pero por ser tu primer programa, solo quiero que te des cuenta de sea imposibilidad.

- Proteus y circuito

El circuito le falta una cosa, y son las resistencias de los diodos leds, las resitencias las calculas con (le puse 10mA ya que al encender varios para no llegar al maximo del puerto):

(Vcc - Vled) / 10mA = R

Ejemplo si alimentas al PIC con 5V (Vcc) y el led tiene una caida de 2V (Vled) te quedaria:

(5V - 2V) / 10mA = R
3V/20mA = R
R = 300 ohms (330 ohms para un valor de resistencia )

- Otras consideraciones sobre proteus

Primero que nada, Proteus es un simulador asi que a veces falla y en el circuito no.
Proteus no tiene en cuenta los FUSES, asi que si alguna ves te funciona, y en el circuito no pueden ser estos.
Proteus no hace caso al cristal conectado, si haces doble click sobre el microcontrolador en el proteus te aparece para ponerle la frecuencia, es la unica frecuencia que le hace caso. El cristal que le pongas en los pines es solo para el PCB si luego lo haces.
Proteus es LENTO en la simulacion, 1s en simulacion de Proteus puede llegar a ser 5s reloj, entonces por ahi para poder ver tu secuencia mas facil, sea mejor bajarle el delay.

- Correcta sintaxis

No se, pero tal ves cuando copias y pegaste, se eliminaron todos los espacios al frente, ya que lo unico que no puede tener espacios al frente son las etiquetas como REGRESO1, corrida1, todo lo demas deberia tener minimo 1 espacio al frente. Sino te daria error, pero como decis que lo compilas bien entonces me imagino que fue en el copy/paste
« Última modificación: 04 de Abril de 2018, 08:55:01 por KILLERJC »

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:DUDA con mi simulacion en ISIS. (PIC16F877A)
« Respuesta #2 en: 04 de Abril de 2018, 10:03:18 »

Además de todo lo anterior,  en la rutina de retardo tenés que cambiar:

Código: [Seleccionar]
RETARDO:
    MOVLW D'10'
    MOVWF O
TRES
    MOVLW D'80'
    MOVWF M
.......................
.......................
    GOTO DOS
    DECFSZ P,1     <<<<<====  Debe ser  DECFSZ O,1
    GOTO TRES
    RETURN

o vas a permanecer en el bucle hasta el fin de los tiempos.

Por favor, usá nombres descriptivos en las variables.

Desconectado Oliver Karin

  • PIC10
  • *
  • Mensajes: 6
Re:DUDA con mi simulacion en ISIS. (PIC16F877A)
« Respuesta #3 en: 04 de Abril de 2018, 23:25:07 »
Muchas gracias, aprendi mucho con tu respuesta, ya hace algo en ISIS pero nada que ver con las secuencias jajaja hace lo mismo aunque el bit del puerto E que uso para el "Switch" lo ponga a vcc o tierra(prenden los mismos leds en los dos casos).
Te dejo el codigo ya modificado y la foto de lo que muestra en simulacion.
una pregunta: Usando lo de FUSES, cuando lo ponga como sugieres... el compilador lo traducira a HEX normal?  o tengo que dejar el _Config 0xXXX?



#INCLUDE<p16f877a.INC>
LIST p=16f877a
__CONFIG 0x3FF9
O EQU 0X21
N EQU 0X22
M EQU 0X23

ORG 0x00      ;Reset, encendido
GOTO INICIO

INICIO
BANKSEL TRISB
BSF TRISE,0
CLRF TRISB
MOVLW D'7'
MOVWF CMCON
MOVWF ADCON1
BANKSEL PORTA


REGRESO1
BTFSS PORTE,0
GOTO corrida1
GOTO corrida2

corrida1
MOVLW B'10000000'
MOVFW PORTB
CALL RETARDO
MOVLW B'11100000'
MOVFW PORTB
CALL RETARDO
MOVLW B'11111000'
MOVFW PORTB
CALL RETARDO
MOVLW B'11111110'
MOVFW PORTB
CALL RETARDO
MOVLW B'00011000'
MOVFW PORTB
CALL RETARDO
GOTO REGRESO1

corrida2
MOVLW B'10000001'
MOVFW PORTB
CALL RETARDO
MOVLW B'11000011'
MOVFW PORTB
CALL RETARDO
MOVLW B'11100111'
MOVFW PORTB
CALL RETARDO
MOVLW B'111111111'
MOVFW PORTB
CALL RETARDO
MOVLW B'00011000'
MOVFW PORTB
CALL RETARDO
GOTO REGRESO1

RETARDO:
MOVLW D'10'
MOVWF O
TRES
MOVLW D'80'
MOVWF M
DOS
MOVLW D'250'
MOVWF N
UNO
NOP
NOP
DECFSZ N,1
GOTO UNO
DECFSZ M,1
GOTO DOS
DECFSZ O,1
GOTO TRES
RETURN

END


 

anything