www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PWM Fehler im code aber wo?


Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
void main( void )
{  
char richtung=0;
char x=0;
char null=0;

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

 while(1)
  {
    if(PORTAbits.RA4)                 // Taste RA4 gedrückt
    {
      if(richtung)              // Richtung 
      {
        if( ++CCPR1L == 0xFF)          // Ist die niedrigste  PW ereicht
        {
          richtung=0;                // wenn ja dann Richtungsänderung
        }  
      }
      else
      {
        if( --CCPR1L == 0x00 )        // Ist die oberste Erreicht PW erreicht?
        {
          richtung=1;                 // wenn ja dann Richtungsänderung
        }
      }
    }
    for( x=0; x<MAX_DELAY; x++)       // MAX_DEL * 65 ms warten, 
    {                                 
      null = 0;
      while( ! null );            // endlos
    }
  }
}

Autor: Zip (Gast)
Datum:

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

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
er bleibt bei if(PORTAbits.RA4) hängen und schaltet eine led ein weiter 
geht es dann nicht mehr

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wie gedenkst du, dass der µC aus
dieser Endlosschleife

      null = 0;
      while( ! null );

jemals wieder herauskommen soll?

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mh wenn Sie weg ist geht auch wenig

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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


Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mh was muss ich auskommentieren das die PWM ohne Tasten funktionieren 
sollte. ?!

Autor: Johannes Slotta (johanness)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ersetze mal testweise
if(PORTAbits.RA4)
durch
if(1)

(und sorge dafür, dass die Warteschleife wirklich funktioniert, sonst 
ist es so schnell, dass du nichts siehst und wieder denkst, dass nix 
geht)

Autor: gast (Gast)
Datum:

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

void main(void)   
{    
TIMER_INT_ON;
T2_PS_1_4;
OpenPWM1(0xff);
SetDCPWM1(0);
}

einzuschalten

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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:
void main( void )
{  
  PR2=0xFF;                   // Frequenz der PWM jetzt maximal  
  CCPR1L=PR2>>1;              // Setzen Duty Cycle 50:50
  TRISB=0b00000001;           // Port B0 = PWM Ausgang
  T2CON=0b01111111;           // Bit 7 immer 0 ,Postscale Bit 6-3, Timer 2 an aus Bit 2
                              //          ,Prescale Bit 1-0
  CCP1CON = 0b1100;           // Erweiterung auf 10bit Mode PWM mode; 
                              // P1A, P1C active-high; P1B, P1D active-high  

  CCPR1L = 128;

  while( 1 )
    ;
}

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


Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also RB3 springt an egal welcher Wert immer gleich hell.?!

Autor: gast (Gast)
Datum:

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

Autor: glab (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habe ein ähnliches Problem wie realisiert man eine Software PWM ?!

Ein C beispielscode wäre Klasse

Vielen Dank

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du lässt eine Variable mit einer bestimmten Frequenz hochzählen. Wenn 
sie einen bestimmten Wert erreicht schaltest du deinen Ausgang aus, 
tritt ein Überlauf ein, schaltest du wieder ein. Alles ganz einfach.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
glab wrote:
> habe ein ähnliches Problem wie realisiert man eine Software PWM ?!
>
> Ein C beispielscode wäre Klasse


z.B.:

Beitrag "PWM-Lauflicht"


Peter

Autor: glab (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@phil

sa dahingeschrieben ja aber wie realisier ich das in C?

Autor: Peter Dannegger (peda)
Datum:

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

Autor: glab (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bräuchte ein Beispiel! pwm

Autor: Holla Die waldfee (schlucke)
Datum:
Angehängte Dateien:

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

Autor: glab (Gast)
Datum:

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

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.