Autor Tema: Comenzando con PIC16F887  (Leído 25248 veces)

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

Desconectado hgp_2611

  • PIC10
  • *
  • Mensajes: 8
Comenzando con PIC16F887
« en: 10 de Octubre de 2009, 23:08:00 »
Que tal amigos,pues recientemente ingrese al mundo de los micros y con muchas ganas!

He adquirido mi primer programador de pics usb,y un PIC16f887 el cual,quiero comenzar a trabajar. He leido su datasheet y se q tiene oscilador interno,he leido sobre estos temas del oscilador pero la verdad no he logrado entender bien como hacerlo funcionar (programacion) y una vez programado como tengo q conectar el micro para q corra mi programa aunq supongo q solo hay q conectar los pines de alimentacion + y -, por q lei q tambien no lleva lo de la resistencia de pull pup a MCLR ya que tambien se hace por programacion. Quiero probar con un simple encendido y apagado de un led. utilizo este codigo

AllDigital
TRISA = 0
TRISB = 0
TRISC = 0
TRISD = 0
TRISE = 0

inicio:
PORTB.0 = 1
pause 500
PORTB.0 = 0
pause 500
Goto inicio

Lo compilo con PBP (microcodestudio) y lo guarda, lo simulo en isis simplemente conectando al portb.0 una resistenciay un led y cargando el hex al micro y si funciona bien. aun no lo he grabado al pic por qno tengo una fuente para probar,pero en eso estoy,lo q quiero es configurar el oscilador interno para por ejemplo 8mhz. q linea tengo q agregar a mi codigo?

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Comenzando con PIC16F887
« Respuesta #1 en: 11 de Octubre de 2009, 22:45:38 »
Está todo relacionado con este registro:


IRCF0:2 configuran la velocidad, para 8MHz por ej debe ser 111, para 4MHz 110
OSTS debe estar a 0
HTS debe estar a 1
LTS debe estar a 0
SCS debe estar a 1

Entonces debes cargar ese valor a ese registro antes de las configuraciones de los tris
OSCCON=0b1110101

Ojo que si no se acepta esa instrucción deberás previamente definir su dirección, OSCCON está en la dirección 0x8F.  O quizá haya na instrucción en el lenguaje para configurarlo, pero lo desconozco porque no programo en PBP.

Y colocar los fuses o bits en la palabra de configuración correspondiente al oscilador en INTOSC o INTOSCIO si quieres usar los pines del osc como I/O.

Espero te sirva, saludos
.

Desconectado mcpiebot

  • PIC10
  • *
  • Mensajes: 8
    • Cosas de Ingenieria
Re: Comenzando con PIC16F887
« Respuesta #2 en: 14 de Octubre de 2009, 18:30:42 »
lo del oscilador es importante, y adicionalmente, tienes que poner atencion a todos los bits de configuracion, de lo contrario el WDT y el pin de reset te pueden dar problemas.

saludos!!

Desconectado hgp_2611

  • PIC10
  • *
  • Mensajes: 8
Re: Comenzando con PIC16F887
« Respuesta #3 en: 17 de Octubre de 2009, 18:55:45 »
Primero q nada gracias por sus respuestas, que tal, yo tengo la misma pregunta para como programar mi oscilador interno (PIC16F887), trabajo con PIC SIMULADOR IDE y en CONFIGURACION DE BITS activo q tabaje con el oscilador interno, y automaticamente me configura los bites (mclr,etc) pero solo activa el oscilador mas no tiene para que yo lo programe a 2,4, u 8 mhz,aunq por default al activarlo este corre a 4mhz. cuando lo cargo con mi programa para programar el pic no me aparece ningun error en la CONFIGURACION DELOS BITS!, sin embargo, cuando hago el mismo programa (por ejemplo el parpadeo de un led) en MicroCodeStudio (q no trae para configurar los bits), compilo, y cargo el HEX a mi programador este me dice q faltan los bits de configuracion!.. espero algien me pueda ayudar.

En el Datasheet del PIC16F887 encontre lo sigiente (Traducido con Herramientas de idioma de google) :



Software selectable frequency range of 8 MHz to 31 kHz

El módulo de oscilador tiene una gran variedad de reloj las fuentes y las características de selección que le permiten ser utilizado en una amplia gama de  aplicaciones, mientras que maximiza el rendimiento del y reducir al mínimo el consumo de energía. Figura 4-1 ilustra un diagrama de bloques del módulo de oscilador.



Fuentes de reloj puede ser configurado desde exterior osciladores, resonadores de cristal de cuarzo, resonadores de cerámica y la resistencia-condensador (RC) circuitos. Además, el fuente de reloj del sistema puede ser configurado de una de dos osciladores internos, con una elección de velocidades seleccionables a través de de software. Características del reloj adicionales incluyen:

• Reloj seleccionable entre el sistema de fuente externa o internos a través de software.
• dos velocidades El modo de inicio, lo que minimiza latencia entre el inicio del oscilador externo y la ejecución de código.
• Fail-Safe Clock Monitor (FSCM) diseñado para detectar un fallo de la fuente de reloj externa (NA, XT, HS, de la CE o modos RC) y el interruptor
automáticamente en el oscilador interno.

El módulo de oscilador puede ser configurado en uno de los ocho los modos de reloj.
1. CE - reloj externo con I / O en OSC2/CLKOUT.
2. LP - 32 kHz Modo de bajo consumo de Cristal.
3. XT - medio de ganancia de cristal o de cerámica Resonador El modo de oscilador.
4. HS - High Gain cristal o de cerámica Resonador modo.
5. RC - External resistor-Condensador (RC) con FOSC / 4 de salida en OSC2/CLKOUT.
6. Rcio - Externo Resistencia-Condensador (RC) con I /O en OSC2/CLKOUT.
7. INTOSC - oscilador interno con FOSC / 4 de salida en OSC2 y E / S en OSC1/CLKIN.
8. INTOSCIO - oscilador interno con I / O en OSC1/CLKIN y OSC2/CLKOUT.

Modos de fuente del reloj están configurados por la FOSC <2:0> Configuration Word Register 1 (CONFIG1). El reloj interno se pueden generar a partir de dos internos de osciladores. El HFINTOSC es una alta frecuencia calibrada oscilador. El LFINTOSC es un sin calibrar oscilador de baja frecuencia.


BUeno hasta aquicreo  qesta todo claro, respecto a la info que saq del datasheet, lo q destaco es que no sabia q trae para poder configurar el oscilador interno de modo que, cuando hay una falla en el oscilador externo este se active, el modoq se llama Fail-Safe Clock Monitor (FSCM).
Y aqui es dondeviene lo interesante (continuo poniendo la info q saq del datasheet):


4.2 Oscilador de control
El control de oscilador (OSCCON) registro (Figura 4-1) controla el reloj del sistema y la frecuencia de selección de opciones. El registro OSCCON  contiene los siguientes bits:
• Bits de selección de frecuencia (IRCF)
• Frecuencia de bits de estado (HTS, LTS)
• Bits de control del reloj del sistema (OSTOS, SCS),


Nota 1: Restablece Bit a '0' con dos velocidades de arranque y de LP, XT o HS seleccionado como el modo de oscilador o Fail-Safe mode está activado.


Lei en otro foro algo respecto a lo q me dices CRYN ( http://micros.mforos.com/1149902/8402879-como-se-programa-el-oscilador-interno-en-mikrobasic/#80211317) que por cierto, si entiendo  muyc laramente eso de la configuracion cambiando los bits de acuerdoa lo que yo desee, pero mi duda ahora queda en:

COmo cambiar el registro OSCCON para poderle cambiar los bits de acuerdo a lo que yo lo quiera ocupar, y a suvez,como sabes q está en la dirección 0x8F??

Y como hacerlo en PIC SIMULADOR IDE, o en Microcodestudio .

BUeno por de mientras,creo q lo de la direcccion de registro q dices la puedo sacar del datasheet,lo buscare,espero una respeusta y una ayuda pronto.

Desconectado hgp_2611

  • PIC10
  • *
  • Mensajes: 8
Re: Comenzando con PIC16F887
« Respuesta #4 en: 18 de Octubre de 2009, 15:01:00 »
COn una leidita a mi datasheet y unas pruebas ademas de la ayuda del amigo Cryn,ya logre configurar mi oscilador interno, y aca coloco como fue q lo configure por si algien maneja el mismo:


segun la datasheet para el pic 16f887 solo hay q cambiar los bits 4, 5 y 6(contando de derecha a izquerda).

asi:                 

                        bit6          bit5       bit4
Para 1Mhz           1             0           0
Para 2Mhz           1             0           1
Para 4Mhz           1             1           0
Para 8Mhz           1             1           1


Entonces para 1Mhz qda asi:

OSCCON = 0x46  'Se configura reloj interno a 1Mhz %0100-0110

Entonces solo hay q cambiar los bits que corresponden por el valor al que se quiera hacer trabajar al oscilador interno, por cierto se pueden poner en hex como lo puse (OSCCON = 0x46) o en binario como esta en el comentario (%01000110) claro sin el guion que solo puse para poder separar en 4 bits y asi sea mas facil convertirlo y entenderlo del hex.Ademas COmo dijo el amigo Dogflu66 es basico configurar los bits en OpTIOS- COnfigure Bits del Pic simulador ide,y poner q se va a trabajar con el oscilador interno en mi caso es: OSCILLATOR SELECTION: INTOSC (Aclaro,para pic 16F887)

Y por si a algien le interesa para q sirven los otros bits aca esta:

Igual contando de derecha a izquierda: 
                                                              bit7                 bit0

                                                                  0 1 0 0 0 1 1 0


Bit 0: SCS: System Clock Select bit
1 = Internal oscillator is used for system clock
0 = Clock source defined by FOSC<2:0> of the CONFIG1 register
 
Como ven yo selecione un "0" ya que por lo que entiendo, con el 0 lo que indico es que no voy a trabajar con el oscilador interno que trae por deafault configurado (q es el de 4mhz) si no que yo lo voy a determinar con los bits que cambio del OSCCON. Aunq tengo la duda de que si sirve asi como yo dije(SI ESTOY MAL ESPERO ME CORRIJAN).

Bit 1 LTS: LFINTOSC Stable bit (Low Frequency – 31 kHz)
1 = LFINTOSC is stable
0 = LFINTOSC is not stable

Aqui yo asigne un "1" ya que le digo que este estable. (aunq en realidad supongo no me sirve en este caso ya que no estoy trabjando con Low Frequency, asiq es lo mismo si pongo un 0)

Bit 2 HTS: HFINTOSC Status bit (High Frequency – 8 MHz to 125 kHz)
1 = HFINTOSC is stable
0 = HFINTOSC is not stable


Seleccione un "1" por que aqui si selecciono una frecuencia estable y como trabajo dentro del rango q indica si debe llevar un 1.


Bit 3 OSTS: Oscillator Start-up Time-out Status bit(1)
1 = Device is running from the external clock defined by FOSC<2:0> of the CONFIG1 register
0 = Device is running from the internal oscillator (HFINTOSC or LFINTOSC)


Creo q aqui selecciono o se configura para trabajar con oscilador externo = 1 o para trabajar con el interno = 0, por eso puse 0

Bit 6-4 IRCF<2:0>: Internal Oscillator Frequency Select bits

ESto ya estaba aclarado al principio.

Bit 7 Unimplemented: Read as ‘0

Como lo indican,debe llevar un 0 siempre,no tiene uso.


BUeno espero mi colaboracion haya servido de algo! AL menos para algien mas que trate de hacer lo mismo q yo. y no haya podido,o no haya entendido como se hace.

Desconectado hgp_2611

  • PIC10
  • *
  • Mensajes: 8
Re: Comenzando con PIC16F887
« Respuesta #5 en: 18 de Octubre de 2009, 15:16:18 »
Entonces un programa q puse al principio queda asi:

AllDigital
OSCCON = 0x46  'Se configura reloj interno a 1Mhz %01000110 bitsconfig
TRISB = 0

inicio:

PORTB.0 = 1
WaitMs 500
PORTB.0 = 0
WaitMs 500

Goto inicio

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Comenzando con PIC16F887
« Respuesta #6 en: 18 de Octubre de 2009, 18:23:18 »
que bueno que ya lo lograste

bueno la dirección del registro OSCCON la saque de la hoja de datos en la parte de Memory Organization, en C se hace la definición de esa posición así:

#byte OSCCON=0x8f

para después darle su valor de configuración por ejemplo:

OSCCON=0b1001010

y si no te permitía hacer directamente OSCCON=0b1001010 se debe colocar una definición de la posición previamente con el #byte en C de CCS.

pero como en el lenguaje que usas no hace falta definirlo porque ya vienen definidos, no hay problema.

pero ojo! si en los fuses o config word se debe colocar como oscilador interno.
.

Desconectado isaigv

  • PIC10
  • *
  • Mensajes: 4
Re:Comenzando con PIC16F887
« Respuesta #7 en: 18 de Enero de 2017, 17:25:58 »
Hola, yo tambien tengo problemas con hacer funcionar este pic, ya hice un programa de prueba pero el pic no me hace nada, les agradezco si me pueden ayudar para saber cual es el problema aqui les dejo lo que hice.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LIST P=16F887
INCLUDE "P16f887.INC"

__CONFIG _CONFIG1, _CPD_ON  & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTOSCIO & _CP_ON

__CONFIG _CONFIG2, _WRT_OFF & _BOR_OFF

CBLOCK   0X20
      REGT1    
      REGT2    
      REGT3    
      REGT4    

ENDC

ORG 0X20
   BANKSEL PORTA ;
   CLRF PORTA ;LIMPIA PORTA
   BANKSEL ANSEL
   CLRF ANSEL ;SELECCIONA COMO DIGITALES I/O
   BCF STATUS,RP1 ;BANCO 1
   BANKSEL TRISA
   CLRF TRISA ;PUERTO A COMO SALIDA DE DATOS

   BCF      STATUS,RP0
   BCF      STATUS,RP1
   CLRF   PORTB
   CLRF   PORTC
   CLRF   PORTD
   CLRF   PORTE
   BSF      STATUS,RP0
   MOVLW   B'01101100'; SE SELECCIONA OSCILADOR INTERNO 4MHZ
   MOVWF   OSCCON

   MOVLW   B'00000000'
   MOVWF   TRISB
   MOVWF   TRISC
   MOVWF   TRISD
   MOVWF   TRISE   
   BCF      STATUS,RP0

INICIO

   MOVLW   B'11111111'
   MOVWF   PORTA
   MOVWF   PORTB
   MOVWF   PORTC
   MOVWF   PORTD
   MOVWF   PORTE
   CALL    RET1S
   MOVLW   B'00000000'
   MOVWF   PORTA
   MOVWF   PORTB
   MOVWF   PORTC
   MOVWF   PORTD
   MOVWF   PORTE
   CALL    RET1S

GOTO INICIO

RET1S      MOVLW   0X01; RETARDO DE 1 SEGUNDO    ;
         MOVWF   REGT1   
LOP4      MOVLW   0X1A
         MOVWF   REGT2
LOP3      MOVLW   0XDF
         MOVWF   REGT3
LOP1      DECFSZ   REGT4
         GOTO    LOP1
         DECFSZ   REGT3
         GOTO    LOP2
         DECFSZ   REGT2
         GOTO    LOP3
         DECFSZ   REGT1
         GOTO    LOP4


RETURN
END

Conectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 5857
Re:Comenzando con PIC16F887
« Respuesta #8 en: 18 de Enero de 2017, 19:32:36 »
Este deberia funcionar:

Código: ASM
  1.     LIST P=16F887
  2.     INCLUDE "p16f887.inc"
  3.  
  4.  __CONFIG _CONFIG1, _FOSC_INTRC_NOCLKOUT & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_ON & _IESO_ON & _FCMEN_ON & _LVP_OFF
  5.  __CONFIG _CONFIG2, _BOR4V_BOR21V & _WRT_OFF
  6.  
  7.     CBLOCK   0X20
  8.     REGT1    
  9.     REGT2    
  10.     REGT3    
  11.     ENDC
  12.  
  13.    ORG 0X00
  14.    GOTO SETUP
  15.    ORG 0x04
  16.    RETURN
  17.  
  18.  
  19. SETUP:
  20.     BANKSEL ANSEL
  21.     CLRF    ANSEL               ;SELECCIONA COMO DIGITALES I/O
  22.  
  23.     BANKSEL PORTA
  24.     CLRF    PORTA               ;LIMPIA PORTA
  25.     CLRF    PORTB
  26.     CLRF    PORTC
  27.     CLRF    PORTD
  28.     CLRF    PORTE
  29.  
  30.     BANKSEL TRISA
  31.     CLRF    TRISA               ;PUERTO A COMO SALIDA DE DATOS
  32.     MOVLW   B'00000000'
  33.     MOVWF   TRISB
  34.     MOVWF   TRISC
  35.     MOVWF   TRISD
  36.     MOVWF   TRISE  
  37.  
  38.     BANKSEL PORTA
  39.  
  40. INICIO
  41.  
  42.     MOVLW   B'11111111'
  43.     MOVWF   PORTA
  44.     MOVWF   PORTB
  45.     MOVWF   PORTC
  46.     MOVWF   PORTD
  47.     MOVWF   PORTE
  48.     CALL    RET1S
  49.     MOVLW   B'00000000'
  50.     MOVWF   PORTA
  51.     MOVWF   PORTB
  52.     MOVWF   PORTC
  53.     MOVWF   PORTD
  54.     MOVWF   PORTE
  55.     CALL    RET1S
  56.  
  57.     GOTO INICIO
  58.  
  59. RET1S
  60.     movlw       0x07        ;999990 cycles
  61.     movwf       REGT1
  62.     movlw       0x2F
  63.     movwf       REGT2
  64.     movlw       0x03
  65.     movwf       REGT3
  66. RET1S_0
  67.     decfsz      REGT1, f
  68.     goto        $+2
  69.     decfsz      REGT2, f
  70.     goto        $+2
  71.     decfsz      REGT3, f
  72.     goto        RET1S_0
  73.  
  74.     goto        $+1         ;6 cycles
  75.     goto        $+1
  76.     goto        $+1
  77.  
  78.     return                  ;4 cycles (including call)
  79.    
  80.     END

Problemas que encontre en tu codigo:

- Le faltan FUSES y algunos estan mal, por ejemplo _BOR_OFF es de CONFIG_1..
- No se bien como tenes las identaciones pero por ejemplo LIST e INCLUDE no deberian estar en la primer columna, asi como CBLOCK entre otros.
- No tiene sentido que pongas el oscilador a 4Mhz por que es el valor por default o de POR ( Power-on-reset ) que tiene, asi que no hay necesidad de cambiarle la velocidad.
- En tu delay hay algo confuso, hay un GOTO LOP2 y ni siquiera existe. Asi que procedi directamente a buscar una calculador online para que me genere el delay y asi ponerlo aca