Software PWM en un PIC10F202 (LED de atenuación en bucle)

2

Actualmente estoy haciendo todo lo posible para codificar una solución de software para PWM en un PIC20F202 pero tengo un problema. Estoy probando un desvanecimiento en bucle y un fundido con un LED y está funcionando bien y sin problemas, pero en intervalos un tanto regulares, hay un fuerte golpe en la secuencia de desvanecimiento que no puedo explicar de ninguna manera. He mirado el código tantas veces, he comprobado los contactos en la placa de pruebas, no sé qué más debo buscar.

/******************************************************************************/
/* Files to Include                                                           */
/******************************************************************************/

#if defined(__XC)
    #include <xc.h>         /* XC8 General Include File */
#elif defined(HI_TECH_C)
    #include <htc.h>        /* HiTech General Include File */
#endif

#include <stdint.h>        /* For uint8_t definition */
#include <stdbool.h>       /* For true/false definition */

#include "system.h"        /* System funct/params, like osc/peripheral config */
#include "user.h"          /* User funct/params, such as InitApp */

/******************************************************************************/
/* User Global Variable Declaration                                           */
/******************************************************************************/

/* i.e. uint8_t <variable_name>; */

/******************************************************************************/
/* Main Program                                                               */
/******************************************************************************/

#define _XTAL_FREQ 4000000

void main(void)
{
    /* Configure the oscillator for the device */
    ConfigureOscillator();

    /* Initialize I/O and Peripherals for application */
    InitApp();

    /* TODO <INSERT USER APPLICATION CODE HERE> */
    const uint8_t MAX = 100;
    uint16_t oncount=1;
    int8_t delta=1;

    TRIS = 0b111101;

        for(;;){

                GPIO = 0b000010;
                for(uint16_t i=1;i<oncount;i++)
                    __delay_us(1);

                GPIO =0;
                for(uint16_t i=1;i<(MAX-oncount);i++)
                    __delay_us(1);

                oncount += delta;

                if(oncount == MAX)
                    delta = delta * (-1);
                if(oncount == 0)
                    delta = delta * (-1);

        }



}
    
pregunta user17750

2 respuestas

1

Acabo de tener problemas con tu código, simplificándolo un poco para obtener un simple desvanecimiento en el trabajo. Tuve que cambiar algunas cosas porque usé un PIC16F690, pero aquí está la rutina principal (tuvo que escribir una rutina de retardo simple ya que no se encontraron algunos de los archivos de encabezado)
No dormí aquí, así que mis cerebros se confundieron un poco (es decir, no he visto por qué su código no funciona, tal vez el WDT, como he señalado en los comentarios, observe el #pragma WDTE = OFF en mi código), pero podría ayudarlo a comenzar, de todos modos.

#pragma config WDTE = OFF
#define _XTAL_FREQ 4000000

void delay(int d);

void main(void)
{
    /* Configure the oscillator for the device */
   // ConfigureOscillator();

    /* Initialize I/O and Peripherals for application */
//    InitApp();

    /* TODO <INSERT USER APPLICATION CODE HERE> */
    const uint8_t MAX = 1000;
    uint16_t oncount=1;
    int8_t delta=1;

    TRISBbits.TRISB6 = 0;

        for(;;){

                PORTBbits.RB6 = 1;
                //for(uint16_t i=1;i<oncount;i++)
                    delay(oncount);

                PORTBbits.RB6 = 0;
                //for(uint16_t i=1;i<(MAX-oncount);i++)
                    delay(MAX - oncount);

                oncount++;

                if(oncount == MAX)
                  oncount = 0;
               // if(oncount == 0)
                 //   delta = delta * (-1);

        }



}

void delay(int d)
{
    while(d)
    {
        d--;
    }
}
    
respondido por el Oli Glaser
0

No ha publicado sus bits de configuración, pero puede ser que tenga el temporizador de vigilancia habilitado y, como no lo está eliminando en el bucle principal, puede que se agote el tiempo y reinicie el microcontrolador. Todas las variables se reiniciarían y vería que el led saltaba de nuevo a apagado y aumentaba. Esto sucedería una y otra vez con un período constante.

Intenta borrar el temporizador de vigilancia en tu bucle principal.

    
respondido por el apalopohapa

Lea otras preguntas en las etiquetas