# Problemas de programación asm PIC16F887



## Killer_jc (Feb 6, 2010)

Bueno, generalmente no soy de preguntar, por lo q ven en mi cantidad de post, pero se me quemaron los libros tratando de descifrar esto, Estoy haciendo un proyecto para la universidad, que es un detector de alta y baja tension monofasico, donde me indica en un display la tension q esta en ese momento.

Resulta que hice todo el programa en el MPLAB, y me anda de maravillas, pero cuando lo puse en el circuito..... realmente no me anduvo nada . Revise por todos lados, todas las tensiones que llegan al PIC estan bien. Realize un mini programa aunque sea para q me logre prender los segmentos de 1 display, aunque sea eso,, y tampoco nada. Yo uso el reloj interno, eh buscado atraves de todo el internet sobre este, incluso me lei el PDF del PIC16F887. Lo configure,, pero... sigue sin andar . El PIC esta bien, me permite grabar y leer, es mas.... es nuevo.


Este es el codigo que tengo para probar aunque sea si prende, lo unico q tiene el PIC conectado es una resitencia de 1k y un capcitor de .1uf a la pata del MCLR. El oscilador me decididi a usar el interno, asi q no hay ninguno externo. Como uso el puerto D para prender los displays pense q no podia darme 5V y prenderme el segmento, asi q le puse una resistencia de 1k como pull-up. Todo esto fue ante la duda, pero sigue sin funcionar. El codigo esta bien. Lo pruebo con el proteus y anda de maravillas, lo simulo con el MPLAB y tambien, pero lo unico q me deja la incertidumbre es el oscilador, y no tengo osciloscopio como para verlo en la pata de CLKOUT.


```
LIST P=16F887
    INCLUDE <P16F887.INC>
    
    __CONFIG _CONFIG1, _INTOSC & _WDT_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_OFF & _IESO_ON & _FCMEN_ON & _LVP_ON
    __CONFIG _CONFIG2, _WRT_OFF & _BOR40V    
    CBLOCK H'20'
    AUX1
    AUX2
    PDel0
    PDel1
    ENDC
    
RESET    ORG    H'00'
        GOTO    CONDINIC
        ORG    H'04'
INTERR
        NOP
CONDINIC
    BANKSEL    OPTION_REG
    MOVLW    0x74        
    MOVFW    OPTION_REG    
    BANKSEL    ANSEL
    CLRF    ANSEL    ; Selecciono que canal va a ser analogico y cual digfital, dejo solo AN0
    INCF    ANSEL,F    ; Dejo solamente el canal AN0 como entrada analogica
    CLRF    ANSELH
    BANKSEL    OSCCON    ; Osc Interno 500 KHz
    MOVLW    0x6F
    MOVWF    OSCCON
    BANKSEL    TRISD
    CLRF    TRISD
    CLRF    TRISE
    BANKSEL    TRISA
    MOVLW    0xFF
    MOVWF    TRISA
    BANKSEL    PORTE
    CLRF    PORTE
MAIN
    CALL    DEMORA
    MOVLW    0xFF
    MOVWF    PORTD
    CALL    DEMORA
    MOVLW    0x00
    MOVWF    PORTD
    GOTO    MAIN
DEMORA  movlw     .239      ; 1 set numero de repeticion  (B)
        movwf     PDel0     ; 1 |
PLoop1  movlw     .232      ; 1 set numero de repeticion  (A)
        movwf     PDel1     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
PDelL1  goto PDelL2         ; 2 ciclos delay
PDelL2  goto PDelL3         ; 2 ciclos delay
PDelL3  clrwdt              ; 1 ciclo delay
        decfsz    PDel1,1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel0,1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
PDelL4  goto PDelL5         ; 2 ciclos delay
PDelL5  goto PDelL6         ; 2 ciclos delay
PDelL6  goto PDelL7         ; 2 ciclos delay
PDelL7  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.
```
Desde ya muchas gracias por la ayuda.


----------



## dragondgold (Feb 6, 2010)

No sabía que el 16F877 tenía oscilador interno, el unico oscilador interno que le conosco es el del ADC. Tendrías que probar poniendo un oscilador externo como un cristal de 4MHz y comprobar si tenes 5V en la patita del MCLR. Si pones un diagrama de como lo conectaste sería mejor...

Saludos


----------



## Killer_jc (Feb 6, 2010)

Disculpa pero leiste mal, es el PIC16F887 y no 877.

Hay te subi una imagen,, en la pata del MCLR tengo 5V como se debe.

Nota de la imagen: Las salidas del puerto D van a un display 7 segmentos catodo comun. El q dice CLK, es una salida para un shift-register. 
Y nada mas ^^,, es todo.. supuestamente no necesito mas nada 

El PDF recomienda el circuito ese del MCLR.

Aclaracion: Seleccione 500Khz por que es lo sufientemente rapido para mi proposito y ademas el ADC anda con esa velocidad.

Bueno despues de probar y probar y prboar y seguir probando no pude hacerlo arrancar con el oscilador interno, tenia a mano un xtal de 10 MHz lo puse y anduvo, aunque tendria q hacer toda la plaqueta nuevamente por justamente esto ^^. Pero seguiria intentando hacer andar el PIC con el oscilador interno, aunque todavia no me lo hace .

Le agradeceria si alguien pudiera hecharme una mano con esto... como dije antes, es solamente el oscilador interno el q tengo q modificar, y todavia no puedo hacerlo andar.


----------



## Killer_jc (Feb 7, 2010)

Bueno logre hacerlo funcionar, con el reloj interno como se debe.
Los cambios q realize fueron:

en el config 1 le puse _LVP_OFF

y por ultimo en el registro OSCCON
el valor de 3Fh paso a 38h. Con esto pude hacerlo arrancar sin ningun problema. Gracias por responder aunque sea dragon...


----------



## decoymech (Feb 16, 2010)

Excelente ayuda, yo tenía le mismo problema no podia hacer funcionar el pic con el oscilador interno, le tenia que poner el externo para que "arrancara" el pic y funcionaba prefecto aunque le quitara el cristal, pero cuando se reseteaba dejaba de funcionar.


----------



## andyt (Jun 16, 2010)

hola  tengo un problema con el pic 16f887.
realice un programa para teclado y no me funciona los pines rb4, rb5 .... en el proteus aparecen en gris 
tengo que configurar algo ?
gracias por la colaboracion


----------



## xavisuh (Ago 27, 2010)

bueno pues yo tengo una duda hacerca de un programa que realize en microcode hacerca de un termometro que me muestra la temperatura en un LCD por lo que lo compilo y no me marca errores pero cuando lo corro en mi simulación en proteus no me recibe nada el convertidor analogico digital entonces no se que le hice a mi programa
mi codigo es el siguiente:
'********************************************************************
'*  Name    : LCD.BAS                                               *
'*  Author  : Xavier Ugalde Hernández                               *
'*  Notice  : Copyright (c) 2010 IHM                                *
'*          : All Rights Reserved                                   *
'*  Date    : Jueves 26 de agosto de 2010                           *
'*  Version : 1.0                                                   *
'*  Notes   :Es un programa que nos entrega la temeperatura en      *
'*          :grados centigrados y Farenheight en un LCD pic16f887   *
'********************************************************************
'configuración del lcd
DEFINE OSC 4                     'velocidad en MHZ del oscilador
DEFINE LCD_DREG PORTD            'Se conectan los pines del LCD desde el pin 0-7       
DEFINE LCD_DBIT 0                'al port D 0 con 0, 1 con 1, ...,7 con 7
DEFINE LCD_RSREG PORTA           'el pin RS del LCD se conecta al pin 1 de portA
DEFINE LCD_RSBIT 1
DEFINE LCD_RWREG PORTA           'el pin RW del LCD se conecta al pin 2 de portA
DEFINE LCD_RWBIT 2               
DEFINE LCD_EREG PORTA            'el pin E del LCD se conecta al pin 3 de portA
DEFINE LCD_EBIT 3
DEFINE LCD_BITS 8                'numero de lineas de interfaz (mas rapido que con 4)
DEFINE LCD_LINES 2               'se definen el numero de lineas del LCD
DEFINE LCD_COMMANDUS 10000       
DEFINE LCD_DATAUS 250
DEFINE ADC_BITS 10               'numero de bits de conversion del ADC
INPUT PORTA.0                    'entrada ADC
TEMP VAR WORD                    'declaracion de variables
CELSIUS VAR WORD                 'si es BIT es solo cero y uno
FAR VAR WORD                     'si es BYTE es de ocho bits
CDEC VAR WORD                    'si es WORD es de 16 BITS
FDEC VAR WORD

    ADCON0 = %01000001            'configuracion del PIC 
    ADCON1 = %10000000
    ANSEL = %00000001
    TRISA = %00000001             'declaracion de entradas y salidas
    PORTA = 0                     'pone las salidas del porta en cero
    TRISD = 0                     'seleccionara que el puerto d sea salidas
    PORTD = 0                     'salidas del portd d en cero                                  
    Low PORTA.2                   'pantalla LCD en modo de escritura
    Pause 50
    Lcdout $FE, 1                 'el 1 borra pantalla
    Pause 50 
                                  'cada 5mV en el pic son un bit
INICIO:
    ADCIN 0, TEMP
    CELSIUS = TEMP
    CDEC = (TEMP // 4)            'es para el residuo
    FAR = (((celsius * 9) / 5) + 32)
    FDEC = (FAR // 4)             'El residuo es lo que queda en enteros en una division.
    CALL DECIMALES                                                                         
    LCDOUT $FE, $80, "  Cent  ", "       F  "
    PAUSE 50
    Lcdout $FE, $C0, DEC3 CELSIUS, ".", DEC2 CDEC,"    ", DEC3 FAR, ".", DEC2 FDEC    
    Pause 50 
    GOTO INICIO

DECIMALES:
    IF CDEC = 0 THEN CDEC = 0
    IF CDEC = 1 THEN CDEC = 25
    IF CDEC = 2 THEN CDEC = 50
    IF CDEC = 3 THEN cDEC = 75
    IF FDEC = 0 THEN fDEC = 0
    IF FDEC = 1 THEN fDEC = 25
    IF FDEC = 2 THEN fDEC = 50
    IF FDEC = 3 THEN fDEC = 75    
    RETURN

    End


----------



## maranga (Dic 1, 2010)

hola gente buenas tardes soy nuevo en el foro.... tengo un problema con el pic 16f887 necesito hacer andar un motor paso a paso bipolar. El programa lo e realizado con el mplab y consiste en lo siguiente:
desde el visual basic yo mando un dato a traves del bus serial de mi pc el 16f887 lo recibe y de acuerdo a ello debo accionar el motor. El visual basic me manda la letra "A" en un boton el micro lo recibe por medio de un max 232 y genera un codigo de 4 bit que mando a un L293 para accionar mi motor. Ademas cuanta con un control para frenar o invertir el giro del motor que son 2 pulsadores colocados en el portc del pic. he intentado todo y no puedo hacer andar el motor. En la simulacion en el isis todo anda perfecto... mi pregunta es la siguiente no me ha quedado bien en claro si el pin del mclr del pic debo conectarlo o no a 5 v.he probado de las 2 formas (conectado y desconectado) y la respuesta es la misma necesita ayuda si alguien es capas de tirarme algun dato que me pueda servir les agradeceria mucho!


----------



## dragondgold (Dic 1, 2010)

Para que el PIC funcione el MCLR debe ir a 5V, si esta a masa o negativo el PIC se reinicia.

Saludos


----------



## maranga (Dic 1, 2010)

ya intente ponerlo a 5 v pero el motor no responde... lo estoy alimentando con 12 v y uso un lm7805 para alimentar mi micro cuando yo prendo mi fuente e notado que el consumo de corriente de el circuito es de 0.6mA y el lm7805 se entibia no se si estara bien o no... que otra cosa puedo revisar?? la verdad ya no se que mas probar.desde ya muchas gracias


----------



## xavisuh (Dic 1, 2010)

a ok ya se que es lo que pasa fijate que yo hice una practica utilizando un control de angulo y utilice un lm293 que es un puente H en integrado por lo que tienes que alimentar independientemente el circuito para el micro y alimentar aparte el lm293 utiliza un cargador para el micro y una fuente para el integrado y asi me funciono 
lo que pasa es que el motor que yo estaba utilizando demandaba mucha corriente y pues no funcionaba mi circuito pero pues hazlo de esa fomra y dime si te funciona


----------



## dragondgold (Dic 1, 2010)

Si pones un esquema sera mas facil ayudarte. Pusiste diodos de contra-fem al motor? Al motor lo manejas a traves de puentes H? Tenes las masas compartidas? Cae la tensión del PIC al intentar mover el motor?

Saludos!!


----------



## maranga (Dic 1, 2010)

bien la figura 10 de pdf del L293 que adjunte es la que uso para hacer andar mi motor

yo con la fuente alimento todo el circuito con 12 v pero con un regulador de  5 v (lm 7805) alimento mi micro y los pulsadores tambien el max 232 y una de las alimentaciones del L293 ya que el mismo cuanta con una alimentacion de 12 v y otra de 5v..... hummm tambien podria destacar que uso un clock externo ( un cristal 4 mhz) y ademas es un motor paso a paso bipolar que consegui de una impresora dudo que consuma mucha corriente... es si el programa del mplab es muy basico... si es necesario puedo subir un block de notas que contenga el programa


----------



## dragondgold (Dic 1, 2010)

Proba lo que te comentaron antes de colocar dos fuentes de alimentacion diferentes para el PIC y los motores con las masas en comun. Generalmente cuando tuve esos problemas se solucionaban asi. Coloca unos .1uF cerca del PIC tambien. Si el motor no es muy grande tambien podes poner un capacitor de alto valor para que absorba los picos de corriente que podrian estar reiniciando el PIC.

Saludos


----------



## maranga (Dic 2, 2010)

oks entonces pruebo alimentar con fuentes diferentes y les aviso que pasa desde ya muhas gracias


----------



## maranga (Dic 3, 2010)

buenas.... ahi realice un par de pruebas cambie la configuracion de mi micro para hacer andar el motor solamente y empezar a descartar problemas en el circuito.. ante este nuevo cambio e notado que el motor funciona de manera que adopto que el problema se encuentra en la parte de comunicacion serial entre la pc y el micro... en el mismo interfieren el max 232, mi programa en el visual basic y el puerto serial de la pc a el micro.... podrian decirme que pruebas realizar para hacer funcionar esta parte del circuito (ya revise el conexionado y esta en orden como me indica el plano del pdf )


----------



## dragondgold (Dic 3, 2010)

Podrias enviar un mensaje simple con el PIC y verlo si lo recibe la PC para comprobar que la comunicacion este funcionando.

Saludos!


----------



## maranga (Dic 5, 2010)

Emm...La simulacion anda perfecta Suapeo virtualmente puertos seriales y lo hago andas con el isis y el visualbasic y anda todo joya


----------



## chekolieneas (Jul 9, 2011)

Killer_jc dijo:


> Bueno logre hacerlo funcionar, con el reloj interno como se debe.
> Los cambios q realize fueron:
> 
> en el config 1 le puse _LVP_OFF
> ...



ke buena aportacion funciona de verdad yo tenia el mismo problema,


----------



## descontrol03 (Ene 8, 2012)

para configurar el clock interno solo basta con esto

ya lo que sige es de cada quien que libreria quiere usar etc...

ojooooooooo es para lenguaje   c  de pics  es mas sensillo que asm 

#include	<16F887.h> //Pic a utilizar

//Configuración del PIC

#device 	adc=10													//Convertidor Analógico/Digital con 10 bits de resolución
#FUSES		NODEBUG, NOLVP, NOWDT, NOPROTECT, MCLR PUT, INTRC_IO 
#USE 		delay(clock = 8000000)


----------



## HelliusVII (Feb 3, 2012)

Hola comunidad de Electronicos y demas aficionados, pido su ayuda en un progrmama basico con el 16f887, trata de una entrada por el puerto RB0 testea si es 1 pues no se enciendo el port A , si es 0 se enciende, facil no pero no me corre aqui el codigo:
List p=16F887
#include "p16F887.inc"
__CONFIG  _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT 
__CONFIG  _CONFIG2, _WRT_OFF & _BOR21V 
;----------------------------------------------------------
Tmr0_opt	equ	0x0001
Time		equ	0x0020
;==========================================================
org 0x0000
goto Inicio
#Include "Delays.inc"
;----------------------------------------------------

Inicio
		Banksel PORTA
		clrf 	PORTA
		clrf 	PORTB
		Banksel ANSEL
		clrf	ANSEL
		clrf	ANSELH
		Banksel	TRISA
		clrf 	TRISA
		movlw	0x01
		movwf	TRISB
		Banksel	WPUB
		movlw	0x01
		movwf	WPUB
		Banksel	OPTION_REG
		movlw	0xaf
		movwf	OPTION_REG
;----------------------------------------------------------
Test	btfsc	PORTB,0
		goto	Test
		call	Time20
		btfss	PORTB,0
		goto 	Test
		movlw	0xff
		movwf	PORTA
		movlw	0xff
		movwf	Time
		Time1000	Time
		goto 	Test
END
Cuando lo simulo no entiendo el puerto B esta en cero pero en la simulacion me dice 1. Agradeceria su ayuda, gracias.


----------



## ArturoV (Abr 19, 2012)

Hola buenas noches me han dejado que escriba el himno nacional mexicano y este tienen que ser 9 estrofas pero cuando ingreso todas estas solo tiene un cierto numero de bits y ya no me muestra lo demas del himno, mi pregunta es como puedo hacer para que este me sea mostrado completo?.


----------

