Forum: Mikrocontroller und Digitale Elektronik ATmega168 und PWM Problem


von Alex (Gast)


Lesenswert?

Hi,
ich experementiere seit einer Weile mit AVRs und möchte demnächst ein 
X-Ufo selbst basteln.
Dabei komme ich nicht um PWM herum. Grundsätzlich habe ich durch 
Ausprobieren einiges hinbekommen wie USART und ADC.
Jedoch habe ich ein Problem mit PWM und Timer0.
In Foren habe ich mehrere Beispiele gefunden, diese funktionieren aber 
auch nicht.
Hier mein aktueller Code:
1
void initPWM(void)
2
{
3
  DDRB = 0xFF;
4
  DDRD = 0xFF;
5
6
  TCCR0A = (1<<WGM00)|(1<<COM0A1)|(1<<COM0B1); // PWM, phase correct
7
  TCCR0B =  (1<<CS01) |(1<<CS00); // enable counter
8
9
  OCR0A = 0x4F;// witdh
10
  OCR0B = 0xCF;
11
12
  TCCR2A = (1<<WGM20)|(1<<COM2A1)|(1<<COM2B1); // PWM, phase correct
13
  TCCR2B =  (1<<CS21) |(1<<CS20); //enable counter
14
15
  OCR2A = 0x4F;// witdh
16
  OCR2B = 0xCF;
17
}

Während die Spannungen hier bei Timer 2 (und Timer 1 in vorherigen 
Tests) alle richtig waren, funktioniert Timer 0 nicht wie er soll bzw an 
den beiden Ports (PD3 und PB3) messe ich die gleiche Spannung von ca. 
1,6 V .
(An OCR2B / PD3 messe ich beispielsweise rund 4 V, nach ausrechnen 
0xCF/256*5V kriege ich 4,04V raus, was also stimmt; genauso mit OCR2A / 
PB3 mit ca 1,5 V)

Ich habe daraufhin schon alle verschiedenen Bit-Kombinationen nach dem 
Datenblatt versucht, aber es hat nichts gebracht.

Was ich zudem recht merkwürdig finde:
Wenn ich Timer0 mit PMW aktiviere, wird der AVR nach kurzer Zeit 
vergleichsweise warm.
Bei Timer2 und Timer1 bleibt er immer kühl.

Hat jemand eine Idee, woran es liegen könnte ?

Danke im voraus
Alex

von senex24 (Gast)


Lesenswert?

So ganz kann ich Ihnen nicht folgen: wieso PD3 und PB3, Timer0 arbeitet 
doch mit PD5 und PD6?
Die Erwärmung mag daran liegen, dass B und D komplett auf Ausgang 
geschaltet werden, hängt da was Falsches dran?

von Alex (Gast)


Lesenswert?

Ja, ich war mit den Gedanken schon bei Timer 2;)
Ich meinte auch PD5 und PD6. An denen messe ich Spannungen um die 1,6 V.

PD3 und PB3 funktionieren mit Timer2 einwandfrei.

Der AVR erwärmt sich nur, wenn diese Zeilen stehen:
1
  TCCR0A = (1<<WGM00)|(1<<COM0A1)|(1<<COM0B1); // PWM, phase correct
2
  TCCR0B =  (1<<CS01) |(1<<CS00); // enable counter

Wenn ich diese auskommentiere, neu kompiliere und brenne bleibt er kühl 
und Timer 2 funktioniert weiterhin.

von senex24 (Gast)


Lesenswert?

Also noch mal: was hängt an D5 und D6, sind die beiden vielleicht 
verbunden?

von Alex (Gast)


Lesenswert?

Nein, also PD5 und PD6 sind nicht miteinander verbunden und an keinem 
Port ist was angeschlossen.
Ich verwende ein myAVR Board 2.06 , das ich selbst zusammengebaut habe ( 
http://www.myavr.de/shop/artikel.php?artID=41 ) und messe die Spannungen 
an den Kontakten unten.

Ich prüfe nochmals die Verbindungen, aber ich habe soweit ich es sehe 
alles richtig gelötet.

von senex24 (Gast)


Lesenswert?

Vorschlag: messen Sie (ausgeschaltet natürlich) folgende Widerstände:

D5 - GND
D6 - GND
D5 - Vcc
D6 - Vcc
D5 - D6

von Alex (Gast)


Lesenswert?

Ok, ich hab das Problem.
Du hattest Recht :-D .

Beim Löten habe ich  da recht viel Lötzinn verwendet und .. beim .. 
Einsetzen des µCs habe ich immer recht stark auf die Platine gedrückt, 
damit der Chip auch wirklich fest sitzt, dabei hat sich das Lötzinn 
verformt und die PORTs D5 und D6 waren tatsächlich kurzgeschlossen.

Auf der Steckplatine hat es eben auch funktioniert.
Der Code ist also auch ok.

Wegen dem Kurzschluss ist der AVR wohl auch warm geworden ...

Vielen Dank senex24 für deine Hilfe :-)

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.