En proteus simula correctamente, pero en realidad no funciona

GAWAIN dijo:
Hola a todos:
......
Ya he cambiado varias veces el PIC pero sigue igual, tambien he cambiado la forma de estas instrucciones y nada.

De acuerdo a esto, mi duda es si este problema se podria deber a algunas de las siguientes causas:

a.- Demasiadas lineas de programacion: El software tiene un total de 157 lineas. Si fuese esto mi pregunta es ¿cuantas son la maxima cantidad de lineas permitidas por este pic?. En m caso cada linea es una instruccion incluyendo el encabezado del programa.

Entonces que quedaría para este programa que funciona de maravillas 365 x 24hs y tiene al microcontolador usado a mas de 97%.(es de una central de alarma multi-funcion).

GAWAIN dijo:
b.- Estoy utilizando demasiados IF -- END IF: Cabria la mima pregunta en el sentido si hay un limite de veces de uso de esta instruccion.

Mucho les sabria agradecer su ayuda.

Saludos, ...

Como te dijeron anteriormente si el compilador no te da errores no es problemas de IF...etc; debes averiguar que etas haciendo mal en la vida real o no para que este no funcione allí.
Saludos.

Ric.
 

Adjuntos

  • Prog.jpg
    Prog.jpg
    21 KB · Visitas: 5
Buenas. Tengo el mismo problema.
En el Proteus anda bárbaro y el código corre bien, pero a la hora de probar en el circuito armado, no funciona.
No sé qué hacer con los terminales del PIC que no utilizo. ¿Dónde los referencío?
El microcontrolador utilizado es un 16F877A y estoy iniciandome en lenguaje ensamblador.

Estoy haciendo un monitor de tensión y corriente sin pantalla LCD.
Toma las señales desde un amplificador operacional en modo buffer y otro en modo seguidor de tension.

Utilizo 4 canales de conversión A/D con dos potenciometros, uno conectado al terminal Vref+ y el otro conectado al terminal vref- y por software compara lo adquirido en un canal y devuelve el resultado encendiendo un led, rojo, verde y otro Amarillo.

El programa no es de mi autoría. Buscando ejemplos de programación, lectura de bibliografía y programación en Nipple, saqué algo de lo que ahora está funcionando.

Dejo el código y la simulación del proteus con cristal de 20Mhz.

Código:
list        p=16f877A    ; 
    

#include    "p16f877 

  __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_ON & _CPD_OFF



resultado1_adc equ 0x20


resultado2_adc equ 0x21


delay          equ 0x22 ; 



    

ORG 0x00
;

inicializacion del micro
    

bcf STATUS, RP0
    

bcf STATUS, RP1  ;seleccion Bank0
    

clrf PORTA
    

movlw 0x1F
    
movwf PORTB
    
bsf STATUS,RP0  ;seleccion Bank1
    
movlw 0x02
    
movwf ADCON1
    
movlw 0x1F
    
movwf  TRISA
    
movlw 0xC0
    
movwf TRISB
    
bcf STATUS,RP0  ;seleccion Bank0
    
   

mainloop:

;senso ADC0
    
movlw 0x81
    
movwf ADCON0    ; 
ADCS1=1 ,ADON=1
    
movlw  0x32
    
movwf  delay
d0:
    
decfsz  delay   ;delay necesario para cumplir
    
goto   d0       ;requisitos de Tadq
    
movlw 0x85
    
movwf ADCON0 ; 
ADCS1=1 ,GO=1 ,ADON=1

espero_adc0:
    
nop
    
btfsc ADCON0 , 2
    goto espero_adc0
;almaceno valor 1
    
movfw  ADRESH
    
movwf  resultado1_adc

;senso ADC1
     
movlw 0x89   ; ADCS1=1 ,CHS0=1 ,ADON=1
     
movwf ADCON0
     
movlw  0x32
     
movwf  delay
d1:
    
decfsz  delay   ;delay necesario para cumplir
    
goto    d1      ;requisitos de Tadq
    
movlw 0x8D   ; ADCS1=1 ,CHS0=1 ,GO=1 ,ADON=1
    
movwf ADCON0
espero_adc1:
    
nop
    
btfsc ADCON0 , 2
    
goto espero_adc1
;almaceno valor 2
    
movfw ADRESH
    
movwf resultado2_adc


;proceso de comparacion
    
movfw resultado1_adc    ;
    
bsf    STATUS , C       ;Set bit C,preparado para comparacion
    
subwf  resultado2_adc
    
btfsc STATUS, Z
    
goto adc0_igual_adc1
    
btfsc  STATUS , C
    
goto adc0_menor_adc1
;muestro resultado
;adc0 mayor a adc1(Vin<Vref)
    
bsf PORTB,0
    
bsf PORTB,1
    
bcf PORTB,2
    
goto sensa_adc2

adc0_menor_adc1:
    
bsf PORTB,2
    
bsf PORTB,1
    
bcf PORTB,0
    
goto sensa_adc2

adc0_igual_adc1:
    
bsf PORTB,0
    
bsf PORTB,2
    
bcf PORTB,1

;senso ADC2
sensa_adc2:
    
movlw 0x91
    
movwf ADCON0 ; ADCS1=1 ,CHS1=1 ,ADON=1
    
movlw  0x32
     
movwf  delay
d2:
    
decfsz  delay   ;delay necesario para cumplir
    
goto    d2      ;requisitos de Tadq
    
movlw 0x95
    
movwf ADCON0 ; ADCS1=1 ,CHS1=1 ,GO=1 ,ADON=1
espero_adc2:
    
nop
    
btfsc ADCON0 , 2
    
goto espero_adc2
;almaceno valor 1
    
movfw  ADRESH
    
movwf  resultado1_adc

;senso ADC3
    
movlw 0x99   ; ADCS1=1 ,CHS1=1 ,CHS0=1 ,ADON=1
    
movwf ADCON0
    
movlw  0x32
    
movwf  delay
d3:
    
decfsz  delay   ;delay necesario para cumplir
    
goto    d3      ;requisitos de Tadq

    
movlw 0x9D   ; ADCS1=1 ,CHS1=1 ,CHS0=1 ,GO=1 ,ADON=1
    
movwf ADCON0
espero_adc3:
    
nop
    
btfsc ADCON0 , 2
    
goto espero_adc3
;almaceno valor 2
    
movfw ADRESH
    
movwf resultado2_adc

;comparo
    
movfw resultado1_adc    ;
    
bsf    STATUS , C       ;Set bit C,preparado para comparacion
    
subwf  resultado2_adc
    
btfsc STATUS, Z
    
goto adc2_igual_adc3
    
btfsc  STATUS , C
    
goto adc2_menor_adc3

;muestro resultado
;adc2 mayor a adc3
    
bsf PORTB,3
    
bsf PORTB,4
    
bcf PORTB,5
    
goto mainloop

adc2_menor_adc3:
    
bsf PORTB,5
    
bsf PORTB,4
    
bcf PORTB,3
    
goto mainloop

adc2_igual_adc3:
    
bsf PORTB,3
    
bsf PORTB,5
    
bcf PORTB,4

    
goto mainloop ;

 END
 

Adjuntos

  • PIC_VI.jpg
    PIC_VI.jpg
    117.7 KB · Visitas: 16
Última edición por un moderador:
Buenas. Gracias por la respuesta.
Pregunta: ¿Cómo configurar por software las entradas de los terminales que no utilizo?
Como es tecnología CMOS he leído bastante y no he encontrado coincidencia en lo que realicé en el circuito montado con sus componentes y demás.
En los terminales no utilizados coloqué un resistor de 4.7KΩ y a VDD.
 
Última edición por un moderador:
Bueno en gustos se rompen generos y yo tampoco he visto nada escrito por microchip.
Pero los dejo como entrada porque el registro TRIS al iniciar el pic estan como entrada o sea el registro TRIS=255, entonces solo los dejo igual y cambio los que voy a ocupar como los necesite y los conecto a tierra asi si por accidente lo toco con el positivo o negativo no le pasa nada al pic.
 
Atrás
Arriba