Forum: Mikrocontroller und Digitale Elektronik Soft PWM in C für PIC optimieren


von Gast (Gast)


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
}

von C. H. (_ch_)


Lesenswert?

Hallo?

jetzt wäre noch interessant:
- Timer-prescaler?
- Interrupt-Post-Scaler?
- Auflösung gRed, gGreen, gBlue

Gruß
Christian

von Chris (Gast)


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

von Gast (Gast)


Lesenswert?

Auflösung 8 Bit, kein Prescaler.

von Gast (Gast)


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.. :-)

von Gast (Gast)


Lesenswert?

Da ist irgendwie eine Zeile verschwunden:

Die beiden Sachen ändern nichts an der Codegröße,

von Chris (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.