Forum: Mikrocontroller und Digitale Elektronik PWM auf ATMega644P


von Eslup (Gast)


Lesenswert?

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?

von Schlau Berger (Gast)


Lesenswert?

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.

von momo (Gast)


Lesenswert?

Eslup schrieb:
> den Code von
> https://sites.google.com/site/qeewiki/books/avr-guide/pwm-on-the-atmega328
> in die setup()-Funktion kopiert:

Der code steht dort aber in der main.

von Eslup (Gast)


Lesenswert?

momo schrieb:
> Eslup schrieb:
>> den Code von
>> https://sites.google.com/site/qeewiki/books/avr-guide/pwm-on-the-atmega328
>> in die setup()-Funktion kopiert:
>
> Der code steht dort aber in der main.

OK, ich will den Code aber in der setup()-verwenden, da ich 
grundsätzlich auch IDE-Funktionen einsetzen muss, die dort landen 
(müssen). Es sollte sich doch beides verbinden lassen, oder?

von Schlau Berger (Gast)


Lesenswert?

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.

von Eslup (Gast)


Lesenswert?

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);

von S. Landolt (Gast)


Lesenswert?

> 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);

von S. Landolt (Gast)


Lesenswert?

PS:

> ... Beschreibung ... Handbuch ...

Das Original- Datenblatt des ATmega644P liegt vor?

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.