PWM Fehler im code aber wo?

Gast #546071
Hallo zusammen

ich finde den Fehler oder die Fehler nicht. Es soll das getan werden was 
jeder machen will mit einer PWM eine LED dimmen per Tastedruck.

LED RB0
Taster RA4
1
void main( void )
2
{  
3
char richtung=0;
4
char x=0;
5
char null=0;
6

7
   
8
PR2=0xFF;                    // Frequenz der PWM jetzt maximal  
9
CCPR1L=PR2>>1;              // Setzen Duty Cycle 50:50
10
TRISB=0b00000001;              // Port B0 = PWM Ausgang
11
T2CON=0b01111111;              // Bit 7 immer 0 ,Postscale Bit 6-3, Timer 2 an aus Bit 2
12
                    //          ,Prescale Bit 1-0
13
CCP1CON = 0b1100;              // Erweiterung auf 10bit Mode PWM mode; 
14
                    // P1A, P1C active-high; P1B, P1D active-high  
15

16
 while(1)
17
  {
18
    if(PORTAbits.RA4)                 // Taste RA4 gedrückt
19
    {
20
      if(richtung)              // Richtung 
21
      {
22
        if( ++CCPR1L == 0xFF)          // Ist die niedrigste  PW ereicht
23
        {
24
          richtung=0;                // wenn ja dann Richtungsänderung
25
        }  
26
      }
27
      else
28
      {
29
        if( --CCPR1L == 0x00 )        // Ist die oberste Erreicht PW erreicht?
30
        {
31
          richtung=1;                 // wenn ja dann Richtungsänderung
32
        }
33
      }
34
    }
35
    for( x=0; x<MAX_DELAY; x++)       // MAX_DEL * 65 ms warten, 
36
    {                                 
37
      null = 0;
38
      while( ! null );            // endlos
39
    }
40
  }
41
}
Gast
Der Standardweg ist einen freien Pin zu nehmen und einen puls 
rauszugeben wenn der code ausgfuehrt wird. Damit kann man rausfinden 
welcher code ausgefuehrt wird.
gast wrote:
> mh wenn Sie weg ist geht auch wenig


Das mag sein.
Aber mit einer Endlosschleife macht der µC dann nur noch
genau das: endlos in einer Schleife hängen und deine
Tasten sind ihm egal.
Die Endlosschleife ist als mit SIcherheit nicht das
richtige Werkzeug (frag dich mal: Werkzeug wofür?)

Funktioniert den die PWM, wenn du sie mal
ohne Tasten machst? (Damit wir mal abklären ob
dein Setup für die PWM überhaupt stimmt).

Gast
Danke

ich bin jetzt aber übergangen die von C18 angebotenen Routinen zu 
verwenden

Jedoch wie bringt ich jetzt den Pic dazu eine LED damit
1
#pragma code 
2

3
void main(void)   
4
{    
5
TIMER_INT_ON;
6
T2_PS_1_4;
7
OpenPWM1(0xff);
8
SetDCPWM1(0);
9
}

einzuschalten
gast wrote:
> Mh was muss ich auskommentieren das die PWM ohne Tasten funktionieren
> sollte. ?!


Ah. Du versucht sich schon wieder wer am 5. Schritt noch bevor
er den ersten Schritt beherrscht :-)

Na so halt:
1
void main( void )
2
{  
3
  PR2=0xFF;                   // Frequenz der PWM jetzt maximal  
4
  CCPR1L=PR2>>1;              // Setzen Duty Cycle 50:50
5
  TRISB=0b00000001;           // Port B0 = PWM Ausgang
6
  T2CON=0b01111111;           // Bit 7 immer 0 ,Postscale Bit 6-3, Timer 2 an aus Bit 2
7
                              //          ,Prescale Bit 1-0
8
  CCP1CON = 0b1100;           // Erweiterung auf 10bit Mode PWM mode; 
9
                              // P1A, P1C active-high; P1B, P1D active-high  
10

11
  CCPR1L = 128;
12

13
  while( 1 )
14
    ;
15
}

und dann tauscht du mal in der Zeile
  CCPR1L = 128;
die Zahl 128 gegen andere Zahlen von 0 bis 255 aus.

Gast
Jetzt würde ich gerne am Port RB0 die LED leuchtne lassen mit diesem 
code.

was muss noch geändert werden=

void main (void)
{

  OpenPWM1(255);
  OpenTimer2(TIMER_INT_OFF &
         T2_PS_1_1 &
         T2_POST_1_1);

  SetDCPWM2(50);
}
gast wrote:
> Hallo zusammen
>
> ich finde den Fehler oder die Fehler nicht. Es soll das getan werden was
> jeder machen will mit einer PWM eine LED dimmen per Tastedruck.

Dann würde ich erstmal die Aufgaben voneinander trennen.

Entprellen einer Taste, Kurzdruck, Langdruck, Repeatfunktion würde ich 
so machen:

Beitrag "Universelle Tastenabfrage"


Der Rest (PWM ändern) ist dann nur noch ein Klacks.
Dabei würde ich aber die PWM per Tabelle logarithmisch ändern.
Lineare Lichstärkeänderungen sieht das Auge sehr schlecht.


Peter

P.S.:
Auch in der Softwareentwicklung gilt: "Teile und herrsche."

Die richtige Aufgabenteilung ist schon mindestens 50% der Lösung.
glab wrote:
> bräuchte ein Beispiel! pwm



Arbeite zur zeit mit dem mechatronics demoboard von microchip

im anhang ist ein c code mit dem ich zwei dioden und einen DC-motor per 
pwm ansteuere. habs aber noch nicht ganz entmüllt musst du mal schaun.
Angehängte Dateien:
Gast
ich schaue es mir bis heute Abend mal an und poste dann mein Ergebniss 
sodas ich an einem Pin eine LED per Software dimmen kann.

Ganz interessant wäre auch wie ich eine Spannung per PWM einstellen kann 
( per HArdware PWM.

Ich sollte die Spannung an einem Bauteile immer wieder ändern wie 
funktioniert das mit der Hardware PWM. ( wenn ich mein Programm nehme 
mit diesem ich per Hardware pwm eine LED dimmen und das umbaue geht es 
einfach nicht )

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.