Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Oliver Karin en 04 de Abril de 2018, 02:51:02
Título: DUDA con mi simulacion en ISIS. (PIC16F877A)
Publicado por: Oliver Karin 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
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
Título: Re:DUDA con mi simulacion en ISIS. (PIC16F877A)
Publicado por: KILLERJC 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:
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
BSF STATUS,RP0
BCF STATUS, RP1 ; Banco 1
BSF TRISE,0
CLRF TRISB
MOVLW D'7'
MOVWF CMCON
BCF STATUS,RP0
BCF STATUS, RP1 ; Banco 0
REGRESO1
BTFSS PORTE,0
GOTO corrida1
GOTO corrida2
O.. como decia usar BANKSEL
Código: ASM
BANKSEL TRISB ; Como el TRISB se encuentra en el Banco 1, el compilador genera los BSF/BCF para el banco 1
BSF TRISE,0
CLRF TRISB
MOVLW D'7'
MOVWF CMCON
BANKSEL PORTA ; Como el PORTA se encuentra en el Banco 0, el compilador genera los BSF/BCF para el banco 0
REGRESO1
BTFSS PORTE,0
GOTO corrida1
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
N EQU0X22
M EQU0X23
ORG 0x00;Reset, encendido
GOTO INICIO
ORG 0x04;Interrupcion
RETURN
INICIO
BANKSEL TRISE
BSF TRISE,0
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
MOVLW D'7'
MOVWF CMCON
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
REGRESO1
BTFSS PORTE,0
GOTO corrida1
GOTO corrida2
corrida1
; Aca dentro tengo 5 delays
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
Título: Re:DUDA con mi simulacion en ISIS. (PIC16F877A)
Publicado por: Eduardo2 en 04 de Abril de 2018, 10:03:18
Además de todo lo anterior, en la rutina de retardo tenés que cambiar:
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.
Título: Re:DUDA con mi simulacion en ISIS. (PIC16F877A)
Publicado por: Oliver Karin 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
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