Configuración del oscilador interno con PIC16F1829

0

Acabo de empezar a trabajar con los microcontroladores PIC y actualmente estoy usando MPLAB X IDE con un PIC KIT 3. He estado tratando de obtener un simple código de parpadeo de LED para ejecutarlo en un PIC16F1829 usando el oscilador interno a 16 Mhz. Sin embargo, el comportamiento de los LEDs es aleatorio. El código que estoy usando se muestra a continuación.

#define _XTAL_FREQ 8000000

#include <stdio.h>
#include <stdlib.h>
#include <pic16f1829.h>
#include <xc.h>

// BEGIN CONFIG
#pragma config FOSC = INTOSC // Oscillator Selection bits (Internal oscillator)
#pragma config WDTE = ON // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
//END CONFIG



int main() {

  OSCCON = 0b01110011; 
  OSCTUNE = 0b00000000;
  TRISC6 = 0; 
  TRISC5 = 0;

  while(1)
  {
    RC6 = 1;  // LED ON
    __delay_ms(500); // 0.5 Second Delay
    RC6= 0;  // LED OFF
    __delay_ms(500); // 0.5 Second Delay
    RC5 = 1;
    __delay_ms(500);
    RC5 = 0;
    __delay_ms(400);
  }
  return 0;

}

Estoy bastante seguro de que el problema está en el oscilador o en la forma en que lo configuro, ya que puedo encender cualquier LED al inicio. El problema surge cuando introduzco retrasos para hacer que los LED parpadeen. El uso de retardos de 5000 significa que el primer LED se enciende y luego no pasa nada. El uso de retardos de 1000 hace que el primer LED parpadee con un retraso de alrededor de 1,5 segundos con el segundo LED siempre encendido. El uso de retardos de 500 o menos hace que ambos LED parpadeen, pero a diferentes frecuencias y patrones.

¿Podría alguien ayudarme a encontrar lo que estoy haciendo mal?

    
pregunta user2802349

2 respuestas

2

Algunas cosas para ver:

  1. Su código habilita el temporizador de vigilancia, pero nunca está emitiendo ningún comando CLRWDT. Recomendaría desactivar el temporizador de vigilancia hasta que el código funcione.

    El temporizador de vigilancia es básicamente un contador. Cuando se desborda, el microcontrolador se reinicia. Para usarlo correctamente, su código debe seguir reiniciando el contador para que nunca realmente se desborde.

    Para hacer esto, su bucle de código debería emitir un comando CLRWDT regularmente. La idea es que, si el microcontrolador se atasca de alguna manera (ya sea por un problema de código o por un problema de hardware), dejará de borrar el temporizador de vigilancia. Por lo tanto, el temporizador se desbordará y reiniciará automáticamente el microcontrolador en lugar de quedarse allí sentado para siempre.

    Si recuerdo correctamente, el período predeterminado de WDT es de 2 segundos, después de lo cual el PIC se reiniciará.

  2. Agregue un condensador de desacoplamiento (a tierra) en el pin VDD del PIC. El valor no es crítico; cualquier cosa alrededor de 0.1uF o 1uF debería estar bien.

    Las tapas de desacoplamiento son muy importantes para los circuitos integrados digitales. Si no está familiarizado con ellos, pase algo de tiempo en Google o aquí en la pila electrónica.

respondido por el bitsmack
2

Además de la observación correcta de @ bitsmack de que ha habilitado el perro guardián y nunca lo ha "pateado", lo que provocó que su PIC se reiniciara & Una vez más, hay una inconsistencia en lo que describe y en lo que está haciendo.

Escribes en tu pregunta "usando el oscilador interno a 16 Mhz", pero la primera línea de tu programa es "#define _XTAL_FREQ 8000000".

Las funciones de la biblioteca que implementan las funciones de retardo que estás usando necesitan saber qué tan rápido se está ejecutando el PIC y usan ese valor #define para eso, por lo que les estás dando información incorrecta.

Cambie el 8000000 a 16000000 y deshabilite el perro guardián o aprenda a patearlo y sus LED deberían comenzar a comportarse como espera.

    
respondido por el brhans

Lea otras preguntas en las etiquetas