PWM Fehler im code aber wo?

Gast #546071
Lesenswert?

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
}
#546113
Lesenswert?

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 #546213
Lesenswert?

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
#546216
Lesenswert?

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 #546231
Lesenswert?

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);
}
#553707
Lesenswert?

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.
Gast #553781
Lesenswert?

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

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