www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AT89C51ED2 PWM-Duty per Taste verändern


Autor: Mathias Z. (matziz198)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Gemeinde,

kleines Problem: ich möchte den Tastgrad einer Hard-PWM an Pin 1.3 
verändern.
Der erste Programmentwurf funktioniert erstmal auch grundsätzlich. Taste 
"tief" macht dunkel und Taste "hoch" macht hell. Wenn ich am Ende des 
Arrays angekommen bin z.b. ganz dunkel (bei mir wert 255) springt wird 
die LED bei einem weiteren Tastendruck auf "tief" wieder auf einen sehr 
hellen Wert obwohl die LED bei weiteren Tastendrücken auf "tief" dunkel 
bleiben soll. Beim hellsten Wert das gleiche Verhalten. Springt bei 
weiteren Tastendrücken zw. hell und dunkel.
Tastenentprellen habe ich erstmal nicht implementiert und spielt in dem 
Fall auch keine Rolle.

Eine Weitere Frage betrifft die PWM selbst. Kann ich die Frequenz 
veringern ohne einen Timer oder ext. Signal zu verwenden? Habe jetzt 
PCA-Clock/6. Sollten ca. 2 MHz sein. Ich möchte ca. 200 bis 600 Hz 
haben.


MfG Matze
#include <at89c51xd2.h>


sbit pulsweite_tief=P2^2; // Drucktasten für Pulsweiten
sbit pulsweite_hoch=P2^5;

sbit Pin10=P1^0;    // kann raus beim richtigen programm
sbit Pin11=P1^1;
sbit Pin12=P1^2;
sbit Pin14=P1^4;
sbit Pin15=P1^5;
sbit Pin16=P1^6;
sbit Pin17=P1^7;
/*--------------------------------------------------------------------
Globale Variablen
----------------------------------------------------------------------*/
unsigned char pwm_array[32] = {255, 215, 181, 152, 128, 108, 91, 76, 64,
                               54, 45, 38, 32, 27, 23, 19, 16, 13, 11,
                               10, 8, 7, 6, 5, 4, 3, 3, 2, 2, 2, 1, 0};
/* invertierte PWM-Tabelle da LED bei 255 = dunkel und bei 0 = hell */

/*-----------------------------------------------------------------------
Zusatzfunktionen
------------------------------------------------------------------------*/

/*void wait(void)
{
unsigned int x;
for(x=1;x<=20000;x++); //Delay
}*/

void PWM_INI(void)
{ CMOD=0x00; // Interner Clock fpca/6 -- kein Interruptbetrieb
  CCON=0x00; // PCA steht still
  CCAPM0=0x42; // ECOM0-Bit und PWM0-Bit werden gesetzt
}

/*--------------------------------------------------------------------
Hauptprogramm
----------------------------------------------------------------------*/
void main(void)

{  
  static char old_level_t1=0;
  char new_level_t1;
  static char old_level_t2=0;
  char new_level_t2;
  
  char i=0;  // Arrayzaehler

  Pin10=0;   // andere Ports aus; kann raus beim richtigen programm
  Pin11=0;
  Pin12=0;
  Pin14=0;
  Pin15=0;
  Pin16=0;
  Pin17=0;
  
  PWM_INI();  // PWM-Initialisierung
  CR=1;    // PWM starten
  CCAP0H=255;  // Startwert der PWM
  
  while(1)        // Endlosschleife
  {   
    new_level_t1 = (pulsweite_hoch != 0);    //Taste 1 Flankenerkennung
    if(!old_level_t1 && new_level_t1)
      {
        if(i <= 31)    // steigende flanke erkannt 
        {i++;}        // gehe ein Feld weiter
        else
        {i=31;}
        CCAP0H=pwm_array[i];  // schreibe aktuelle stelle in Register Tastgrad      
      }
      old_level_t1 = new_level_t1;

    new_level_t2 = (pulsweite_tief != 0);  //Taste 2 Flankenerkennung
    if(!old_level_t2 && new_level_t2)
      {
        if(i >= 0)  // steigende flanke erkannt 
        {i--;}  // gehe ein Feld zurueck
        else
        {i=0;}
        CCAP0H=pwm_array[i];  // schreibe aktuelle stelle in Register Tastgrad
      }
      old_level_t2 = new_level_t2;
  }
}

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>        if(i <= 31)    // steigende flanke erkannt
>        {i++;}        // gehe ein Feld weiter

Dein Array hat nur die Indizes 0..31.
Das letzte i++ kann aber auf 32 kommen.
Peng Arrayindex falsch.

Hier das selbe in umgekehrter Richtung:

>        if(i >= 0)  // steigende flanke erkannt
>        {i--;}  // gehe ein Feld zurueck

i kann kleiner Null werden. Peng;)

Mach die beiden = weg.
Also

  if(i < 31)    // steigende flanke erkannt
  if(i > 0)  // steigende flanke erkannt

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mathias Z. schrieb:
> if(i <= 31)    // steigende flanke erkannt
>
>         {i++;}        // gehe ein Feld weiter
>
>         else
>
>         {i=31;}
>
>         CCAP0H=pwm_array[i];  // schreibe aktuelle stelle in Register Tastgrad

Dein Fehler ist die if-Bedingung. Wenn i == 31 erhöhst du auf 32 und 
gibst den 1. Wert nach dem Array aus.
mit if (i < 31)... wird i auch nicht größer als 31.

mfg.

Autor: Mathias Z. (matziz198)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, kleiner Verständnissfehler.
Danke für die Hilfe!!

Autor: Mathias Z. (matziz198)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nochmal zur PWM Frequenz. Kennt einer von Euch eine Möglichkeit diese zu 
verringern ohne dabei einen Timer zu benutzen ? (bezugnehmend zum 1. 
Post)

//Matze

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Its clock input can be programmed to count any one of the following
signals:
• Peripheral clock frequency (FCLK PERIPH) ÷ 6
• Peripheral clock frequency (FCLK PERIPH) ÷ 2
• Timer 0 overflow
• External input on ECI (P1.2)


Peter

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.