Forum: Mikrocontroller und Digitale Elektronik pwm_phase und pwm_soll


von Klaus (Gast)


Lesenswert?

Habe auf https://www.mikrocontroller.net/articles/AVR_PWM das folgende 
Programm gefunden:
1
#define F_CPU 16000000UL    // Angabe der Frequenz, wichtig für die Zeit
2
#include <util/delay.h>      // Einbindung Datei Pause
3
#include <avr/io.h>        // Einbindung Datei Ausgänge
4
5
int main(void)
6
  {
7
  DDRA=0b00001000;      // DDR A auf Ausgang schalten
8
  PORTA=0b00001000;      // Port A auf aus
9
    pwm
10
   uint8_t pwm_soll = 50;     // gewünschter Dimmerwert 0..100
11
   uint8_t pwm_phase = 10;   // Laufwert der Schleife 0..100
12
   while( 1 )
13
     {
14
     if( pwm_soll == pwm_phase )
15
       {
16
       PORTA |=(1<<PINA3);    // LED 4 aus
17
       }
18
     pwm_phase++;
19
     if( pwm_phase == 100 )
20
       {
21
       pwm_phase = 0;
22
       PORTA &=~(1<<PINA3);  // LED 4 ein
23
       }
24
     }
25
   return 0;
26
  }
Das Programm läuft auf meinem Attiny. Die LED verändert seine Helligkeit 
je nach angebenen Wert von pwm_soll. Auf pwm_phase scheint sich nichts 
zu ändern. Was macht pwm_phase? Was macht pwm_soll eigentlich? Da sich 
die Helligkeit der LED verändert macht pwm_soll etwas aber was?
LG Klaus

von Heiner (Gast)


Lesenswert?

Zu dumm zum lesen:

steht doch da:
https://www.mikrocontroller.net/articles/AVR_PWM
//Initialisierung
pwm_phase = 0   // von 0 bis 100(99) ergibt ein moduliertes Signal
pwm_soll = 30  // Tastverhältnis in Prozent (Werte von 0..100)

//alle s Sekunden tue:
wenn pwm_soll = pwm_phase dann
  ausgang = LOW
wenn pwm_phase++ = 100 dann
  pwm_phase = 0
  ausgang = HIGH

lass das mit dem Programmieren lieber bleiben!!

von Rolf M. (rmagnus)


Lesenswert?

Klaus schrieb:
> Auf pwm_phase scheint sich nichts zu ändern.

Wie kommst du darauf? Laut Code ändert es sich bei jedem 
Schleifendurchlauf.

von Klaus (Gast)


Lesenswert?

Heiner schrieb:
> //alle s Sekunden tue:
> wenn pwm_soll = pwm_phase dann
>   ausgang = LOW
> wenn pwm_phase++ = 100 dann
>   pwm_phase = 0
>   ausgang = HIGH

Das habe ich gelesen. Wenn da pwm_phase++ steht, dann könnte man ja da 
von ausgehen das was gezählt wird oder eine Zeit eingestellt wird.
Wollte eigentlich nur wissen wie das funktioniert. Leider schweigt sich 
mein C-Buch dazu aus.

Rolf M. schrieb:
> Wie kommst du darauf? Laut Code ändert es sich bei jedem
> Schleifendurchlauf.

Das sehe ich auch, aber in der Anzeige der LED ist nichts zu sehen. Die 
Frage dazu ist wieder, wie oder was funktioniert in diesem Programm?
Da mein C-Bich nichts dazu sagt und im Netz auch nichts zu finden ist, 
frage ich halt danach.
Es ist leicht auf die kurze Erklärung zu verweisen. Man könnte ja fast 
denken das du es auch nicht weisst.

von Georg M. (g_m)


Lesenswert?

Zeichne dir ein Zeitdiagramm, alles wird selbsterklärend.

von Klaus (Gast)


Lesenswert?

Georg M. schrieb:
> Zeichne dir ein Zeitdiagramm

Gute Idee, Diagramm eigentlich kein Problem, doch was steht an den 
Achsen? Eine ist die Zeit und die andere?

von Thomas E. (thomase)


Lesenswert?

Klaus schrieb:
> Gute Idee, Diagramm eigentlich kein Problem, doch was steht an den
> Achsen? Eine ist die Zeit und die andere?

Entweder du bist ein Troll oder du bist wirklich so doof. Denken wir mal 
positiv und nehmen Letzteres an.

Die andere Achse ist für die Spannung. Also, ob die Led leuchtet oder 
nicht.

Bei Phase = 0 wird die Spannung eingeschaltet und bei Phase = Soll 
ausgeschaltet. Dann läuft Phase bis 99 weiter und geht dann statt auf 
100 wieder auf 0 und das Spielchen beginnt von vorne. Das sollst du 
grafisch darstellen. Wenn du es richtig machst, erhältst du eine PWM, 
wie sie im Buche steht.

von Heiner (Gast)


Lesenswert?

Klaus schrieb:
> Georg M. schrieb:
>> Zeichne dir ein Zeitdiagramm
>
> Gute Idee, Diagramm eigentlich kein Problem, doch was steht an den
> Achsen? Eine ist die Zeit und die andere?

Sag mal - bist Du ein Troll oder stellst Du Dich nur dumm oder bist Du 
wirklich doof? Weißt Du, was ein Diagramm ist?
Eine Achse ist die Zeit, die andere Achse ist dann ja wohl pwm_phase, 
oder?

von Rolf M. (rmagnus)


Lesenswert?

Klaus schrieb:
> Heiner schrieb:
>> //alle s Sekunden tue:
>> wenn pwm_soll = pwm_phase dann
>>   ausgang = LOW
>> wenn pwm_phase++ = 100 dann
>>   pwm_phase = 0
>>   ausgang = HIGH
>
> Das habe ich gelesen. Wenn da pwm_phase++ steht, dann könnte man ja da
> von ausgehen das was gezählt wird oder eine Zeit eingestellt wird.

Ja, ist auch so. Diese Zeile erhöht den Wert von pwm_phase um 1. Da das 
in einer Endlosschleife passiert, wird also offenbar pwm_phase permanent 
hochgezählt und zu bestimmten Zeiten wieder auf 0 zurückgesetzt (siehe 
zweite if-Abfrage). Deshalb ja meine Frage, wie du darauf kommst, dass 
sie das nicht ändere.

> Wollte eigentlich nur wissen wie das funktioniert. Leider schweigt sich
> mein C-Buch dazu aus.

Da steht nicht drin, was der Operator ++ macht? Dann wirf es weg.

> Rolf M. schrieb:
>> Wie kommst du darauf? Laut Code ändert es sich bei jedem
>> Schleifendurchlauf.
>
> Das sehe ich auch, aber in der Anzeige der LED ist nichts zu sehen.

Welche Anzeige? Ich denke, die LED ändert ihre Helligkeit abhängig von 
pwm_soll. Das wäre auch genau das, was sie tun soll.

> Es ist leicht auf die kurze Erklärung zu verweisen.

Viel mehr gibt's dazu nicht zu erklären. Das beste in so einem Fall ist, 
sich Papier und Bleistift zu nehmen und dann das Programm von Hand 
Schritt für Schritt durchzugehen und dir dabei anzusehen, was z.B. mit 
pwm_phase und dem Ausgang passiert. Natürlich musst du nicht die 100 
Schritte alle durchlaufen, denn du wirst das Muster sicherlich schnell 
erkennen.

: Bearbeitet durch User
von Klaus (Gast)


Lesenswert?

Warum sollte ich ein Troll sein. Nur wenn man etwas nicht kennt und um 
Hilfe fragt ist es kein Verbrechen.
War es nach dem C-Buch gewohnt das es eine Zählschleife gibt. Der Aufbau 
steht ja im Buch. Dachte so an Startwert, Endwert und Schrittweite. Das 
andere kannte ich bisher nicht.
Das C-Buch hat mir schon oft geholfen, ist von Wolf und soll eines der 
besten sein, hat ja so ca. 1000 Seiten voller Wissen.
Diagramme kenne ich, so mit Zeitachse und Ausgang oder Wert an der 
anderen. Mir ist nur nicht klar, wenn ich die Zählschleife nicht erkenne 
wie das dann im Diagramm steht.

von Heiner (Gast)


Lesenswert?

Nimm Dir einen Privatlehrer, der Dir Alles erklärt.
Dir fehlt jegliches Wissen und Verständnis um in der Lage zu sein, 
jemals etwas selbstständig zu programmieren.

Du magst wohl ein Buch haben, bist aber nicht fähig, das Gelesene zu 
verstehen geschweige denn umzusetzen.

Programme einfach kopieren und Andere um Erläuterung der Programme zu 
bitten ist nicht zielführend.

Das ist die bittere Wahrheit

von Georg M. (g_m)


Lesenswert?

Klaus schrieb:
> wenn ich die Zählschleife nicht erkenne

Das ist die Schleife, die endlose Schleife:
1
  while (1)
2
  {
3
    . . . . . . .
4
    . . . . . . .
5
    . . . . . . .
6
    . . . . . . .
7
  }

von Rolf M. (rmagnus)


Lesenswert?

Klaus schrieb:
> War es nach dem C-Buch gewohnt das es eine Zählschleife gibt. Der Aufbau
> steht ja im Buch. Dachte so an Startwert, Endwert und Schrittweite. Das
> andere kannte ich bisher nicht.

Hier hast du keine Zählschleife, sondern eine Endlosschleife. Sie läuft 
für immer durch. Schließlich willst du ja, dass dein PWM-Zyklus nicht 
nur einmal oder zehn mal läuft, sondern für immer. Zählen kann man 
innerhalb dieser Schleife natürlich trotzdem, ganz unabhängig davon, was 
im Schleifenkopf steht. Und genau das passiert hier. Wie gesagt: Spiele 
einfach mal Mikrocontroller und gehe das Programm Schitt für Schritt 
selber durch und überlege dir, was da passiert.

von Klaus (Gast)


Lesenswert?

Klaus schrieb:
> if( pwm_phase == 100 )
>        {
>        pwm_phase = 0;
>        PORTA &=~(1<<PINA3);  // LED 4 ein
>        }

Hatte mich schon gefragt warum pwm_phase = 0. Bei einer Endlosschleife, 
ja klar.
Warum soll ich einen Privatlehrer nehmen?
Mir war es nicht vergönnt ein Studium zu machen und die entsprechenden 
Sachen zu lernen. Lernen durch Fehler ist vielleicht das bessere Konzept 
für mich. Bin aber nicht so grössen Wahnsinnig mein Halbwissen in 
irgendwelche Videos zu packen und die Welt zu beglücken. Wenn ich aus 
dem Datenblatt keine Antwort bekomme farge ich hier im Forum.
Ist das nicht Sinn dieses Forums Laien und Suchende weiter zu helfen?

von Heiner (Gast)


Lesenswert?

Klaus schrieb:
> Klaus schrieb:
>> if( pwm_phase == 100 )
>>        {
>>        pwm_phase = 0;
>>        PORTA &=~(1<<PINA3);  // LED 4 ein
>>        }
>
> Hatte mich schon gefragt warum pwm_phase = 0. Bei einer Endlosschleife,
> ja klar.
> Warum soll ich einen Privatlehrer nehmen?
> Mir war es nicht vergönnt ein Studium zu machen und die entsprechenden
> Sachen zu lernen. Lernen durch Fehler ist vielleicht das bessere Konzept
> für mich. Bin aber nicht so grössen Wahnsinnig mein Halbwissen in
> irgendwelche Videos zu packen und die Welt zu beglücken. Wenn ich aus
> dem Datenblatt keine Antwort bekomme farge ich hier im Forum.
> Ist das nicht Sinn dieses Forums Laien und Suchende weiter zu helfen?

Du scheiterst an den einfachsten Programmschritten.
Wenn ein Grundschüler denkt, er würde die Infintesimalrechnung ohne 
weiteres Hintergrundwissen durchdringen ist er zum Scheitern verurteilt- 
und bei Dir ist es ebenso.
Beschäftige Dich zuerst mit den Grundlagen der Programmierung und erst, 
wenn Du diese beherrschst, solltet Du Dich mit AVRs beschäftigen.
Sonst wirst Du nie in der Lage sein, ein funktionsfähiges Programm zu 
erstellen, das mehr macht als nur ein LED an/aus.

SCNR

von Klaus (Gast)


Lesenswert?

Sag mal, willst du was von mir? Du beleidigst mich mit jedem Satz in 
einer Art und Weise, die unterhalb des guten Geschmacks liegt.
Macht es dir irgendwie Freude andere Menschen zu beleidigen oder geht 
dir einer dabei ab.
Ich versuche einen Attiny 44 zu begreifen und du hast nichts weiter zu 
tun als mich dabei zu beleidigen.
Wo sind den die "Aufpasser" dieser Seiten? Könnt ihr nicht solche Sachen 
verhindern?
Das ganze hat mit einem Forum nichts mehr zu tun.

von Heiner (Gast)


Lesenswert?

Klaus

Ich will Dich weder beleidigen noch “geht mir einer ab”.
Die Art und Weise Deiner Fragen zeigt aber, dass Du weder die Grundlagen 
der Programmierung beherrschst noch die Datenblätter liest / verstehst - 
Siehe Fragen bezüglich Schleife.

Lerne die Grundlagen der Programmierung und versuche, die Datenblätter 
zu verstehen

von Heiner (Gast)


Lesenswert?

Klaus

Und nebenbei- es reicht nicht, Programmschnipsel zusammenzukopieren ohne 
Ahnung zu haben, was die Schnipsel machen (wobei PWM - siehe Deinen link 
- sehr gut erklärt wird - setzt aber voraus, dass man die Grundlagen der 
Programmierung beherrscht).

Und “Lernen durch Fehler” - naja.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.