Forum: Mikrocontroller und Digitale Elektronik PWM beim AT MEGA 88


von Theater s. (kosti)


Lesenswert?

Hallo Leute,

ich muss nochmal stören und das im Alten Jahr.
Laut Datenblatt Siete 101 ff, in Verbindung mit meiner letzten Dummen 
Frage

Beitrag "PWM beim AT MEGA 8"

müsste ich doch die PWM für OC0A un OC0B folgendermassen anschalten.
1
#include <avr/io.h>
2
#include <avr/iom8.h>
3
int main( void )
4
{
5
DDRB=0xff;
6
7
OCR0A = 0xff; // zum einstellen des Tastverhältnisses 
8
9
OCR0B = 0xff; // zum einstellen des Tastverhältnisses 
10
11
12
TCCR0A=  (1<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) |  (1<<WGM01) | (1<<WGM00);
13
TCCR0B =  (0<<FOC0A) | (0<<FOC0B) | (1<<WGM02) | (0<<CS02) | (1<<CS01) | (0<<CS00); // --> Siehe Datenblatt s 98 ff
14
while (1) {};
15
}

Jedoch hat er ein Problem mit der
1
#include <avr/iom8.h>
Biblotehksdatei.

beim Auskommentieren und überspielen passiert auch nichts.

Besten Dank im Voraus
un einen Guten Rutsch

von Karl H. (kbuchegg)


Lesenswert?

Theater sucht schrieb:


> Jedoch hat er ein Problem mit der
1
#include <avr/iom8.h>
2
>
Biblotehksdatei.

Dieser include sollte da gar nicht stehen.
Du includierst die avr/io.h
Den Rest machst du dadruch, dass du in der Entwicklungsumgebung den 
korrekten µC-Typ einstellst.

Welches andere iomxxx.h File dann von der avr/io.h hinzugezogen wird, 
hängt von der korrekten µC-Typ einstellung in der Entwicklungsumgebung 
ab. Das ist aber nichts, was dich groß kümmern muss, wie das 
funktioniert.

von Karl H. (kbuchegg)


Lesenswert?

Theater sucht schrieb:


> int main( void )
> {
> DDRB=0xff;


Die OC Ausgangspins des Timers 0 sind aber am Port D und nicht am Port 
B.
Siehe Datenblatt.

von Theater s. (kosti)


Lesenswert?

Ja meinen ersten Fehler habe ich nun auch schon gefunden.

Statt
1
TCCR0A=  (1<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) |  (1<<WGM01) | (1<<WGM00);
muss es
1
TCCR0A=  (1<<COM0A1) | (0<<COM0A0) | (1<<COM0B1) | (0<<COM0B0) |  (1<<WGM01) | (1<<WGM00);
heißen.

Jedoch Funktioniert es noch nicht.

ich habe unter
http://www.avr-praxis.de/forum/showthread.php?1872-PWMSignal-auf-Atmega-ausgeben

ein Beispiel gefunden das anlog ist.
1
#include <avr/io.h>
2
3
int main (void){
4
5
TCCR0A = 0xA3;  //TCCR0A = ( 1<<WGM01) |( 1<<WGM00) | (1<<COM0A1) | (1<<COM0B1);
6
TCCR0B = 0x09;  //TCCR0B = (1<<CS00) |( 1<<WGM02); z.B. mit ' (1<<CS12) ' langsamer machen
7
OCR0A = 125;
8
OCR0B = 125;  //setze ich spaßhalber wegen Port PD6
9
10
DDRD=0x60; //0x60=01100000  , damit PD5 und PD6 als Ausgänge gesetzt werden.
11
12
return 0;       
13
}

Hier werden die Ausgänge auf 5 Volt gesetzt jedoch keine PWM.
Mein Beispiel und das gefunde ist doch identich. Warum wird bei dem 
einen etwas ausgegeben (wenn auch nicht wie ich will) und bei meinem 
anderen nicht?

Ist es entscheiden ab ich DDRD davor oder danch definiere ?

Danke im Voraus und guten Rutsch

von Theater s. (kosti)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Die OC Ausgangspins des Timers 0 sind aber am Port D und nicht am Port
> B.

Vielen Dank Karl Heinz. ein dummer Schusselfehler.


Jedoch bekomme ich mit dem OSZI nur angezeigt das er 5V am Ausgang hat.

von Karl H. (kbuchegg)


Lesenswert?

> Ist es entscheiden ab ich DDRD davor oder danch definiere ?
Müsste egal sein.

Aber:
Du setzt den Modus 7.
Das ist Fast-PWM mit OCR0A als Top.

Damit fällt OCR0A schon mal als PWM weg, und da OCR0A den gleichen Wert 
hat wie OCR0B, wirst du von der PWM auf dem B Kanal nicht viel sehen.

Geh mal mit WGM02 auf 0

von Karl H. (kbuchegg)


Lesenswert?

1
#include <avr/io.h>
2
3
int main( void )
4
{
5
  DDRD = 0xff;
6
7
  OCR0A = 128;
8
  OCR0B = 128;
9
10
  // Fast PWM mit 0xFF als Top
11
  // Prescaler 8
12
  // OC0A   clear at Match, set at Bottom (non inverting)
13
  // OC0B   clear at Match, set at Bottom (non inverting)
14
  TCCR0A = (1<<COM1A1) | (1<<COM1B1) | (1<<WGM01) | (1<<WGM00);
15
  TCCR0B = (1<<WGM02) | (1<<CS01);
16
17
  while (1)
18
  {
19
  };
20
}


Das sollte eigentlich klappen, laut Datenblatt.

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz Buchegger schrieb:


> Das sollte eigentlich klappen, laut Datenblatt.

Ach Mist.
Beim Code übernehmen und umeditieren die entscheidende Anpassung 
vergessen.

So rum natürlich
1
#include <avr/io.h>
2
 
3
int main( void )
4
{
5
  DDRD = 0xff;
6
7
  OCR0A = 128;
8
  OCR0B = 128;
9
10
  // Fast PWM mit 0xFF als Top
11
  // Prescaler 8
12
  // OC0A   clear at Match, set at Bottom (non inverting)
13
  // OC0B   clear at Match, set at Bottom (non inverting)
14
  TCCR0A = (1<<COM1A1) | (1<<COM1B1) | (1<<WGM01) | (1<<WGM00);
15
  TCCR0B = (1<<CS01);
16
17
  while (1)
18
  {
19
  }
20
}

Es soll ja der Modus 3 eingestellt werden.

von Theater s. (kosti)


Lesenswert?

Vielen Dank für eure unterstützung und Anteilnahme.
Nun kann ich berühigt mir das Feuerwerk ansehen.

So denn Wünsche euch auch einen gesegneten Start ins neue Jahr.

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.