Software-PWM auf einem PIC10F202 (Loop-Fading-LED)

Ich versuche derzeit mein Bestes, um eine Softwarelösung für PWM auf einem PIC20F202 zu codieren, aber ich habe ein Problem. Ich versuche ein Loop-Fade-Out und Fade mit einer LED und es funktioniert gut und sehr reibungslos, aber in einigermaßen regelmäßigen Abständen gibt es eine harte Beule in der Fading-Sequenz, die ich auf keinen Fall erklären kann. Ich habe mir den Code so oft angesehen, ich habe die Kontakte auf dem Steckbrett überprüft, ich weiß nicht, was ich sonst noch überprüfen soll.

/******************************************************************************/
/* 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);

        }



}
Kommt die Beule in regelmäßigen Abständen? Bedeutet der harte Stoß, dass die Sequenz von vorne beginnt?
Versuchen Sie, den Watchdog-Timer (clrwdt) innerhalb der Hauptschleife zu löschen.

Antworten (2)

Ich habe gerade mit Ihrem Code herumgespielt und ihn ein wenig vereinfacht, um eine einfache Einblendung zum Laufen zu bringen. Ich musste ein paar Dinge ändern, da ich einen PIC16F690 verwendet habe, aber hier ist die Hauptroutine (musste eine einfache Verzögerungsroutine schreiben, da einige der Header-Dateien nicht gefunden wurden)
. habe mir nicht angesehen, warum Ihr Code nicht funktioniert - vielleicht das WDT, wie ich gerade aus den Kommentaren bemerkt habe - beachten Sie das #pragma WDTE = OFFin meinem Code), aber es könnte Ihnen trotzdem beim Einstieg helfen.

#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--;
    }
}

Sie haben Ihre Konfigurationsbits nicht gepostet, aber es kann sein, dass Sie den Watchdog-Timer aktiviert haben, und da Sie ihn nicht in der Hauptschleife löschen, kann es zu einer Zeitüberschreitung kommen und den Mikrocontroller zurücksetzen. Alle Ihre Variablen würden neu initialisiert und Sie würden sehen, wie die LED wieder auf Aus springt und hochfährt. Dies würde immer wieder mit einer konstanten Periode passieren.

Versuchen Sie, den Watchdog-Timer in Ihrer Hauptschleife zu löschen.