www.mikrocontroller.net

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


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?
void interrupt isr(void)
{
  if(T0IF)
  {
    TMR0 = RELOAD;
    gTick++;
    if(gTick == 0)
    {
      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;
    }
    if(gDelay > 0) gDelay--;
    T0IF = 0;
  }
}

Autor: C. H. (_ch_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo?

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

Gruß
Christian

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
  }
}

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auflösung 8 Bit, kein Prescaler.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier die Variablen
unsigned char gRed = 0;
unsigned char gGreen = 0;
unsigned char gBlue = 0;
volatile unsigned char gTick = 0;
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
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.. :-)

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da ist irgendwie eine Zeile verschwunden:

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

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.