Hallo,
ich will auf einem Atmega88 die Fast PWM Ausgabe für OCR0A und OCR0B vom
Non-Inverting-Mode auf den Inverting Mode umstellen.
Non-Inverting funktioniert einwandfrei.
Zum Umstellen auf Inverting muss WGM02 in Register TCCR0B ja von 0 auf 1
gesetzt werden.
Das alleine funktioniert aber nicht.
Weiß jemand, was hier noch umgestellt werden muss oder wo der Fehler
liegen könnte?
Kann auch gerne die anderen Registereinstellungen und Werte posten, wenn
das weiterhilft.
Lars L. schrieb:> Kann auch gerne die anderen Registereinstellungen und Werte posten, wenn> das weiterhilft.
Nee, die allermeisten üben sich lieber im Glaskugelesen. Echter
compilierbarer Code (hier rein kopiert oder noch besser als Anhang) ist
ja sowas von spießig.
Oliver
So wie abgebildet funktioniert der Code im Programm im
Non-Inverting-Fast-PWM-Modus.
Für eine Non-Inverting-Fast-PWM-Ausgabe habe ich Zeile 8 so geändert:
TCCR0B |= (1<< WGM02);
Diese Änderung alleine scheint aber nicht zu reichen, um in den
Inverting-Fast-PWM-Modus zu kommen.
Lars L. schrieb:> Kann man es vielleicht ein bisschen konkretisieren?
Ganz konkret: lies die Worte in den erwähnten Tabellen,
suche den Text "inverting" und "non-inverting" und ziehe
deine Schlüsse daraus.
Es klappt aber trotzdem nicht so richtig.
Ich möchte den inverting Mode benutzen, um bei OCR0A = 255 bzw. OCR0B =
255 jeweils auf eine Ausgabespannung von 0 kommen zu können (das geht ja
im noninverting Modus nicht).
Aber mit den Einstellungen wie hier gezeigt kommt man trotzdem mit
beiden nicht auf 0 runter.
Die Einstellungen aus Table 15-3 und Table 15-6 sollten aber stimmen.
Weiß jemand, woran das liegt? TCNT0 = 254 müsste doch stimmen.
Lars L. schrieb:> jeweils auf eine Ausgabespannung von 0 kommen zu können (das geht ja> im noninverting Modus nicht)
Hallo, ich mach das so: Wenn der Ausgang 0 sein soll, setze ich im
Register TCCR1A COM1A1/COM1B1 und COM1A0/COM1B0 je nach Port auf 0. Ist
der Ausgabewert nicht 0, setze ich den entsprechenden Wert wieder im
TCCR1A. Bei der Initialisierung habe ich vorher die beiden Ports auf
Ausgang und 0 gesetzt. Somit lassen sich Pulslängen von 0 bis 100%
einstellen. Das funktioniert zumindest beim ATTiny4313 ganz gut.
Gruß Carsten
Carsten-Peter C. schrieb:> Hallo, ich mach das so: Wenn der Ausgang 0 sein soll, setze ich im> Register TCCR1A COM1A1/COM1B1 und COM1A0/COM1B0 je nach Port auf 0
ja weil es bei Inverting kein 0 gibt
Ich wunderte mich bei Nokia5110 LCD am ESP32 da war die
Hintergrundbeleuchtung bei einer Displaysorte genau invers zum AVR
Es gab verschiedene Lieferungen und Designs so musste ich auch noch
verschiedene Wege probieren
Am AVR fing es an Module die 5V tolerant waren!
Ich habe keinen Atmega88 und kann es nicht prüfen, aber mit dem
ATtiny13A funktioniert die inverted PWM so dass wenn OCR0A = 255 dann
bleibt die LED ausgeschaltet.
1
// ATtiny13A inverted PWM test
2
3
#define F_CPU 1200000UL
4
#include<avr/io.h>
5
#include<util/delay.h>
6
7
intmain(void)
8
{
9
DDRB|=(1<<DDB0);// set PB0 as output (OC0A)
10
TCCR0B|=(1<<CS01);// set PWM frequency
11
TCCR0A|=(1<<WGM01)|(1<<WGM00);// set to Fast PWM Mode
12
TCCR0A|=(1<<COM0A1)|(1<<COM0A0);// set OC0A on compare match, clear OC0A at top
Georg M. schrieb:> funktioniert die inverted PWM
kommt vermutlich drauf an ob man die LED nach GND oder nach +VCC
verschaltet!
Mir scheint es gibt mehrere Inverted Definitionen, inverted bezüglich
der PWM und inverted bezüglich der Verschaltung sowie einer Kombination
beider.
Mir dagegen erscheint es, als ob es immer die gleichen Nasen sind, die
dem manischen Zwang, IRGENDETWAS zu antworten erliegen. Egal was, egal
welches Thema: Antworten und dabei der Erste sein!
Lars L. schrieb:> Aber mit den Einstellungen wie hier gezeigt kommt man trotzdem mit> beiden nicht auf 0 runter.
Das ist normal für den FastPWM-Modus. Invertiert kommst du "oben" nicht
ganz auf VCC, sondern nur auf 255/256 VCC, und im nichtinvertiert kommst
du "unten" nicht ganz auf 0, sondern nur auf 1/256 VCC.
Das gilt natürlich für die 8Bit-Timer, bei 16Bit-Timern ist es halt
analog 65535/65536 bzw. 1/65536.
Um wirklich den ganzen Bereich von 0 bis VCC überstreiben zu können, muß
man für einen der Endwerte den Invertier-Modus wechseln oder man
verwendet den PhaseCorrect-Modus, der aber wiederum andere Nachteile
hat.
c-hater schrieb:> Das ist normal für den FastPWM-Modus. Invertiert kommst du "oben" nicht> ganz auf VCC, sondern nur auf 255/256 VCC, und im nichtinvertiert kommst> du "unten" nicht ganz auf 0, sondern nur auf 1/256 VCC.
wusste ich es doch, mal so mal so, je nach dem wie LED verschaltet sind,
nach VCC oder nach GND
Das ist sogar bei Module unterschiedlich die gleich aussehen
DS40002074A:
The extreme values for the OCR0A Register represents special cases when
generating a PWM waveform output in the fast PWM mode.
If the OCR0A is set equal to BOTTOM, the output will be a narrow spike
for each MAX+1 timer clock cycle.
Setting the OCR0A equal to MAX will result in a constantly high or low
output (depending on the polarity of the output set by the COM0A1:0
bits.)