ATmega168 und PWM Problem

Gast #557734
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
Gast #557762
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?
Gast #557789
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.
Gast #557819
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 :-)

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.