Soft PWM in C für PIC optimieren

Gast #1241072
Lesenswert?

Kann man hier noch optimieren? Wird mit PICC-Lite compiliert und soll 
bei 4 MHz mit 80*256 Hz laufen..

Irgendwie schafft es aber nur 60 Hz obwohl die Simulation 
durchschnittlich nur 33 Zyklen (=33 µs * 256 -> 118 Hz) braucht.

Oder liegt es am toggle:  60 = 118 / 2 ?
1
void interrupt isr(void)
2
{
3
  if(T0IF)
4
  {
5
    TMR0 = RELOAD;
6
    gTick++;
7
    if(gTick == 0)
8
    {
9
      if(gRed) 
10
        RED = ON;
11
      if(gGreen)
12
        GREEN = ON;
13
      if(gBlue)
14
        BLUE = ON;
15
    }
16
    else
17
    {
18
      if(gTick > gRed)
19
        RED = OFF;
20
      if(gTick > gGreen)
21
        GREEN = OFF;
22
      if(gTick > gBlue)
23
        BLUE = OFF;
24
    }
25
    if(gDelay > 0) gDelay--;
26
    T0IF = 0;
27
  }
28
}
Gast #1241087
Lesenswert?

80*256 Hz  sollten kein Problem darstellen, aber hier fehlen die ganzen 
Typen, die Initialisatzion des TMR0 incl Prescaler (OPTION).

Hier ein paar kleinigkeiten, wegen Optimierung.

void interrupt isr(void)
{
  if(T0IF)
  {
    TMR0 = RELOAD;
    if(!++gTick)
    {
 // Wenn RED ein flag (bit) ist, wäre  RED=gRed; effizienter.
     if(gRed)
        RED = ON;
      if(gGreen)
        GREEN = ON;
      if(gBlue)
        BLUE = ON;
    }
    else
    {
      if(gTick > gRed)
        RED = OFF;
      if(gTick > gGreen)
        GREEN = OFF;
      if(gTick > gBlue)
        BLUE = OFF;
    }
// wenn gDelay ein unsigned ist, dann ist if(gDelay) gDelay--; 
effizienter
    if(gDelay > 0) gDelay--;
    T0IF = 0;
  }
}
Gast #1241109
Lesenswert?

Hier die Variablen
1
unsigned char gRed = 0;
2
unsigned char gGreen = 0;
3
unsigned char gBlue = 0;
4
volatile unsigned char gTick = 0;
5
volatile unsigned char gDelay = 0;

> if(!++gTick)
Ok.

> if(gDelay > 0)
Das hätte ich sehen müssen ;-)

> Wenn RED ein flag (bit) ist, wäre  RED=gRed; effizienter.
Ist ein GPIO bit
1
static volatile bit  GPIO0  @ (unsigned)&GPIO*8+0;
aber das funktioniert nicht (es wird nie gesetzt).

Die beiden anderen Änderungen wirken sich nicht auf die Codegröße aus, 
aber vielleicht spart es ja irgendwelche Spünge..

Danke soweit.
Fehlt noch eine Tastenentprellung und ein 2 kHz Rechteck.. :-)
Gast #1241216
Lesenswert?

> Wenn RED ein flag (bit) ist, wäre  RED=gRed; effizienter.
Ist ein GPIO bitstatic volatile bit  GPIO0  @ (unsigned)&GPIO*8+0;

aber das funktioniert nicht (es wird nie gesetzt).

In diesem Falle ist RED eine bitvariable, also
 REG=gRed ist besser.

Poste mal den ganzen code, denn auch wenn der Code doppels so groß wäre,
müsstest du die Frequenz locker schaffen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren