Forum: Mikrocontroller und Digitale Elektronik AT Mega Pin13 OC0A tauschen nach OC1C für PWM


von Xilinx (Gast)


Lesenswert?

Guten Tag Miteinander

Mit einem ATMega 2560 R3 sollten 14 PWM Ausgänge verwendet werden können 
mit einer PWM Frequenz von TCCR1B -> 31372.55 Hz.

Wegen der verwendeten millis() Funktion für die State-Machine welche den 
Timer 0 belegt (Die Frequenz darf nicht verändert werden: 976.56 Hz/ 
TCCR0B) sind es nun noch 13 resp. 14 PWM Pins die verwendet werden 
können.

Ich suche nun die Möglichkeit, den Pin 13 (PB7) von OC0A nach OC1C um zu 
konfigurieren, so dass der Ausgang ganz normal mit AnalogWrite() genutzt 
werden kann.

Die Konsultation des 435 seitigen Datenblattes: 
http://www.atmel.com/Images/Atmel-2549-8-bit-AVR-Microcontroller-ATmega640-1280-1281-2560-2561_datasheet.pdf

Auf der Seite 76 / Tabelle 13-6 ist der Pin mit seinen 3 Möglichkeiten 
beschrieben. In der Tabelle 13-7 / Seite 78 in der Linie PVOE stehen 
beide diese Compare Register aber keine Möglichkeit dies um zu 
konfigurieren.

Auf der Seite 167 / Kapitel 19.2 habe ich gesehen dass da beide OC - 
Werte aufgelistet sind aber ich wurde daraus nicht schlau wie ich das 
nun umkonfigurieren könnte ;-(

Weiss da jemand Rat?

MFG Xilinx

von Xilinx (Gast)


Lesenswert?

Nachtrag:

Nach mehrmaligem Lesen des Kapitels 16.9, der Seite 126 kann diese "OR" 
Schaltung der beiden OC0A und OC1C in den Registern COM0A1 und COM0A0 
offenbar umgeschalten/deaktiviert werden. Das WGM02 Bit soll auch noch 
darin "verstrickt" sein. Wie jetzt die Einstellungen sein müssen, habe 
ich bis jetzt leider nicht heraus gefunden, resp. meine 
Einstellungsversuche haben bis jetzt nicht gefruchtet.

Um Hinweise wäre ich daher sehr dankbar.

MFG Xilinx

von Veit D. (devil-elec)


Lesenswert?

Hallo,

man kann die Pinzuordnung der Hardware Timerausgänge nicht tauschen. Auf 
Seite 2 des Datenblattes ist die Zugehörigkeit ersichtlich. Die 
Pinummern haben jedoch nichts mit der Arduino Pin Nummerierung zu tun.

http://www.pighixxx.com/test/pinoutspg/
hier suchste dein Board raus und hast einen schönen Überblick über 
alles.

Bei einigen ATtiny's kann man die Pin Ausgänge zum Timer selbst 
festlegen in einem gewissen Spielraum. Beim ATmega nicht.

Was du aber machen kannst ist folgendes. In einer Timer Interrupt 
Service Routine (ISR) kannst du jeden beliebigen Pin schalten.
Dafür musste dich jedoch mit Timern direkt befassen. Programmierst einen 
Timer und dessen ISR und dann gehts los mit Pin toggeln, PWM,  und 
andere Dinge. Was du gerade möchtest.

: Bearbeitet durch User
von Xilinx (Gast)


Lesenswert?

Hallo Veit

Besten Dank für den Vorschlag, dann werden es dann nur 13 steuerbare 
Weichen-Motoren statt 14 Stück. Dies wäre dann mit der Relais Plattinen 
"aufgegangen".

Den Pin will ich nicht ändern sondern nur dieser ODER Betrieb der 
Comperatoren abschalten/umschalten auf den OC1C.

Gruss Xilinx

von Veit D. (devil-elec)


Lesenswert?

Hallo,

was meinst du mit ODER Betrieb?

Den Pin 13 kannst mit PWM nutzen. Nur taktet er mit einer anderen 
Frequenz. Die spielt jedoch bei einer PWM Nutzung eine untergordnete 
Rolle. Außer die Frequenz der PWM muss aus bestimmten Gründen einem 
speziellen Takt entsprechen. Für Weichenmotoren sehe ich da keine 
Probleme. Außer man hört den Motor etwas brummen.

Oder wie gesagt, du schaltest alle erdenklichen Pins in einer einzigen 
Timer ISR. Vorteil. Alle Pins takten mit dem gleichen Takt. Und du 
kannst selbst festlegen welcher Pin geschaltet werden soll.

Übrigens takten alle PWM Ausgänge mit unterschiedlichen Frequenzen. Je 
nach Timer der dahinter steht. Die anderen Timer sollten defaultmäßig 
mit 490Hz  takten. Kannste ändern. 
https://arduino-info.wikispaces.com/Arduino-PWM-Frequency
1
beim Uno:
2
3
    PWM Pins 5 und 6 kontrolliert durch Timer 0
4
    PWM Pins 9 und 10 kontrolliert durch Timer 1
5
    PWM Pins 3 und 11 kontrolliert durch Timer 2
6
7
beim Mega:
8
9
    PWM Pins 4 und 13 kontrolliert durch Timer 0
10
    PWM Pins 11 und 12 kontrolliert durch Timer 1
11
    PWM Pins 9 und 10 kontrolliert durch Timer 2
12
    PWM Pins 2, 3 und 5 kontrolliert durch Timer 3
13
    PWM Pins 6, 7 und 8 kontrolliert durch Timer 4
14
    PWM Pins 44, 45 und 45 kontrolliert durch Timer 5

Mit den fast undokumentierten 3 PWM Ausgängen von Timer 5 haste bestimmt 
die zusätzlichen Ausgänge die du benötigst. Insgesamt hast du 15 PWM 
Pins. Abzüglich Pin 13 haste 14 PWM Ausgänge.

von dd (Gast)


Lesenswert?

if you can make libraries, you make libraries.

copy file "wiring_analog.c"

delete all like #if defined(TCCR0A) && defined(COM0B1), #endif in 
switch(digitalPinToTimer(pin))

revise digitalPinToTimer(pin) -> pin

case TIMER0A: -> case pinNumber(ex:11):

maybe you can

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.