# Programar en Mplab el oscilador interno ?



## BYRON (Oct 14, 2011)

buenas tardes he estado programando el pic 16f628a los programas que he creado me han funcionado pero con el oscilador externo, yo programo en el lenguage de basic en mplab, lo que quiero saber es si hay una instruccion o una opcion en mplab que me permita activar los bits tanto de watch dog como el oscilador interno
muchas gracias


----------



## D@rkbytes (Oct 14, 2011)

Bienvenido.
Esa opción esta en el menú donde dice Configure
Primero seleccionas el tipo de Microprocesador y luego en el mismo menú veras
mas abajo donde dice Configuratión Bits ahí los puedes establecer como quieras.
Pero debes deschecar (Quitar la flechita) que dice Configuration Bits set in code.
Esa opción es porque tambien se puede escribir la palabra de configuración con código
directamente sobre tu programa. Así como esto para lenguaje ensamblador:

```
list      p=16f628A
    #include <p16F628A.inc>

    __CONFIG   _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT

; Y para PICBASIC sería algo como esto:

@ DEVICE PIC16F628A,INTRC_OSC_NOCLKOUT,PROTECT_OFF,WDT_OFF,PWRT_ON,MCLR_ON,BOD_OFF,LVP_OFF,CPD_OFF
```
Espero te sirva esta información para tus primeros pasos en el mundo PIC


----------



## BYRON (Oct 15, 2011)

ok gracias ya me funciono


----------



## CARLOS ANDRADE (Dic 6, 2016)

Hola, tengo una duda. 
Esa configuracion tambien fnciona en el pic16f877a?
Es que no puedo acivar el oscilador interno de este, tengo la confuguracion asi:

Config wdt = off
config mclre = on
config debug = off
config lvp = off
config fosc = intosc_ec

esta esta mal? Porque no me conpila bien


----------



## D@rkbytes (Dic 6, 2016)

La última está mal. El PIC16F877A no tiene ese tipo de oscilador.
Lee la hoja de datos y ahí encontrarás los fuses que tiene ese PIC.


----------



## CARLOS ANDRADE (Dic 6, 2016)

Ah, OK. Gracias.
¿Y entonces el registro "BAUDCON" tampoco lo tiene, verdad?
Mira, este es el código que tengo y ya cambié la configuración.

```
LIST        P = 16F877A
RADIX    HEX
#include "p16F877A.inc"

    ;CONFIGURACION INICIAL DE PIC
__CONFIG _FOSC_XT & _WDTE_OFF & _PWRTE_OFF & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF

    ;DECLARACION DE ALGUNAS VARIABLES
DELAY1    EQU    0X00
DELAY2    EQU    0X01
AUX1    EQU    0X02
ORG    0
    
START
    MOVLW    B'00000000' ;TASA DE BAUDIO DE 8 BITS
    MOVLW    BAUDCON
    MOVLW    B'00000001' ;FIJAR RA0 COMO ENTRADA
    MOVWF    TRISA    
    MOVLW    B'00000000' ;PORTB COMO SALIDA
    MOVWF    TRISB
    MOVLW    B'10000000' ;RC6(TX) COMO SALIDA Y RC7(RX) COMO ENTRADA
    MOVWF    TRISC
    MOVLW    0X0F        ;LOS PUERTOS ANALOGICOS SE CAMBIAN A DIGITAL
    MOVWF    ADCON1
    ;CONFIGURAR LA TASA BAUDIO A 3600 POR SEGUNDO
    MOVLW    D'12'
    MOVWF    SPBRG
    MOVLW    B'00100000' ;TXEN = 1 HABILITAR TRANSMISOR, BRGH = 0
    MOVWF    TXSTA        ;SYNC = 0, MODO ASINCRONO
    MOVLW    B'10010000' ;SPEN = 1, HABILITAR EL PRIMER PUERTO SERIAL
    MOVWF    RCSTA        ;CREN - 1, HABILITAR EL RECEPTOR
    ;-----FIJANDO TIEMPO------
    CLRF    AUX1
    CLRF    DELAY2
SETTLE
    DECFSZ    DELAY2
    GOTO    SETTLE
    
RXLOOP
    BTFSS    PIR1,RCIF   ;BANDERA DE INTERRUPCION DEL RECEPTOR
    GOTO    RXLOOP        ;PIR1,RCIF=0, CUANDO LA RECEPCION HA TERMINADO
    MOVF    RCREG,W        ;YA QUE SE INDICA QUE LA RECEPCION HA TERMINADO
    MOVWF    PORTB        ;SE MUEVE EL CONTENIDO DEL RECEPTOR AL PUERTO B
    CALL    RETARDO        ;DONDE SE EXHIBE EL CONTADOR
    GOTO    RXLOOP        ;REGRESA A LA RECEPCION DE DATOS PARA IR MOSTRANDO EL 
                ;SIGUIENTE VALOR DE LA CUENTA

;------SUBRUTINA DE RETARDO-------
RETARDO
    DECFSZ    DELAY1,1
    GOTO    RETARDO
    DECFSZ    DELAY2,1
    GOTO    RETARDO
    RETURN    
    
END
```


----------



## D@rkbytes (Dic 6, 2016)

CARLOS ANDRADE dijo:


> Ah, OK. Gracias.
> ¿Y entonces el registro "BAUDCON" tampoco lo tiene, verdad?


No tiene ese registro, pero tiene el registro SPBRG. (Baud Rate Generator)
¿Y si no lo tiene, por qué lo ingresas en el programa? Eso causará un error de compilación.

La palabra de configuración está bien, pero la configuración de módulo USART, no lo sé, porque no se menciona a qué frecuencia usarás el oscilador.
Aunque por el fuse XT, podría pensar que a 4 MHz. Y si vas a usar un cristal de 4 MHz, la configuración no es correcta para 3600 Bps.


----------



## CARLOS ANDRADE (Dic 7, 2016)

Okay gracias ya vi que no tiene ese registro "BAUDCON" y use el SPBRG y si voy a usar el oscilador a 4 MHz y la configuración de la tasa de Baudio es a 9600 Bps.

El código me quedo así: pero donde no lo pude hacer funcionar fue en Proteus... 
Podrías ayudarme por favor?

*Transmisor:*

```
LIST	 P = 16F877A
RADIX	 HEX
#include "p16F877A.inc"

;CONFIGURACION INICIAL DE PIC
__CONFIG _FOSC_XT & _WDTE_OFF & _PWRTE_OFF & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF

;DECLARACION DE ALGUNAS VARIABLES
DELAY1	EQU	0X00
DELAY2	EQU	0X01
AUX1	EQU	0X02
ORG	0
	
START
	MOVLW	H'00000000' ;TASA DE BAUDIO DE 8 BITS
	MOVLW	SPBRG
	MOVLW	B'00000001' ;FIJAR RA0 COMO ENTRADA
	MOVWF	TRISA	
	MOVLW	B'00000000' ;PORTB COMO SALIDA
	MOVWF	TRISB
	MOVLW	B'10000000' ;RC6(TX) COMO SALIDA Y RC7(RX) COMO ENTRADA
	MOVWF	TRISC
	MOVLW	0X0F	    ;LOS PUERTOS ANALOGICOS SE CAMBIAN A DIGITAL
	MOVWF	ADCON1
;CONFIGURAR LA TASA BAUDIO A 9600 POR SEGUNDO
	MOVLW	D'12'
	MOVWF	SPBRG
	MOVLW	B'00100000' ;TXEN = 1 HABILITAR TRANSMISOR, BRGH = 0
	MOVWF	TXSTA	    ;SYNC = 0, MODO ASINCRONO
	MOVLW	B'10010000' ;SPEN = 1, HABILITAR EL PRIMER PUERTO SERIAL
	MOVWF	RCSTA	    ;CREN - 1, HABILITAR EL RECEPTOR
;-----FIJANDO TIEMPO------
	CLRF	AUX1
	CLRF	DELAY2
SETTLE
	DECFSZ	DELAY2
	GOTO	SETTLE
	
RXLOOP
	BTFSS	PIR1,RCIF   ;BANDERA DE INTERRUPCION DEL RECEPTOR
	GOTO	RXLOOP	    ;PIR1,RCIF=0, CUANDO LA RECEPCION HA TERMINADO
	MOVF	RCREG,W	    ;YA QUE SE INDICA QUE LA RECEPCION HA TERMINADO
	MOVWF	PORTB	    ;SE MUEVE EL CONTENIDO DEL RECEPTOR AL PUERTO B
	CALL	RETARDO	    ;DONDE SE EXHIBE EL CONTADOR
	GOTO	RXLOOP	    ;REGRESA A LA RECEPCION DE DATOS PARA IR MOSTRANDO EL 
			    ;SIGUIENTE VALOR DE LA CUENTA

;------SUBRUTINA DE RETARDO-------
RETARDO
	DECFSZ	DELAY1,1
	GOTO	RETARDO
	DECFSZ	DELAY2,1
	GOTO	RETARDO
	RETURN	
	END
```

*Receptor:*

```
LIST	    P = 16F877A
RADIX	HEX
#include "p16F877A.inc"

;CONFIGURACION INICIAL DE PIC
__CONFIG _FOSC_XT & _WDTE_OFF & _PWRTE_OFF & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF

;DECLARACION DE ALGUNAS VARIABLES
DELAY1	EQU	0X00
DELAY2	EQU	0X01
AUX1	EQU	0X02
ORG	0
	
START
	MOVLW	H'00000000' ;TASA DE BAUDIO DE 8 BITS
	MOVWF	SPBRG
	CLRF	PORTD
	CLRF	TRISD
	MOVLW	0X0F	    ;LOS PUERTOS ANALOGICOS SE CAMBIAN A DIGITAL
	MOVWF	ADCON1
	MOVLW	B'00000001'
	MOVWF	TRISA	
	MOVLW	B'00000000' ;PORTB COMO SALIDA
	MOVWF	TRISB
	MOVLW	B'10000001' ;RC6(TX) COMO SALIDA Y RC7(RX) COMO ENTRADA
	MOVWF	TRISC
	
;CONFIGURAR LA TASA BAUDIO A 9600 POR SEGUNDO
	MOVLW	D'12'
	MOVWF	SPBRG
	MOVLW	B'00100100' ;TXEN = 1 HABILITAR TRANSMISOR, BRGH = 0
	MOVWF	TXSTA	    ;SYNC = 0, MODO ASINCRONO
	MOVLW	B'10010000' ;SPEN = 1, HABILITAR EL PRIMER PUERTO SERIAL
	MOVWF	RCSTA	    ;CREN = 1, HABILITAR EL RECEPTOR
	
;-----FIJANDO TIEMPO------
	CLRF	AUX1
	CLRF	DELAY2
SETTLE
	DECFSZ	DELAY2
	GOTO	SETTLE
	
RXLOOP
	BTFSS	PIR1,RCIF   ;BANDERA DE INTERRUPCION DEL RECEPTOR
	GOTO	RXLOOP	    ;PIR1,RCIF=0, CUANDO LA RECEPCION HA TERMINADO
	MOVF	RCREG,W	    ;YA QUE SE INDICA QUE LA RECEPCION HA TERMINADO
	MOVWF	PORTB	    ;SE MUEVE EL CONTENIDO DEL RECEPTOR AL PUERTO B
	CALL	RETARDO	    ;DONDE SE EXHIBE EL CONTADOR
	GOTO	RXLOOP	    ;REGRESA A LA RECEPCION DE DATOS PARA IR MOSTRANDO EL 
			    ;SIGUIENTE VALOR DE LA CUENTA

;------SUBRUTINA DE RETARDO-------
RETARDO
	DECFSZ	DELAY1,1
	GOTO	RETARDO
	DECFSZ	DELAY2,1
	GOTO	RETARDO
	RETURN
END
```

El error que me aparece en Proteus es este:

[PIC16 ADC] PC=0x0006. ADC conversion started before 'wait' time has expired following previous conversion or channel change. [TRANSMISOR]


----------



## D@rkbytes (Dic 7, 2016)

CARLOS ANDRADE dijo:


> Okay. Gracias, ya vi que no tiene ese registro "BAUDCON" y usé el SPBRG y sí voy a usar el oscilador a 4 MHz y la configuración de la tasa de Baudio es a 9600 Bps.
> 
> El código me quedó así: pero donde no lo pude hacer funcionar, fue en Proteus.
> ¿Podrías ayudarme, por favor?
> ...


Es que te has olvidado de seleccionar el banco adecuado para cada registro.
Aparte no tiene caso que configures el registro ADCON1, ya que no estás usando ningún puerto con ADC.

Veo que los programas son iguales, así que no harán nada, porque el transmisor no envía datos.

Lo más adecuado sería enviar algún dato y que lo interprete el receptor.
Ambos se pueden comunicar e interactuar, pero te dejo los siguientes programas cómo ejemplo.


----------



## CARLOS ANDRADE (Dic 8, 2016)

Okay gracias, ya pude notar que tengo varias cosas mal implementadas viendo tu ejemplo... De hecho le quite el adcon y compil bien pero en proteus no funcion y veo que me dices porque estan iguales los programas, es que estuve poniendo cosas de diferentes ejemplos.

Una pregunta, tu ejemplo que es lo que va hacer y como seria su conexion en proteus para verlo funcionando?

La conexion de los pic es asi?


----------



## D@rkbytes (Dic 8, 2016)

Lo que tienes que hacer aparte de poner más atención, es usar el ejemplo que subí.
¿Por qué digo ésto? Porque en el ejemplo que subí tampoco se usa el registro ADCON1, ya que no se está usando ninguna terminal o puerto con ADC.
Y también adjunté el diseño en Proteus para verlo funcionando.
Si tienes Proteus 8 también lo puedes abrir, usando "Import Legacy Project"

Ahora, para saber lo que hace, tienes dos opciones...
Ejecutar la simulación, o analizar los programas.
Son muy básicos y aparte están comentados.


----------



## CARLOS ANDRADE (Dic 9, 2016)

Buenas noches, si lo sé pero disculpa por la molestia es que no pude abrir el archivo. Si lo reconoce pero aparece en blanco como si no fuera compatible. Tengo Proteus 8.5... 

Me haría de mucha ayuda un screenshot de los pics conectados para conectarlo igual en el Proteus que tengo y ver la función ya que como soy nuevo en ensamblador no puedo saber exactamente lo que hace. 
Disculpa las molestias inge gracias y buenas noches...


----------



## D@rkbytes (Dic 9, 2016)

Yo también tengo Proteus 8.5 y lo puedo abrir perfectamente. 

Ya que lo abrí, lo adjunto convertido a la versión 8.5

Postdata:


D@rkbytes dijo:


> Si tienes Proteus 8 también lo puedes abrir, usando "Import Legacy Project"


----------



## CARLOS ANDRADE (Dic 9, 2016)

Sí ya pude gracias por su apoyo funciona bien ahora voy a grabar y hacerlo en físico y una disculpa por la falta de experiencia pero si me ayudó mucho! Espero pueda resolver más dudas en un futuro, saludos.


----------

