Autor Tema: Problemas con el simulador de MPLAB  (Leído 5343 veces)

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

Desconectado electronico39

  • PIC10
  • *
  • Mensajes: 46
Problemas con el simulador de MPLAB
« en: 20 de Octubre de 2011, 16:59:29 »
Hola a todos, que haría yo sin vosotros, muchas gracias a todos.

Os cuento mi problema. He hecho ya varios programas y todos me han funcionado muy bien, pero en este estoy atascado y no se donde está en fallo. Se trata de un reloj digital que a su vez me marca dos temperaturas, con el LM335. Lo estoy haciendo con unos displays de doble led rojo y verde. Cuando arranca el programa lo primero que marca es la hora, despues de 10 sg marca la temperatura de un LM335 y a los 5 sg marca la otra temperatura de otro LM335, y despues vuelve a marcar la hora. Y así sucesivamente.
Bueno pues el problema que me encuentro cuando lo pongo a correr en el simulador de MPLAB, pongo un breakpoint para comprobar el tiempo en un minuto, y para correctamente en el breakpoint. Veo el tiempo y va de lujo, se para a los 60.0002 segundos, que ya es muy exacto. Hasta aquí todo bien, pero cuando le doy al run para comprobar el segundo minuto se para en otra dirección del programa a los 49 segundos mas o menos, y no encuentro el fallo.

Me gustaría saber porque motivos se para el programa antes del punto de ruptura como en mi caso. Esto lo tengo montado en la protoboard y no funciona bien por que se adelanta bastante.

muchas gracias a todos y un saludo.



Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 627
Re: Problemas con el simulador de MPLAB
« Respuesta #1 en: 23 de Octubre de 2011, 10:11:03 »
Hola electronico39,

mas que un problema con el simulador parece mas un problema con tu codigo, ya que en el protoboard tampoco funciona correctamente, si el programa se detiene en otro lado, adivinado podria ser que no estes volviendo a iniciar correctamente las variables, o talvez estas usando interrupciones para generar la demora y no las estes manejando apropiadamente, si estas usando mas de una pagina de memoria de programa talvez no estas manejando los saltos correctamente, en fin pueden ser varias cosas, seria mejor si dijeras el micro que estas usando y si es posible postees el codigo o parte del codigo que estes usando.

Saludos
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado electronico39

  • PIC10
  • *
  • Mensajes: 46
Re: Problemas con el simulador de MPLAB
« Respuesta #2 en: 24 de Octubre de 2011, 16:22:56 »
Hola sander, gracias por contestar.

El micro que utilizo es el 16f876, y el codigo no lo puedo postesar porque no estoy en mi ordenador, cuando pueda lo postearé para que lo veas y ver posibles errores que hay en él, para corregirlos y tambien si alguien le interesa lo puede montar.

Un saludo.

Desconectado electronico39

  • PIC10
  • *
  • Mensajes: 46
Re: Problemas con el simulador de MPLAB
« Respuesta #3 en: 26 de Octubre de 2011, 16:31:10 »
Bueno, aquí os dejo el código para que le echeis un vistazo y ver lo errores que tengo. Seguro que tengo muchos por que he hecho pocos programas y no tengo mucha soltura en ellos, pero poco a poco iré aprendiendo y corregir muchos errores y realizar los programas mas completos y sin errores.

El programa funciona mas o menos bien a pesar del adelanto que lleva el reloj, por que me hace bien los cambios a temperatura y a volver a marcar la hora. Si pudiera, os ponía un pequeño video donde se puede ver como funciona.

Bueno aquí os dejo el codigo entero:

;***************************
;*** RELOJ DIGITAL CON DISPLAYS DE 7 SEGMENTOS Y DOS TERMOMETROS ***
;***************************

   

LIST      P=16F876
#INCLUDE   <P16F876.INC>

INDO      EQU         0X00
TMR0      EQU         0X01
PCL         EQU         0X02
FSR         EQU         0X04
ESTADO      EQU         0X03
PTOA      EQU         0X05
PTOB      EQU         0X06
PTOC      EQU         0X07
TRISA      EQU         0X85
TRISB      EQU         0X86
TRISC      EQU         0X87
OPCION      EQU         0X81
INTCON      EQU         0X0B
ADCON0      EQU         0X1F
ADCON1      EQU         0X9F
ADRESH      EQU         0X1E
ADRESL      EQU         0X9E
BINARIO      EQU         0X20
CENTENA      EQU         0X21
DECENA      EQU         0X22
UNIDAD      EQU         0X23
DIG1      EQU         0X24
DIG2      EQU         0X25
DIG3      EQU         0X26
DIG4      EQU         0X27
ROTA      EQU         0X28
REG1      EQU         0X29
REG2      EQU         0X2A
REG3      EQU         0X2B
REG4      EQU         0X2C
REG5      EQU         0X39
REG6      EQU         0X3A
REG7      EQU         0X3B
REG8      EQU         0X3C
DIVIDENDO   EQU         0X2D
DIVISOR      EQU         0X2E
COCIENTE   EQU         0X2F
AUXILIAR   EQU         0X30
DATO      EQU         0X31
MULTIP      EQU         0X32
PRODUCTO   EQU         0X33
RESULTADO   EQU         0X34
RESTADO      EQU         0X35
RESTADO2   EQU         0X36
LETRA      EQU         0X37
MULTIPH      EQU         0X38
MULTIPL      EQU         0X3D
CONTA      EQU         0X3E         ;CONTADOR DE SEGUNDOS
CONTB      EQU         0X3F
CONTC      EQU         0X40
TEMP1      EQU         0X41         ;REGISTROS TEMPORALES PARA GUARDAR DATOS Y DESPUES DE
TEMP2      EQU         0X42         ;LAS INTERRUPCIONES RECUPERARLOS
TEMP3      EQU         0X43
TEMP4      EQU         0X44
TEMP5      EQU         0X45
TIEMPO      EQU         0X46

RESET      ORG         0X00
         GOTO      INICIO
         ORG         0X04            ;AQUI ES DONDE EMPIEZA LA INTERRUPCION

hayint   movwf   TEMP5
      btfss   INTCON,2      ;se ha activado la interrupcion por el TMR0?
      goto   inicia         ;si no es por TMR0 comprueva si es por el puerto B
      nop
      nop
bien   decfsz   REG5,1         ;registro que decrementa cada vez que se desborda el TMR0
      goto   borra
      goto   compr
inicia   btfsc    PTOB,0
      goto   sal
      call   RETARDO2
Phora   btfsc   PTOB,0
      goto   inicia
      clrf   CONTA         ;reseteamos el contador de segundos, para que empiece cuando soltemos
      btfsc   PTOB,1         ;pulsador de incrementar minutos
      goto   hora
      call   RETARDO
      btfss   PTOB,1
      goto   Phora
      incf   TEMP1,1
      movf   TEMP1,w
      movwf   PTOC
      BSF      PTOC,4
      BSF      PTOC,5
      BSF      PTOC,6
      xorlw   0x0a
      btfsc   ESTADO,2
      goto   decena
      goto   comien
      goto   inicia
decena   clrf   TEMP1
      call   RETARDO
      incf   TEMP2,1
      movf   TEMP2,w
      movwf   PTOC
      BSF      PTOC,4
      BSF      PTOC,5
      BSF      PTOC,6
      xorlw   0x06
      btfsc   ESTADO,2
      clrf   TEMP2
      goto   comien
      goto   inicia
hora   btfsc   PTOB,2         ;pulsador de incrementar horas
      goto   comien
      call   RETARDO
      btfss   PTOB,2
      goto   hora
      incf   TEMP3,1
      movf   TEMP3,w
      movwf   PTOC
      BSF      PTOC,4
      BSF      PTOC,5
      BSF      PTOC,6
      xorlw   0x04
      btfsc   ESTADO,2
      goto   son24
      movf   TEMP3,w
      xorlw   0x0a
      btfsc   ESTADO,2
      goto   no24
      goto   comien
      goto   inicia
sal      bcf      INTCON,1         ;borra la bandera de interrupcion del puerto B
borra   bcf      INTCON,2         ;borra la bandera de interrupcion del TMR0
      bcf      INTCON,0         ;borra la bandera de interrupcion por cambio de RB4 A RB7
      movlw      0x3C         
      movwf      REG6
      movlw      0xd7
      movwf      TMR0
      movf      TEMP5,W
      retfie

INICIO
         BSF         ESTADO,5
         MOVLW      0X0F            ;PUERTO A (AN0 Y AN1 ENTRADAS) EL RESTO SALIDAS
         MOVWF      TRISA
         MOVLW      0X07
         MOVWF      TRISB            ;PUERTO B TRES ENTRADAS Y EL RESTO SALIDAS
         CLRF      TRISC            ;PUERTO C COMO SALIDAS
         MOVLW      0X80
         MOVWF      OPCION
         MOVLW      0X0D
         MOVWF      ADCON1
         BCF         ESTADO,5
         MOVLW      0XB0
         MOVWF      INTCON            ;HABILITA LAS INTERRUPCIONES POR PTOB Y TMR0
         MOVLW      0X41
         MOVWF      ADCON0
         BCF         ESTADO,0
         BCF         ESTADO,1
         BCF         ESTADO,2
         CLRF      PTOA
         CLRF      PTOB
         CLRF      PTOC
         CLRF      ADRESH
         CLRF      ADRESL
         MOVLW      0X20
         MOVWF      FSR
OTRO      CLRF      INDO
         INCF      FSR
         MOVF      FSR,W
         XORLW      0X47
         BTFSS      ESTADO,2
         GOTO      OTRO
         MOVLW      0X64
         MOVWF      REG5
         MOVLW      0X3C
         MOVWF      REG6
         MOVLW      0Xd7
         MOVWF      TMR0
         MOVLW      0X8E
         MOVWF      RESTADO
         MOVLW      0X8E
         MOVWF      RESTADO2
         MOVLW      0x64
         MOVWF      ROTA
         MOVLW      0X32
         MOVWF      CONTB
         MOVLW      0X09
         MOVWF      CONTC
         GOTO      comien
MARCAT      MOVLW      0X45
         MOVWF      ROTA
         MOVLW      0X03
         MOVWF      CONTC
         BCF         PTOA,5
         CALL      CONFIG_ADC
         BSF         ADCON0,0
         CALL      RETARDO2
         CALL      ADQUISICION1
         RETURN
      


;========================== rutina que cuenta los milisegundos hasta llegar a un segundo=======================
   
compr
      movlw   0x64      ;carga con 100 el registro reg5
      movwf   REG5         
mas      decfsz   CONTB,1
      goto   borra
      movlw   0x32      ;carga con 50 el registro CONTB
      movwf   CONTB
      incf   REG7,1
      movf   REG7,w
      xorlw   0x01
      btfsc   ESTADO,2
      goto   LED
      goto   noleds
      return

noleds   movf   REG7,W
      xorlw   0x02
      btfsc   ESTADO,2
      goto   segundo
      btfsc   INTCON,2
      goto   borra
      RETURN

LED      movf   DIG3,W      ;comprueva si esta marcando temperatura
      xorlw   0x0A      ; si es asi, no enciendas los leds
      btfsc   ESTADO,2
      GOTO   borra
      BSF      PTOA,5
      goto   borra
      return

;=========================rutina que cuenta los segundos hasta llegar a 60s======================
      
segundo   
      BCF      PTOA,5
      clrf   REG7
      incf   CONTA,1
      movf   CONTA,w
      xorlw   0x3c         ;COMPARA SI LLEGA A 60
      btfsc   ESTADO,2
      goto   minuto
      goto   borra
      return

comien   CLRF      DIG3
      MOVLW      0XF0
      MOVWF      PTOC
      BSF         PTOC,7      ;APAGA EL PUNTO DE GRADOS
      movf      TEMP4,w
      xorlw      0x00
      btfsc      ESTADO,2
      goto      tres
cuatro   movlw      0xF0
      movwf      PTOB
      movf      TEMP4,W
      movwf      PTOC
      BSF         PTOC,7
      BSF         PTOC,6
      BSF         PTOC,5
      BSF         PTOC,4
      movlw      0x70
      movwf      PTOB
      call      RETARDO
tres   movlw      0xF0
      movwf      PTOB
      movf      TEMP3,w
      movwf      PTOC
      BSF         PTOC,7
      BSF         PTOC,6
      BSF         PTOC,5
      BSF         PTOC,4
      movlw      0xB0
      movwf      PTOB
      call      RETARDO
      movlw      0xF0
      movwf      PTOB
      movf      TEMP2,w
      movwf      PTOC
      BSF         PTOC,7
      BSF         PTOC,6
      BSF         PTOC,5
      BSF         PTOC,4
      movlw      0xD0
      movwf      PTOB
      call      RETARDO
      movlw      0xF0
      movwf      PTOB
      movf      TEMP1,w
      movwf      PTOC
      BSF         PTOC,7
      BSF         PTOC,6
      BSF         PTOC,5
      BSF         PTOC,4
      movlw      0xE0
      movwf      PTOB
      call      RETARDO
      movlw      0xF0
      movwf      PTOB
      btfsc      PTOB,0            ;si se pulsa el pulsador de puesta en
      goto      TEMP            ;en hora, se produce una interrupcion
      goto      hayint            ;por RB0.
TEMP   btfsc      INTCON,1
      goto      sal
      btfsc      INTCON,2
      goto      sal
      decfsz      ROTA
      goto      comien
      movlw      0x64
      movwf      ROTA
      decfsz      CONTC
      goto      comien
      call      RETARDO
      goto      MARCAT
      return


minuto    
      clrf      CONTA
      incf      TEMP1,1
      movf      TEMP1,w
      movwf      PTOC
      xorlw      0x0a
      btfsc      ESTADO,2
      goto      decen
      goto      borra
      return
      

decen   clrf      TEMP1
      movf      0x00
      movwf      PTOC
      incf      TEMP2,1
      movf      TEMP2,w
      movwf      PTOC
      xorlw      0x06
      btfsc      ESTADO,2
      goto      cente
      goto      borra
      return
      
cente   clrf      TEMP1
      clrf      TEMP2
      movf      0x00
      movwf      PTOC
      incf      TEMP3,1
      movf      TEMP3,w
      movwf      PTOC
      xorlw      0x04
      btfsc      ESTADO,2
      goto      compru
      movf      TEMP3,w
      xorlw      0x0a
      btfsc      ESTADO,2
      goto      dech
      goto      borra
      return

compru   movf      TEMP4,w
      xorlw      0x02
      btfsc      ESTADO,2
      goto      cero
      goto      borra
      goto      comien
      return   

cero   clrf      CONTA
      clrf      TEMP1
      clrf      TEMP2
      clrf      TEMP3
      clrf      TEMP4
      goto      borra
      goto      comien
      return

son24   movf   TEMP4,w
      xorlw   0x02
      btfsc   ESTADO,2
      goto   si24
      goto   comien
      return

si24   clrf   TEMP3
      clrf   TEMP4
      goto   inicia
no24   clrf   TEMP3
      call   RETARDO
      incf   TEMP4,1
      movf   TEMP4,w
      movwf   PTOC
      goto   comien
      return

dech   clrf      TEMP1
      clrf      TEMP2
      clrf      TEMP3
      bcf         ESTADO,0
      movf      0x00
      movwf      PTOC
      incf      TEMP4,1
      movf      TEMP4,w
      movwf      PTOC
      goto      borra
      goto      comien
      return

;************************RUTINA PARA CONVERTIR BINARIO A BCD**************************
Binario_BCD1
   movwf   BINARIO
   movwf   UNIDAD
   clrf   DECENA
   clrf   CENTENA
BCD_01
   movlw   d'10'
   subwf   UNIDAD,W
   btfss   STATUS,C
   goto   BCD_Fin1
BCD_1
   movwf   UNIDAD
   incf   DECENA,f
   movlw   d'10'
   subwf   DECENA,W
   btfss   STATUS,C
   goto   BCD_01
BCD_Fin1
   movf   UNIDAD,W
   movwf   DIG1
   movf   DECENA,W
   movwf   DIG2
   movlw   0X0A
   movwf   CENTENA               ;LETRA C
   movf   CENTENA,W
   movwf   DIG3
   movlw   0x0F
   movwf   LETRA
   movf   LETRA,W
   movwf   DIG4
   goto   MULTIPLEXADO1
   return

;*********************************RUTINA PARA CONVERTIR DE BINARIO A BCD**************************************
Binario_BCD2
   movwf   BINARIO
   movwf   UNIDAD
   clrf   DECENA
   clrf   CENTENA
BCD_02
   movlw   d'10'
   subwf   UNIDAD,W
   btfss   STATUS,C
   goto   BCD_Fin2
BCD_1A
   movwf   UNIDAD
   incf   DECENA,f
   movlw   d'10'
   subwf   DECENA,W
   btfss   STATUS,C
   goto   BCD_02
;BCD_2   clrf   DECENA
;   incf   CENTENA,f
;   goto   BCD_0
BCD_Fin2
   movf   UNIDAD,W
   movwf   DIG1
   movf   DECENA,W
   movwf   DIG2
   movlw   0X0A
   movwf   CENTENA               ;LETRA C
   movf   CENTENA,W
   movwf   DIG3
   movlw   0X0F
   movwf   LETRA            
   movf   LETRA,W
   movwf   DIG4
   goto   MULTIPLEXADO2
   return

;*******************************MULTIPLEXADO DE LOS DISPLAYS ROJOS***************************************************
MULTIPLEXADO1
      BCF         PTOA,5
      CALL      RETARDO
      movlw      0XF0
      movwf      PTOC
      movf      DIG4,w
      movwf      PTOC
      BSF         PTOC,4
      BSF         PTOC,5
      BSF         PTOC,6
      bcf         PTOC,7
      call      RETARDO
      btfsc      PTOB,3
      goto      ACTIVA
      goto      posit
ACTIVA   movlw      0xE8
      movwf      PTOB
      call      RETARDO
      movlw      0xF8
      movwf      PTOB
      movf      DIG3,W
      movwf      PTOC
      BSF         PTOC,4
      BSF         PTOC,5
      BSF         PTOC,6
      bcf         PTOC,7
      movlw      0xD8
      movwf      PTOB
      call      RETARDO
      movlw      0xF8
      movwf      PTOB
      movf      DIG2,W
      movwf      PTOC
      BSF         PTOC,4
      BSF         PTOC,5
      BSF         PTOC,6
      bcf         PTOC,7
      movlw      0xB8
      movwf      PTOB
      call      RETARDO
      movlw      0xF8
      movwf      PTOB
      movf      DIG1,W
      movwf      PTOC
      BSF         PTOC,4
      BSF         PTOC,5
      BSF         PTOC,6
      bcf         PTOC,7
      movlw      0x78
      movwf      PTOB
      call      RETARDO
      movlw      0xF8
      movwf      PTOB
      goto      sigo
posit   movlw      0x70
      movwf      PTOB
      call      RETARDO
      movlw      0xF0
      movwf      PTOB
      movf      DIG3,w
      movwf      PTOC
      BSF         PTOC,4
      BSF         PTOC,5
      BSF         PTOC,6
      bcf         PTOC,7
      movlw      0xD0
      movwf      PTOB
      call      RETARDO
      movlw      0xF0
      movwf      PTOB
      movf      DIG2,w
      movwf      PTOC
      BSF         PTOC,4
      BSF         PTOC,5
      BSF         PTOC,6
      bcf         PTOC,7
      movlw      0x70
      movwf      PTOB
      call      RETARDO
      movlw      0xF0
      movwf      PTOB
      movf      DIG1,w
      movwf      PTOC
      BSF         PTOC,4
      BSF         PTOC,5
      BSF         PTOC,6
      bcf         PTOC,7
      movlw      0xB0
      movwf      PTOB
      call      RETARDO
      movlw      0xF0
      movwf      PTOB
sigo   decfsz      ROTA,1
      goto      NO1
      movlw      0x7F
      movwf      ROTA
      decfsz      CONTC,1
      goto      MULTIPLEXADO1
      call      RETARDO
      movlw      0x02
      movwf      CONTC
      goto      ADQUISICION2
NO1      btfsc      PTOB,0
      goto      MULTIPLEXADO1
      goto      INICIO
      return

;******************************MULTIPLEXADO DE LOS SEGUNDOS DISPLAYS VERDES*******************************
MULTIPLEXADO2
      BCF         PTOA,5
      call      RETARDO
      BTFSC      PTOB,3
      BSF         PTOB,3         ; SI ES TEMPERATURA NEGATIVA, DEJA EL LED ENCENDIDO
      movlw      0xF0
      movwf      PTOC
      bcf         PTOC,7
      movf      DIG3,W
      movwf      PTOC
      BSF         PTOC,4
      BSF         PTOC,5
      bcf         PTOC,6
      bcf         PTOC,7
      call      RETARDO
      bSf         PTOC,6
      movf      DIG2,W
      movwf      PTOC
      BSF         PTOC,4
      bCf         PTOC,5
      BSF         PTOC,6
      bcf         PTOC,7
      call      RETARDO
      bSf         PTOC,5
      movf      DIG1,W
      movwf      PTOC
      bCf         PTOC,4
      BSF         PTOC,5
      BSF         PTOC,6
      bcf         PTOC,7
      call      RETARDO
      bSf         PTOC,4
      decfsz      ROTA,1
      goto      NO2
      movlw      0x64
      movwf      ROTA
      decfsz      CONTC,1
      goto      MULTIPLEXADO2
      movlw      0x0A
      movwf      CONTC
      goto      comien
NO2      btfsc      PTOB,0
      goto      MULTIPLEXADO2
      goto      INICIO
      return
      
;*****************************RUTINA DE RETARDO****************************

RETARDO   
RETARDA   MOVLW   .249
      MOVWF   REG1
      MOVLW   .249
      MOVWF   REG2
      MOVLW   .250
      MOVWF   REG3

TRES   clrwdt
      DECFSZ      REG3,1
      GOTO      TRES
DOS      DECFSZ      REG2,1
      GOTO      DOS
UNO   
      DECFSZ      REG1,1
      GOTO      UNO
      RETURN
;*******************************RETARDO PARA LA CONVERSION****************************************************

RETARDO2
         nop
         movlw      .240
         movwf      REG4

ciclo      
         nop
         decfsz      REG4,1
         goto      ciclo
         return

;*********************************RUTINA PARA LA CONFIGURACION DE MODULO ADC*************************************

CONFIG_ADC
      bsf      ESTADO,5
      movlw   b'00001101'         ;activamos el AN0 y AN1 como canal analogico,AN2 Y AN3 como Vref+ y Vref- y justificacion a la izquierda
      movwf   ADCON1
      bcf      ESTADO,5         ;VOLVEMOS AL BANCO 0
      movlw   b'01000001'         ;elegimos la frecuencia de reloj de Fosc/8 para la conversion
      movwf   ADCON0
      bsf      ADCON0,0         ;ENCIENDE EL ADC
      return

;*********************************RUTINA DE ADQUISICION***********************************************************

ADQUISICION1
      movlw   b'01000001'
      movwf   ADCON0            ;ACTIVAMOS EL CANAL AN0 Y Fosc/8
      bsf      ADCON0,2         ;ACTIVA EL BIT DE LA CONVERSION
ESPERA   btfsc   ADCON0,2         ;HA TERMINADO LA CONVERSION?
      goto   ESPERA            ;ESPERA A QUE TERMINE
      call   RETARDO2
      bcf      ESTADO,2
      movf   ADRESH,W         ;SI, CARGA EN W LOS 8 LBS
      goto   MULTIPLICACION1      ;CONVIERTELO A ESCALA
      bsf      ESTADO,5         ;PASAMOS AL BANCO 1
      movf   ADRESL,W         ;CARGA EN W LOS 2 LBS MENOS SIGNIFICATIVOS
      bcf      ADCON0,2         ;DESACTIVA EL BIT DE LA CONVERSION
      bcf      ESTADO,5         ;PASAMOS AL BANCO 0
      movwf   PTOC            ;LOS ENVIAS AL PUERTO C
      return

;********************************RUTINA DE ADQUISICION2 PARA LA ENTRADA AN1********************************
ADQUISICION2
      movlw   b'01001001'         ;FRECUENCIA DE RELOJ Fosc/8 Y ACTIVAMOS EL AN1
      movwf   ADCON0
      bsf      ADCON0,0         ;ENCIENDE EL ADC
      call   RETARDO2
      bsf      ADCON0,2         ;ACTIVA EL BIT DE LA CONVERSION
ESPERA2   btfsc   ADCON0,2         ;HA TERMINADO LA CONVERSION?
      goto   ESPERA2
      call   RETARDO2
      movf   ADRESH,W         ;SI, CARGA EN W LOS 8 LBS
      goto   MULTIPLICACION2
      bsf      ESTADO,5         ;PASAMOS AL BANCO 1
      movf   ADRESL,W         ;CARGA EN W LOS 2 LBS MENOS SIGNIFICATIVOS
      bcf      ADCON0,2         ;DESACTIVA EL BIT DE LA CONVERSION
      bcf      ESTADO,5         ;PASAMOS AL BANCO 0
      movwf   PTOC            ;LOS ENVIAS A LOS DISPLAYS
      return
;*******************************RUTINA PARA DIVIDIR EL VALOR ANALOGICO POR ? DEL PRIMER SENSOR *******************************
DIVISION
   movwf   AUXILIAR         ;CARGAMOS EL REGISTRO AUXILIAR CON EL VALOR DE ADRESH
   movlw   0x01            ;Y LO DIVIDIMOS POR 25
   movwf   DIVISOR
   clrf   COCIENTE         ;BORRAMOS EL REGISTRO DEL RESULTADO Y RESULTADOS ANTERIORES
DIV1
   incf   COCIENTE,1
   movf   DIVISOR,w
   subwf   AUXILIAR,1
   btfsc   STATUS,C
   goto   DIV1
   decfsz   COCIENTE,1
   goto   SEGUIMOS
   movf   MULTIPH,W
   xorlw   0x00
   btfsc   ESTADO,2
   goto   FIN
   decf   MULTIPH,1
   incf   COCIENTE,1
   goto   DIV1
FIN   addwf   AUXILIAR,W
   movwf   AUXILIAR
   movf   COCIENTE,W
   goto   RESTA
SEGUIMOS
   movf   MULTIPH,W
   xorlw   0x00
   btfsc   ESTADO,2
   goto   FIN
   decf   MULTIPH,1
   goto   DIV1
   return
;****************************RUTINA DE RESTA****************************

RESTA2   movf   RESTADO2,W
      subwf   COCIENTE,W
      btfss   ESTADO,0         ;SI HAY CARRY, ES QUE EL VALOR ES NEGATIVO
      goto   NEGATIVO2   
      movwf   RESULTADO
      movf   RESULTADO,W
      bcf      PTOB,3            ;APAGA EL LED DE NEGATIVO
      goto   Binario_BCD2
      return

NEGATIVO2
      movf   COCIENTE,W         ;CARGA EN W EL VALOR DEL RESULTADO DE LA DIVISION
      subwf   RESTADO2,W         ;Y LO RESTAMOS CON EL VALOR QUE TENEMOS CARGADO EN RESTADO
      movwf   RESULTADO
      movf   RESULTADO,W
      bsf      PTOB,3            ;ACTIVA LE LED DE NEGATIVO
      goto   Binario_BCD2
      return

RESTA   movf   RESTADO,W
      subwf   COCIENTE,W
      btfss   ESTADO,0         ;SI HAY CARRY, ES QUE EL VALOR ES NEGATIVO
      goto   NEGATIVO   
      movwf   RESULTADO
      movf   RESULTADO,W
      bcf      PTOB,3            ;APAGA EL LED DE NEGATIVO
      goto   Binario_BCD1
      return

NEGATIVO
      movf   COCIENTE,W         ;CARGA EN W EL VALOR DEL RESULTADO DE LA DIVISION
      subwf   RESTADO,W         ;Y LO RESTAMOS CON EL VALOR QUE TENEMOS CARGADO EN RESTADO
      movwf   RESULTADO
      movf   RESULTADO,W
      bsf      PTOB,3            ;ACTIVA LE LED DE NEGATIVO
      goto   Binario_BCD1
      return
;******************************RUTINA PARA LA DIVISION DEL SEGUNDO SENSOR************************
DIVISION2
   movwf   AUXILIAR         ;CARGAMOS EL REGISTRO AUXILIAR CON EL VALOR DE ADRESH
   movlw   0x01            ;Y LO DIVIDIMOS POR ?
   movwf   DIVISOR
   clrf   COCIENTE         ;BORRAMOS EL REGISTRO DEL RESULTADO Y RESULTADOS ANTERIORES
DIV2
   incf   COCIENTE,1
   movf   DIVISOR,w
   subwf   AUXILIAR,1
   btfsc   STATUS,C
   goto   DIV2
   decfsz   COCIENTE,1
   goto   SEGUIMOS2
   movf   MULTIPH,W
   xorlw   0x00
   btfsc   ESTADO,2
   goto   FIN2
   decf   MULTIPH,1
   incf   COCIENTE,1
   goto   DIV2
FIN2
   addwf   AUXILIAR,W
   movwf   AUXILIAR
   movf   COCIENTE,W
   goto   RESTA2
SEGUIMOS2
   movf   MULTIPH,W
   xorlw   0x00
   btfsc   ESTADO,2
   goto   FIN2
   decf   MULTIPH,1
   goto   DIV2
   return

;*********************************RUTINA PARA MULTIPLICAR POR 10 EL RESULTADO DE LA DIVISION1 *********************
MULTIPLICACION1
      clrf   MULTIP
      movlw   0x01
      movwf   PRODUCTO
MULTI0   movf   ADRESH,W
      movwf   COCIENTE
MULTI1   addwf   MULTIP,1
      decfsz   PRODUCTO,1
      btfsc   ESTADO,0
      goto   FIN_MULTIP1
      goto   MULTI1
FIN_MULTIP1
      btfsc   ESTADO,0
      incf   MULTIPH,1            ;SI HAY ACARREO ES POR QUE EL NUMERO ES MAYOR DE 255
      movf   PRODUCTO,W
      xorlw   0x00
      btfsc   ESTADO,2
      goto   TERMINO
      bcf      ESTADO,0
      goto   MULTI0
TERMINO   movf   MULTIP,W
      goto   DIVISION
   
;**********************************RUTINA PARA MULTIPLICAR POR ? EL RESULTADO DE DIVISION2************************
MULTIPLICACION2
      clrf   MULTIP
      movlw   0x01
      movwf   PRODUCTO
MULTI3   movf   ADRESH,W
      movwf   COCIENTE
MULTI2   addwf   MULTIP,1
      decfsz   PRODUCTO,1
      btfsc   ESTADO,0
      goto   FIN_MULTIP2
      goto   MULTI2
FIN_MULTIP2
      btfsc   ESTADO,0
      incf   MULTIPH,1            ;SI HAY ACARREO ES POR QUE EL NUMERO ES MAYOR DE 255
      movf   PRODUCTO,W
      xorlw   0x00
      btfsc   ESTADO,2
      goto   TERMINO2
      bcf      ESTADO,0
      goto   MULTI3
TERMINO2
      movf   MULTIP,W
      goto   DIVISION2

END

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Problemas con el simulador de MPLAB
« Respuesta #4 en: 26 de Octubre de 2011, 17:27:07 »
¿En qué parte del programa se para la simulación? ¿en el mismo breakpoint? ¿en otro?.

Por las dudas, borrá todos los breakpoint y volvé a crear los que necesitas. A mi me ha pasado que, he modificado el programa en donde tenía un breakpoint, este desaparecía pero seguía activo. Me causó más de un dolor de cabeza.

Una de las causas por la que para la simulación, es por desborde de la pila. Chequea que no te esté pasando eso.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado electronico39

  • PIC10
  • *
  • Mensajes: 46
Re: Problemas con el simulador de MPLAB
« Respuesta #5 en: 27 de Octubre de 2011, 14:08:44 »
Gracias Leon Pic por contestar, ya realicé lo de desactivar y borrar todos los breakpoint  y poner nuevos, y sigue parandose en el mismo sitio, y lo que si creo, es que puede ser por desborde de la pila, pero ahora mismo no se como se chequea. Lo miraré y probaré a ponerlo en marcha y os comento.

Por cierto, este programa funciona mal ya que hice varias modificaciones para probar si lo solucionaba, y cuando grabé en el Pic no funciona bien. Cuando lo resuelva os paso el bueno.

Un saludo

Desconectado electronico39

  • PIC10
  • *
  • Mensajes: 46
Re: Problemas con el simulador de MPLAB
« Respuesta #6 en: 29 de Octubre de 2011, 13:42:17 »
Bueno, parece ser que lo tengo corregido, y efectivamente era la pila que se desbordaba. Lo tengo rulando mas de tres horas y sin ningún error y todo correcto. Primero lo probé en el simulador de MPLAB, y muy bien, podía simularlo perfectamente con breakpoint en cualquier punto, que se paraba en el breakpiont. Para probar el tiempo puse un breakpoint para cuando llegase a 60 minutos y perfecto.
Así es que lo grabé en el PIC, y al protoboard. Que MARAVILLA, cuando ves que funciona correctamente.

Aquí os dejo el código para el que quiera y pueda montárselo, un saludo y muchas gracias. Estaré en contacto para ayudaros en lo que yo pueda. Mi correo electronico es: jm1polan@hotmail.com

EL CÓDIGO:

;*******************************************************************
;*** RELOJ DIGITAL CON DISPLAYS DE 7 SEGMENTOS Y DOS TERMOMETROS ***
;*** CON DOS SENSORES LM335 DE -50ºC A 100ºC                     ***
;*******************************************************************

   

LIST      P=16F876
#INCLUDE   <P16F876.INC>

INDO      EQU         0X00
TMR0      EQU         0X01
PCL         EQU         0X02
FSR         EQU         0X04
ESTADO      EQU         0X03
PTOA      EQU         0X05
PTOB      EQU         0X06
PTOC      EQU         0X07
TRISA      EQU         0X85
TRISB      EQU         0X86
TRISC      EQU         0X87
OPCION      EQU         0X81
INTCON      EQU         0X0B
ADCON0      EQU         0X1F
ADCON1      EQU         0X9F
ADRESH      EQU         0X1E
ADRESL      EQU         0X9E
BINARIO      EQU         0X20
CENTENA      EQU         0X21
DECENA      EQU         0X22
UNIDAD      EQU         0X23
DIG1      EQU         0X24
DIG2      EQU         0X25
DIG3      EQU         0X26
DIG4      EQU         0X27
ROTA      EQU         0X28
REG1      EQU         0X29
REG2      EQU         0X2A
REG3      EQU         0X2B
REG4      EQU         0X2C
REG5      EQU         0X39
REG6      EQU         0X3A
REG7      EQU         0X3B
REG8      EQU         0X3C
DIVIDENDO   EQU         0X2D
DIVISOR      EQU         0X2E
COCIENTE   EQU         0X2F
AUXILIAR   EQU         0X30
DATO      EQU         0X31
MULTIP      EQU         0X32
PRODUCTO   EQU         0X33
RESULTADO   EQU         0X34
RESTADO      EQU         0X35
RESTADO2   EQU         0X36
LETRA      EQU         0X37
MULTIPH      EQU         0X38
MULTIPL      EQU         0X3D
CONTA      EQU         0X3E         ;CONTADOR DE SEGUNDOS
CONTB      EQU         0X3F
CONTC      EQU         0X40
TEMP1      EQU         0X41         ;REGISTROS TEMPORALES PARA GUARDAR DATOS Y DESPUES DE
TEMP2      EQU         0X42         ;LAS INTERRUPCIONES RECUPERARLOS
TEMP3      EQU         0X43
TEMP4      EQU         0X44
TEMP5      EQU         0X45
TIEMPO      EQU         0X46

RESET      ORG         0X00
         GOTO      INICIO
         ORG         0X04            ;AQUI ES DONDE EMPIEZA LA INTERRUPCION

hayint   movwf   TEMP5
      btfss   INTCON,2      ;se ha activado la interrupcion por el TMR0?
      goto   inicia         ;si no es por TMR0 comprueva si es por el puerto B
      nop
      nop
bien   decfsz   REG5,1         ;registro que decrementa cada vez que se desborda el TMR0
      goto   borra
      goto   compr
inicia   btfsc    PTOB,0
      goto   sal
      call   RETARDO
Phora   btfsc   PTOB,0
      goto   inicia
      clrf   CONTA         ;reseteamos el contador de segundos, para que empiece cuando soltemos
      btfsc   PTOB,1         ;pulsador de incrementar minutos
      goto   hora
      call   RETARDO
      btfss   PTOB,1
      goto   Phora
      incf   TEMP1,1
      movf   TEMP1,w
      movwf   PTOC
      BSF      PTOC,4
      BSF      PTOC,5
      BSF      PTOC,6
      xorlw   0x0a
      btfsc   ESTADO,2
      goto   decena
      goto   comien
      goto   inicia
decena   clrf   TEMP1
      call   RETARDO
      incf   TEMP2,1
      movf   TEMP2,w
      movwf   PTOC
      BSF      PTOC,4
      BSF      PTOC,5
      BSF      PTOC,6
      xorlw   0x06
      btfsc   ESTADO,2
      clrf   TEMP2
      goto   comien
      goto   inicia
hora   btfsc   PTOB,2         ;pulsador de incrementar horas
      goto   comien
      call   RETARDO
      btfss   PTOB,2
      goto   hora
      incf   TEMP3,1
      movf   TEMP3,w
      movwf   PTOC
      BSF      PTOC,4
      BSF      PTOC,5
      BSF      PTOC,6
      xorlw   0x04
      btfsc   ESTADO,2
      goto   son24
      movf   TEMP3,w
      xorlw   0x0a
      btfsc   ESTADO,2
      goto   no24
      goto   comien
      goto   inicia
sal      bcf      INTCON,1         ;borra la bandera de interrupcion del puerto B
borra   bcf      INTCON,2         ;borra la bandera de interrupcion del TMR0
      bcf      INTCON,0         ;borra la bandera de interrupcion por cambio de RB4 A RB7
      movlw      0x3C         
      movwf      REG6
      movlw      0xd7
      movwf      TMR0
      movf      TEMP5,W
      clrwdt
      retfie

INICIO
         BSF         ESTADO,5         ;PASAMOS AL BANCO 1
         MOVLW      0X0F            ;PUERTO A (AN0 Y AN1 ENTRADAS) EL RESTO SALIDAS
         MOVWF      TRISA
         MOVLW      0X07
         MOVWF      TRISB            ;PUERTO B TRES ENTRADAS Y EL RESTO SALIDAS
         CLRF      TRISC            ;PUERTO C COMO SALIDAS
         MOVLW      0X80
         MOVWF      OPCION
         MOVLW      0X0D
         MOVWF      ADCON1
         BCF         ESTADO,5
         MOVLW      0XB0
         MOVWF      INTCON            ;HABILITA LAS INTERRUPCIONES POR PTOB Y TMR0
         MOVLW      0X41
         MOVWF      ADCON0
         BCF         ESTADO,0
         BCF         ESTADO,1
         BCF         ESTADO,2
         CLRF      PTOA
         CLRF      PTOB
         CLRF      PTOC
         CLRF      ADRESH
         CLRF      ADRESL
         MOVLW      0X20
         MOVWF      FSR
OTRO      CLRF      INDO
         INCF      FSR
         MOVF      FSR,W
         XORLW      0X47
         BTFSS      ESTADO,2
         GOTO      OTRO
         MOVLW      0X64
         MOVWF      REG5
         MOVLW      0X3C
         MOVWF      REG6
         MOVLW      0Xd7
         MOVWF      TMR0
         MOVLW      0X8E
         MOVWF      RESTADO
         MOVLW      0X8E
         MOVWF      RESTADO2
         MOVLW      0x64
         MOVWF      ROTA
         MOVLW      0X32
         MOVWF      CONTB
         MOVLW      0X09
         MOVWF      CONTC
         GOTO      comien
         RETURN

MARCAT      MOVLW      0X45
         MOVWF      ROTA
         MOVLW      0X03
         MOVWF      CONTC
         BCF         PTOA,5
         CALL      CONFIG_ADC
         BSF         ADCON0,0
         CALL      RETARDO2
         goto      ADQUISICION1
         RETURN
      


;========================== rutina que cuenta los milisegundos hasta llegar a un segundo=======================
;========================== encendemos y apagamos los leds que marcan los segundos cada =======================
;========================== 500ms por el bit 5 del puerto A ===================================================   
compr
      movlw   0x64      ;carga con 100 el registro reg5
      movwf   REG5         
mas      decfsz   CONTB,1
      goto   borra
      movlw   0x32      ;carga con 50 el registro CONTB
      movwf   CONTB
      incf   REG7,1
      movf   REG7,w
      xorlw   0x01      ;si es uno, son 500ms
      btfsc   ESTADO,2
      goto   LED
      goto   noleds
noleds   movf   REG7,W
      xorlw   0x02
      btfsc   ESTADO,2
      goto   segundo
      goto   borra
      return

LED      movf   DIG3,W      ;comprueva si esta marcando temperatura
      xorlw   0x0A      ; si es asi, no enciendas los leds
      btfsc   ESTADO,2
      GOTO   noleds
      BSF      PTOA,5
      goto   borra
      return

;=========================rutina que cuenta los segundos hasta llegar a 60s======================
      
segundo   
      BCF      PTOA,5
      clrf   REG7
      incf   CONTA,1
      movf   CONTA,w
      xorlw   0x3c         ;COMPARA SI LLEGA A 60
      btfsc   ESTADO,2
      goto   minuto
      goto   borra
      return

;=========================COMENZAMOS EL MULTIPLEXADO DE LOS DISPLAYS DEL RELOJ===================
comien   CLRF      DIG3
      MOVLW      0XF0
      MOVWF      PTOC
      BSF         PTOC,7      ;APAGA EL PUNTO DE GRADOS
      movf      TEMP4,w
      xorlw      0x00
      btfsc      ESTADO,2
      goto      tres
cuatro   movlw      0xF0
      movwf      PTOB
      movf      TEMP4,W
      movwf      PTOC
      BSF         PTOC,7
      BSF         PTOC,6
      BSF         PTOC,5
      BSF         PTOC,4
      movlw      0x70
      movwf      PTOB
      call      RETARDO
tres   movlw      0xF0
      movwf      PTOB
      movf      TEMP3,w
      movwf      PTOC
      BSF         PTOC,7
      BSF         PTOC,6
      BSF         PTOC,5
      BSF         PTOC,4
      movlw      0xB0
      movwf      PTOB
      call      RETARDO
      movlw      0xF0
      movwf      PTOB
      movf      TEMP2,w
      movwf      PTOC
      BSF         PTOC,7
      BSF         PTOC,6
      BSF         PTOC,5
      BSF         PTOC,4
      movlw      0xD0
      movwf      PTOB
      call      RETARDO
      movlw      0xF0
      movwf      PTOB
      movf      TEMP1,w
      movwf      PTOC
      BSF         PTOC,7
      BSF         PTOC,6
      BSF         PTOC,5
      BSF         PTOC,4
      movlw      0xE0
      movwf      PTOB
      call      RETARDO
      movlw      0xF0
      movwf      PTOB
      btfsc      PTOB,0            ;si se pulsa el pulsador de puesta en
      goto      TEMP            ;en hora, se produce una interrupcion
      goto      hayint            ;por RB0.
TEMP   btfsc      INTCON,1
      goto      sal
      btfsc      INTCON,2
      goto      borra
      decfsz      ROTA
      goto      comien
      movlw      0x64
      movwf      ROTA
      decfsz      CONTC
      goto      comien
      call      RETARDO
      goto      MARCAT
      return


minuto    
      clrf      CONTA
      incf      TEMP1,1
      movf      TEMP1,w
      movwf      PTOC
      xorlw      0x0a
      btfsc      ESTADO,2
      goto      decen
      goto      borra
      return
      

decen   clrf      TEMP1
      movf      0x00
      movwf      PTOC
      incf      TEMP2,1
      movf      TEMP2,w
      movwf      PTOC
      xorlw      0x06
      btfsc      ESTADO,2
      goto      cente
      goto      borra
      return
      
cente   clrf      TEMP1
      clrf      TEMP2
      movf      0x00
      movwf      PTOC
      incf      TEMP3,1
      movf      TEMP3,w
      movwf      PTOC
      xorlw      0x04
      btfsc      ESTADO,2
      goto      compru
      movf      TEMP3,w
      xorlw      0x0a
      btfsc      ESTADO,2
      goto      dech
      goto      borra
      return

compru   movf      TEMP4,w
      xorlw      0x02
      btfsc      ESTADO,2
      goto      cero
      goto      borra
      goto      comien
      return   

cero   clrf      CONTA
      clrf      TEMP1
      clrf      TEMP2
      clrf      TEMP3
      clrf      TEMP4
      goto      borra
      goto      comien
      return

son24   movf   TEMP4,w
      xorlw   0x02
      btfsc   ESTADO,2
      goto   si24
      goto   comien
      return

si24   clrf   TEMP3
      clrf   TEMP4
      goto   inicia
no24   clrf   TEMP3
      call   RETARDO
      incf   TEMP4,1
      movf   TEMP4,w
      movwf   PTOC
      goto   comien
      return

dech   clrf      TEMP1
      clrf      TEMP2
      clrf      TEMP3
      bcf         ESTADO,0
      movf      0x00
      movwf      PTOC
      incf      TEMP4,1
      movf      TEMP4,w
      movwf      PTOC
      goto      borra
      goto      comien
      return

;************************RUTINA PARA CONVERTIR BINARIO A BCD**************************
Binario_BCD1
   movwf   BINARIO
   movwf   UNIDAD
   clrf   DECENA
   clrf   CENTENA
BCD_01
   movlw   d'10'
   subwf   UNIDAD,W
   btfss   STATUS,C
   goto   BCD_Fin1
BCD_1
   movwf   UNIDAD
   incf   DECENA,f
   movlw   d'10'
   subwf   DECENA,W
   btfss   STATUS,C
   goto   BCD_01
BCD_Fin1
   movf   UNIDAD,W
   movwf   DIG1
   movf   DECENA,W
   movwf   DIG2
   movlw   0X0A
   movwf   CENTENA               ;LETRA C
   movf   CENTENA,W
   movwf   DIG3
   movlw   0x0F
   movwf   LETRA
   movf   LETRA,W
   movwf   DIG4
   goto   MULTIPLEXADO1
   return

;*********************************RUTINA PARA CONVERTIR DE BINARIO A BCD**************************************
Binario_BCD2
   movwf   BINARIO
   movwf   UNIDAD
   clrf   DECENA
   clrf   CENTENA
BCD_02
   movlw   d'10'
   subwf   UNIDAD,W
   btfss   STATUS,C
   goto   BCD_Fin2
BCD_1A
   movwf   UNIDAD
   incf   DECENA,f
   movlw   d'10'
   subwf   DECENA,W
   btfss   STATUS,C
   goto   BCD_02
BCD_Fin2
   movf   UNIDAD,W
   movwf   DIG1
   movf   DECENA,W
   movwf   DIG2
   movlw   0X0A
   movwf   CENTENA               ;LETRA C
   movf   CENTENA,W
   movwf   DIG3
   movlw   0X0F
   movwf   LETRA            
   movf   LETRA,W
   movwf   DIG4
   goto   MULTIPLEXADO2
   return

;*******************************MULTIPLEXADO DE LOS DISPLAYS EN ROJO***************************************************
MULTIPLEXADO1
      BCF         PTOA,5
      CALL      RETARDO
      movlw      0XF0
      movwf      PTOC
      movf      DIG4,w
      movwf      PTOC
      BSF         PTOC,4
      BSF         PTOC,5
      BSF         PTOC,6
      bcf         PTOC,7
      call      RETARDO
      btfsc      PTOB,3
      goto      ACTIVA
      goto      posit
ACTIVA   movlw      0xE8
      movwf      PTOB
      call      RETARDO
      movlw      0xF8
      movwf      PTOB
      movf      DIG3,W
      movwf      PTOC
      BSF         PTOC,4
      BSF         PTOC,5
      BSF         PTOC,6
      bcf         PTOC,7
      movlw      0xD8
      movwf      PTOB
      call      RETARDO
      movlw      0xF8
      movwf      PTOB
      movf      DIG2,W
      movwf      PTOC
      BSF         PTOC,4
      BSF         PTOC,5
      BSF         PTOC,6
      bcf         PTOC,7
      movlw      0xB8
      movwf      PTOB
      call      RETARDO
      movlw      0xF8
      movwf      PTOB
      movf      DIG1,W
      movwf      PTOC
      BSF         PTOC,4
      BSF         PTOC,5
      BSF         PTOC,6
      bcf         PTOC,7
      movlw      0x78
      movwf      PTOB
      call      RETARDO
      movlw      0xF8
      movwf      PTOB
      goto      sigo
posit   movlw      0x70
      movwf      PTOB
      call      RETARDO
      movlw      0xF0
      movwf      PTOB
      movf      DIG3,w
      movwf      PTOC
      BSF         PTOC,4
      BSF         PTOC,5
      BSF         PTOC,6
      bcf         PTOC,7
      movlw      0xD0
      movwf      PTOB
      call      RETARDO
      movlw      0xF0
      movwf      PTOB
      movf      DIG2,w
      movwf      PTOC
      BSF         PTOC,4
      BSF         PTOC,5
      BSF         PTOC,6
      bcf         PTOC,7
      movlw      0x70
      movwf      PTOB
      call      RETARDO
      movlw      0xF0
      movwf      PTOB
      movf      DIG1,w
      movwf      PTOC
      BSF         PTOC,4
      BSF         PTOC,5
      BSF         PTOC,6
      bcf         PTOC,7
      movlw      0xB0
      movwf      PTOB
      call      RETARDO
      movlw      0xF0
      movwf      PTOB
sigo   decfsz      ROTA,1
      goto      NO1
      movlw      0x7F
      movwf      ROTA
      decfsz      CONTC,1
      goto      MULTIPLEXADO1
      call      RETARDO
      movlw      0x02
      movwf      CONTC
      goto      ADQUISICION2
NO1      btfsc      PTOB,0
      goto      MULTIPLEXADO1
      goto      INICIO
      return

;******************************MULTIPLEXADO DE LOS SEGUNDOS DISPLAYS EN VERDE*******************************
MULTIPLEXADO2
      BCF         PTOA,5
      call      RETARDO
      BTFSC      PTOB,3
      BSF         PTOB,3         ; SI ES TEMPERATURA NEGATIVA, DEJA EL LED ENCENDIDO
      movlw      0xF0
      movwf      PTOC
      bcf         PTOC,7
      movf      DIG3,W
      movwf      PTOC
      BSF         PTOC,4
      BSF         PTOC,5
      bcf         PTOC,6
      bcf         PTOC,7
      call      RETARDO
      bSf         PTOC,6
      movf      DIG2,W
      movwf      PTOC
      BSF         PTOC,4
      bCf         PTOC,5
      BSF         PTOC,6
      bcf         PTOC,7
      call      RETARDO
      bSf         PTOC,5
      movf      DIG1,W
      movwf      PTOC
      bCf         PTOC,4
      BSF         PTOC,5
      BSF         PTOC,6
      bcf         PTOC,7
      call      RETARDO
      bSf         PTOC,4
      decfsz      ROTA,1
      goto      NO2
      movlw      0x64
      movwf      ROTA
      decfsz      CONTC,1
      goto      MULTIPLEXADO2
      movlw      0x0A
      movwf      CONTC
      goto      comien
NO2      btfsc      PTOB,0
      goto      MULTIPLEXADO2
      goto      INICIO
      return
      
;*****************************RUTINA DE RETARDO PARA EL MULTIPLEXADO****************************

RETARDO   
RETARDA   MOVLW   .249
      MOVWF   REG1
      MOVLW   .249
      MOVWF   REG2
      MOVLW   .250
      MOVWF   REG3

TRES   clrwdt
      DECFSZ      REG3,1
      GOTO      TRES
DOS      DECFSZ      REG2,1
      GOTO      DOS
UNO   
      DECFSZ      REG1,1
      GOTO      UNO
      RETURN
;*******************************RETARDO PARA LA CONVERSION****************************************************

RETARDO2
         nop
         movlw      .240
         movwf      REG4

ciclo      clrwdt
         nop
         decfsz      REG4,1
         goto      ciclo
         return

;*********************************RUTINA PARA LA CONFIGURACION DE MODULO ADC*************************************

CONFIG_ADC
      bsf      ESTADO,5
      movlw   b'00001101'         ;activamos el AN0 y AN1 como canal analogico,AN2 Y AN3 como Vref+ y Vref- y justificacion a la izquierda
      movwf   ADCON1
      bcf      ESTADO,5         ;VOLVEMOS AL BANCO 0
      movlw   b'01000001'         ;elegimos la frecuencia de reloj de Fosc/8 para la conversion
      movwf   ADCON0
      bsf      ADCON0,0         ;ENCIENDE EL ADC
      return

;*********************************RUTINA DE ADQUISICION***********************************************************

ADQUISICION1
      movlw   b'01000001'
      movwf   ADCON0            ;ACTIVAMOS EL CANAL AN0 Y Fosc/8
      bsf      ADCON0,2         ;ACTIVA EL BIT DE LA CONVERSION
ESPERA   btfsc   ADCON0,2         ;HA TERMINADO LA CONVERSION?
      goto   ESPERA            ;ESPERA A QUE TERMINE
      call   RETARDO2
      bcf      ESTADO,2
      movf   ADRESH,W         ;SI, CARGA EN W LOS 8 LBS
      goto   MULTIPLICACION1      ;CONVIERTELO A ESCALA
      bsf      ESTADO,5         ;PASAMOS AL BANCO 1
      movf   ADRESL,W         ;CARGA EN W LOS 2 LBS MENOS SIGNIFICATIVOS
      bcf      ADCON0,2         ;DESACTIVA EL BIT DE LA CONVERSION
      bcf      ESTADO,5         ;PASAMOS AL BANCO 0
      movwf   PTOC            ;LOS ENVIAS AL PUERTO C
      return

;********************************RUTINA DE ADQUISICION2 PARA LA ENTRADA AN1********************************
ADQUISICION2
      movlw   b'01001001'         ;FRECUENCIA DE RELOJ Fosc/8 Y ACTIVAMOS EL AN1
      movwf   ADCON0
      bsf      ADCON0,0         ;ENCIENDE EL ADC
      call   RETARDO2
      bsf      ADCON0,2         ;ACTIVA EL BIT DE LA CONVERSION
ESPERA2   btfsc   ADCON0,2         ;HA TERMINADO LA CONVERSION?
      goto   ESPERA2
      call   RETARDO2
      movf   ADRESH,W         ;SI, CARGA EN W LOS 8 LBS
      goto   MULTIPLICACION2
      bsf      ESTADO,5         ;PASAMOS AL BANCO 1
      movf   ADRESL,W         ;CARGA EN W LOS 2 LBS MENOS SIGNIFICATIVOS
      bcf      ADCON0,2         ;DESACTIVA EL BIT DE LA CONVERSION
      bcf      ESTADO,5         ;PASAMOS AL BANCO 0
      movwf   PTOC            ;LOS ENVIAS A LOS DISPLAYS
      return
;*******************************RUTINA PARA DIVIDIR EL VALOR ANALOGICO POR ? DEL PRIMER SENSOR *******************************
DIVISION
   movwf   AUXILIAR         ;CARGAMOS EL REGISTRO AUXILIAR CON EL VALOR DE ADRESH
   movlw   0x01            ;Y LO DIVIDIMOS POR 25
   movwf   DIVISOR
   clrf   COCIENTE         ;BORRAMOS EL REGISTRO DEL RESULTADO Y RESULTADOS ANTERIORES
DIV1
   incf   COCIENTE,1
   movf   DIVISOR,w
   subwf   AUXILIAR,1
   btfsc   STATUS,C
   goto   DIV1
   decfsz   COCIENTE,1
   goto   SEGUIMOS
   movf   MULTIPH,W
   xorlw   0x00
   btfsc   ESTADO,2
   goto   FIN
   decf   MULTIPH,1
   incf   COCIENTE,1
   goto   DIV1
FIN   addwf   AUXILIAR,W
   movwf   AUXILIAR
   movf   COCIENTE,W
   goto   RESTA
SEGUIMOS
   movf   MULTIPH,W
   xorlw   0x00
   btfsc   ESTADO,2
   goto   FIN
   decf   MULTIPH,1
   goto   DIV1
   return
;****************************RUTINA DE RESTA****************************

RESTA2   movf   RESTADO2,W
      subwf   COCIENTE,W
      btfss   ESTADO,0         ;SI HAY CARRY, ES QUE EL VALOR ES NEGATIVO
      goto   NEGATIVO2   
      movwf   RESULTADO
      movf   RESULTADO,W
      bcf      PTOB,3            ;APAGA EL LED DE NEGATIVO
      goto   Binario_BCD2
      return

NEGATIVO2
      movf   COCIENTE,W         ;CARGA EN W EL VALOR DEL RESULTADO DE LA DIVISION
      subwf   RESTADO2,W         ;Y LO RESTAMOS CON EL VALOR QUE TENEMOS CARGADO EN RESTADO
      movwf   RESULTADO
      movf   RESULTADO,W
      bsf      PTOB,3            ;ACTIVA LE LED DE NEGATIVO
      goto   Binario_BCD2
      return

RESTA   movf   RESTADO,W
      subwf   COCIENTE,W
      btfss   ESTADO,0         ;SI HAY CARRY, ES QUE EL VALOR ES NEGATIVO
      goto   NEGATIVO   
      movwf   RESULTADO
      movf   RESULTADO,W
      bcf      PTOB,3            ;APAGA EL LED DE NEGATIVO
      goto   Binario_BCD1
      return

NEGATIVO
      movf   COCIENTE,W         ;CARGA EN W EL VALOR DEL RESULTADO DE LA DIVISION
      subwf   RESTADO,W         ;Y LO RESTAMOS CON EL VALOR QUE TENEMOS CARGADO EN RESTADO
      movwf   RESULTADO
      movf   RESULTADO,W
      bsf      PTOB,3            ;ACTIVA LE LED DE NEGATIVO
      goto   Binario_BCD1
      return
;******************************RUTINA PARA LA DIVISION DEL SEGUNDO SENSOR************************
DIVISION2
   movwf   AUXILIAR         ;CARGAMOS EL REGISTRO AUXILIAR CON EL VALOR DE ADRESH
   movlw   0x01            ;Y LO DIVIDIMOS POR ?
   movwf   DIVISOR
   clrf   COCIENTE         ;BORRAMOS EL REGISTRO DEL RESULTADO Y RESULTADOS ANTERIORES
DIV2
   incf   COCIENTE,1
   movf   DIVISOR,w
   subwf   AUXILIAR,1
   btfsc   STATUS,C
   goto   DIV2
   decfsz   COCIENTE,1
   goto   SEGUIMOS2
   movf   MULTIPH,W
   xorlw   0x00
   btfsc   ESTADO,2
   goto   FIN2
   decf   MULTIPH,1
   incf   COCIENTE,1
   goto   DIV2
FIN2
   addwf   AUXILIAR,W
   movwf   AUXILIAR
   movf   COCIENTE,W
   goto   RESTA2
SEGUIMOS2
   movf   MULTIPH,W
   xorlw   0x00
   btfsc   ESTADO,2
   goto   FIN2
   decf   MULTIPH,1
   goto   DIV2
   return

;*********************************RUTINA PARA MULTIPLICAR POR 10 EL RESULTADO DE LA DIVISION1 *********************
MULTIPLICACION1
      clrf   MULTIP
      movlw   0x01
      movwf   PRODUCTO
MULTI0   movf   ADRESH,W
      movwf   COCIENTE
MULTI1   addwf   MULTIP,1
      decfsz   PRODUCTO,1
      btfsc   ESTADO,0
      goto   FIN_MULTIP1
      goto   MULTI1
FIN_MULTIP1
      btfsc   ESTADO,0
      incf   MULTIPH,1            ;SI HAY ACARREO ES POR QUE EL NUMERO ES MAYOR DE 255
      movf   PRODUCTO,W
      xorlw   0x00
      btfsc   ESTADO,2
      goto   TERMINO
      bcf      ESTADO,0
      goto   MULTI0
TERMINO   movf   MULTIP,W
      goto   DIVISION
   
;**********************************RUTINA PARA MULTIPLICAR POR ? EL RESULTADO DE DIVISION2************************
MULTIPLICACION2
      clrf   MULTIP
      movlw   0x01
      movwf   PRODUCTO
MULTI3   movf   ADRESH,W
      movwf   COCIENTE
MULTI2   addwf   MULTIP,1
      decfsz   PRODUCTO,1
      btfsc   ESTADO,0
      goto   FIN_MULTIP2
      goto   MULTI2
FIN_MULTIP2
      btfsc   ESTADO,0
      incf   MULTIPH,1            ;SI HAY ACARREO ES POR QUE EL NUMERO ES MAYOR DE 255
      movf   PRODUCTO,W
      xorlw   0x00
      btfsc   ESTADO,2
      goto   TERMINO2
      bcf      ESTADO,0
      goto   MULTI3
TERMINO2
      movf   MULTIP,W
      goto   DIVISION2

END


Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 627
Re: Problemas con el simulador de MPLAB
« Respuesta #7 en: 29 de Octubre de 2011, 18:36:53 »
Felicitaciones por que lograste corregirlo, y gracias por compartirlo

Saludos



La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado electronico39

  • PIC10
  • *
  • Mensajes: 46
Re: Problemas con el simulador de MPLAB
« Respuesta #8 en: 30 de Octubre de 2011, 13:44:50 »
Gracias sander por la felicitación, intentaré aportar ayuda en lo que pueda, soy muy novato en esto y la verdad no se mucho, aprendo poco a poco.

Saludos

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Problemas con el simulador de MPLAB
« Respuesta #9 en: 30 de Octubre de 2011, 19:49:09 »
Me alegro que lo hayas solucionado. Y gracias por compartir el programa. :-/ :-/
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Problemas con el simulador de MPLAB
« Respuesta #10 en: 31 de Octubre de 2011, 06:22:04 »
Gracias por compartirlo.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Problemas con el simulador de MPLAB
« Respuesta #11 en: 31 de Octubre de 2011, 17:10:34 »
Gracias por el aporte electronico39.

Saludos.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado electronico39

  • PIC10
  • *
  • Mensajes: 46
Re: Problemas con el simulador de MPLAB
« Respuesta #12 en: 01 de Noviembre de 2011, 13:59:59 »
Gracias a todos, ahora voy a modificar el programa para que grave en la memoria eeprom la hora, minutos y segundos para que en los cortes eléctricos no pierda mucho tiempo, solo tenga un ligero retraso.


 

anything