PWM auf ATMega644P

Gast #6032232
Ich versuche gerade ein simples 50% PWM-Signal auf einem ATMega644P 
(Port PD6) auzugeben. Dazu habe ich in der ArduinoIDE mal ganz simpel 
den Code von 
https://sites.google.com/site/qeewiki/books/avr-guide/pwm-on-the-atmega328 
in die setup()-Funktion kopiert:
1
    #include <avr/io.h>
2
    
3
    void setup() {
4
       DDRD |= (1 << DDD6);
5
       // PD6 is now an output
6
    
7
       OCR0A = 128;
8
       // set PWM for 50% duty cycle
9
    
10
       TCCR0A |= (1 << COM0A1);
11
       // set none-inverting mode
12
    
13
       TCCR0A |= (1 << WGM01) | (1 << WGM00);
14
       // set fast PWM Mode
15
    
16
       TCCR0B |= (1 << CS01);
17
    }

Ergebnis: nichts, keine Frequenz an dem Ausgang.

Jetzt frage ich mich: geht das in der ArduinoIDE vielleicht nicht so 
einfach? Initialisiert die irgendwas, was die Ausgabe wieder verhindert? 
Oder wo sonst kann das Problem liegen?
Gast
Eslup schrieb:
> Ergebnis: nichts, keine Frequenz an dem Ausgang.

Lösche in deinem Projekt ganz die beiden Funktionen

Setup ()

und

Loop ()

und kopiere nochmal den ganzen Inhalt deiner Besipiel Seite
in dein Projekt-Fenster.

Der Hauptgrund wird sein dass das Arduino Framework breits
den Timer0 benutzt und du nicht ohne weitere Massnahmen
an diesen hinkommst.

Löschen von Setup und Loop bewirkt dass das Arduino Framework
nicht benutzt wird sondern du ganz allein Herr über den
Controller bist.
Gast
Eslup schrieb:
> Es sollte sich doch beides verbinden lassen, oder?

Im Prinzip ja.

Dazu müsstest du im Setup noch alle Timer Register (siehe
Datenblatt) vor dem Setzen einmal auf Null setzen. Dann
wird die Initialisierung des Framworks ausser Kraft gesetzt.

Damit werden aber die Zeitfunktionen des Frameworks auch
lahmgelegt, was du ja auch nicht willst.

Also benutze Timer 1 statt Timer 0, dann gibt es keine Konflikte.
Die Beispiel Seite bietet ja weitere Beispiele die nicht
Timer 0 benutzen.
Gast
OK, was ich eben noch gesehen habe: beim 644P ist PD6 mit OC2B verbunden 
und nicht mit OC0A - aber das hier funktioniert auch nicht, irgendwas 
fehlt noch:
1
    DDRD |= (1 << DDD6);
2
    // PD6 is now an output
3

4
    OCR2B = 128;
5
    // set PWM for 50% duty cycle
6

7

8
    TCCR2B |= (1 << COM2B1);
9
    // set none-inverting mode
10

11
    TCCR2B |= (1 << WGM01) | (1 << WGM00);
12
    // set fast PWM Mode
13

14
    TCCR2B |= (1 << CS01);
Gast
> TCCR2B |= (1 << WGM01) | (1 << WGM00);

Also erstens sollte das WGM2n heißen, vor allem aber gehört es in 
TCCR2A, wie auch dies:

> TCCR2B |= (1 << COM2B1);

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.