Autor Tema: configurar pic16f1938 a 32MHz  (Leído 3660 veces)

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

Desconectado rbpkirow

  • PIC10
  • *
  • Mensajes: 21
configurar pic16f1938 a 32MHz
« en: 21 de Julio de 2011, 08:17:17 »
Hola.
Estoy intentando configurar el pic 16f1938 a 32 MHz de oscilador interno.
Para ello, estoy haciendo un programilla que encienda un led 1 segundo, lo mantenga apagado 1 segundo:

Código: [Seleccionar]
__CONFIG(FOSC_INTOSC & WDTE_OFF & PWRTE_OFF & MCLRE_ON & CP_OFF & CPD_OFF & BOREN_OFF & CLKOUTEN_OFF & IESO_OFF & FCMEN_OFF & WRT_OFF & VCAPEN_OFF & PLLEN_ON & STVREN_ON & BORV_25 & LVP_OFF);

...

void main()
{
   OSCCON=0b11110010; // 32MHz
  ANSELA=0; // Todo I/O digital
  ANSELB=0;

  TRISA=0x00; // Salida
  LED_V = 0;
   while(1)
   {
      LED_V = !LED_V;
      Delay_1s();
   }
}

void Delay_1s()
{
// Temporizacion = (65536 - Precarga)*PS*(4/fosc);
//   0.05 = (65536 - Precarga)*PS*(4/32e+6);
// 400000  = (65536 - Precarga)*8;
//  50000 = (65536 - Precarga);
// Precarga = (65536 - 50000) = 15536
// Lo pasamos a hexadecimal y resulta mas sencillo asignar TMR1H y TMR1L;
// Precarga = 15536 d = 0x3CB0;
// TMR1H = 0x3C;
// TMR1L = 0xB0;



// Configuracion del modulo Timer1
// Seleccionamos preescala:
TMR1ON = 0;
TMR1CS1 = 0; // Fuente de temporizador = frecuencia de oscilacion
TMR1CS0 = 0;

T1CKPS1 = 1; // Valor de preescala = ==> 1:8-->cada 8 ciclos cuenta 1
T1CKPS0 = 1;
int contador=20;


while(contador>=0)
{
TMR1H = 0x3C;
TMR1L = 0xB0;
TMR1IF = 0;

TMR1ON = 1;
while(!TMR1IF); // Este bucle espera a que termine la cuenta--> 50 msg
contador--;
TMR1ON = 0;
}
}



Resulta que con este codigo, el led se enciende 4 segundo, se apaga 4 segundos, es decir, que la frecuencia es de 8MHz, no me esta funcionando el PLL. Alguien me puede decir donde tengo el fallo, si tengo que activar algun bit mas o algo?

muchas gracias
un saludo


Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: configurar pic16f1938 a 32MHz
« Respuesta #1 en: 21 de Julio de 2011, 23:36:21 »
  Hola, te hago un par de preguntas...

  ¿Lo estás simulando o probando en físico?
  ¿Qué compilador estás usando, por la sintaxis me parece Hitech C?

  Si es Hitech C, creo recordar que para configurar las diferentes palabras de configuración había que escribir algo así...

Código: C
  1. __CONFIG (xxxxxxx & xxxxxx & xxxxxx); // configura la primer palabra
  2. __CONFIG (xxxxx & xxxxx & xxxxxxx); // configura la segunda palabra
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado rbpkirow

  • PIC10
  • *
  • Mensajes: 21
Re: configurar pic16f1938 a 32MHz
« Respuesta #2 en: 22 de Julio de 2011, 04:10:58 »
Hola AngelGris.
Estoy haciendolo sobre una placa fisica, no en simulacion.
En cuanto a la programacion, efectivamente es compilador Hi-Tech. Probaré ahora con la forma que me indicas de configurar la palabra a ver si se soluciona

Sobre la placa fisica, he conseguido hacer que el led encienda/apague cada 4 segundos. Esto me indica que esta funcionando a una frecuencia de 8MHz segun los calculos que tengo hechos.
He realizado tambien una comprobacion del funcionamiento del PLL mediante el siguiente programa

Código: [Seleccionar]
#include <htc.h>
#include "delay.h"

#define LED_V RA1

// Configuración para oscilador interno con PLL
__CONFIG(FOSC_INTOSC & WDTE_OFF & PWRTE_OFF & MCLRE_ON & CP_OFF & CPD_OFF & BOREN_OFF & CLKOUTEN_OFF & IESO_OFF & FCMEN_OFF & WRT_OFF & VCAPEN_OFF & PLLEN_ON & STVREN_ON & BORV_25 & LVP_OFF);


void main(void)
{
ANSELA=0; // Todo I/O digital
ANSELB=0;

OSCCON = 0b11110011; // 32MHz
SPLLEN = 1;

TRISA = 0x00; // Puerto A --> Salida
PORTA = 0x00; // Todas las salidas a 0


RA1 = 1; // Activo Led Rojo
while(PLLR == 0); // Cuando el PLL sea correcto, sale del bucle y apaga el led
RA1 = 0;

LED_V = 0;
while(1)
{
LED_V = !LED_V;
Delay_1s(); // Parpadeo de led 1 segundo
}
} // void main()

y resulta que nunca se apaga el led rojo, es decir, que por alguna razon el PLL no esta activo.

Voy a probar con lo que me indicas de configurar por separado las 2 palabras y a ver que ocurre.
Por favor, indicame si ves algun problema sobre el programa anterior.
Muchas gracias por la ayuda

Desconectado rbpkirow

  • PIC10
  • *
  • Mensajes: 21
Re: configurar pic16f1938 a 32MHz
« Respuesta #3 en: 22 de Julio de 2011, 06:38:44 »
Hola.
He modificado la forma de configurar las palabras de configuracion, pero nada, sique haciendo lo mismo.

Alguna idea?
muchas gracias

Desconectado tannke

  • PIC16
  • ***
  • Mensajes: 176
Re: configurar pic16f1938 a 32MHz
« Respuesta #4 en: 22 de Julio de 2011, 15:52:20 »
Si abres el *hex con el winpic800 y vas a config. te sale el "PLLEN" habilitado? Yo es que hace tiempo me paso que configuraba mal el config con MPLAB en asm y el compilador no me daba error, me volví loco hasta que me dio por mirar el config del winpic800 y ahi vi que no lo configuraba bien.

saludos

Desconectado rbpkirow

  • PIC10
  • *
  • Mensajes: 21
Re: configurar pic16f1938 a 32MHz
« Respuesta #5 en: 26 de Julio de 2011, 04:26:21 »
Al abrir el .Hex con winpic800, sí que me activa el PLL.
Adjunto captura del winpic800 por si veis algo que no cuadre, y que yo me haya saltado.
Muchas gracias