Forum: Mikrocontroller und Digitale Elektronik PWM von OC1A nach OC3B "verschieben"?


von AVRli (Gast)


Lesenswert?

Hi,

ich habe nun ein PWM Signal auf OC1A welches ich auf den Port OC3B
verlegen möchte, nur es klappt irgendwie nicht.
Ich sitz nun schon 3h an dem Problem... nicht zu glauben...

Ich bräuchte den PIN auf Port B eigendlich für was anderes und auf Port
E wäre der noch frei. :-(

Quelltext für OC1A welcher funktioniert ist...

  ldi wrH,(1<<COM1A0)|(1<<WGM10)
  out TCCR1A,wrH
  ldi wrH,(2<<WGM12)|(5<<CS10)
  out TCCR1B,wrH

  ldi wrH,low(220)
  out ocr1AL,wrH
  ldi wrH,high(220)
  out ocr1AH,wrH

für OC3B hab ich dann folgenen versucht...

  ldi wrH,(1<<COM3B0)|(1<<WGM30)
  sts TCCR3A,wrH
  ldi wrH,(2<<WGM32)|(5<<CS30)
  sts TCCR3B,wrH

  ldi wrH,low(220)
  sts ocr3BL,wrH
  ldi wrH,high(220)
  sts ocr3BH,wrH

leider ist am PIN OC3B nix zu sehen... :-(
Was hab ich übersehen...?

Gruß AVRli...

von Johannes A. (Gast)


Lesenswert?

Ganz dumme Idee: Ist der OC3B Pin überhaupt als Output initialisiert?
Nichts für ungut, ich verschwende bloß selber immer wieder "gerne"
meine Zeit mit solch blöden Fehlern...

Ansonsten dreh mal die Reihenfolge der ocr-Ladebefehle um. So wie sie
jetzt stehen, lädst Du das H-Register mit irgendeinem vorher gesetzen
Wert. Siehe Abschnitt "Accessing 16-Bit Registers" im
AVR-Datenblatt.

Gruß Johannes

von AVRli (Gast)


Lesenswert?

Also er war nicht als Out gesetzt, hab ich nun gemacht, leider ohne
Erfolg.

Hmm wie gesagt OC1A funktioniert, OC3B nicht. :-(

Ich vermute irgendwas übersehen zu haben, nur was?
Achja, ATMEGA 128 ist mein Spielzeug, mal wieder vergessen....

Gruß AVRli...

von Johannes A. (Gast)


Lesenswert?

Hast Du die M103 Fuse gelöscht? Die ist im Auslieferungszustand nämlich
gebrannt, und damit ist Timer 3 nicht vorhanden...

Gruß Johannes

von AVRli (Gast)


Lesenswert?

Ja das hab ich auch gelöscht. Das war gleich das erste als ich den Chip
im Board hatte. ;-) Gibt es ja einige Beiträge dazu.

(eben aber trotzdem nochmal überprüft)

Gruß AVRli...

von Johannes A. (Gast)


Lesenswert?

Dann poste doch mal den entsprechenden Ausschnitt von dem Listing.

Gruß Johannes

von AVRli (Gast)


Lesenswert?

Ähm nun hoffe ich schick das richtige...
Also Port I/O Richtung mach ich so...

  ldi wrH,(1<<PE3)|(1<<PE4)
  out PORTE,wrH
  out DDRE,wrH          ;PortE I/O setzen

dann wird der OC3B so initialisiert...

  ldi wrH,(1<<COM3B0)|(1<<WGM30)
  sts TCCR3A,wrH
  ldi wrH,(2<<WGM32)|(5<<CS30)
  sts TCCR3B,wrH

  ldi wrH,high(220)
  sts ocr3BH,wrH
  ldi wrH,low(220)
  sts ocr3BL,wrH


Wie geschrieben, auf OC1A läuft es, ich kapier es nicht... ist doch
komisch... ich werd doch den PIN nicht abgebrannt haben?

MfG AVRli...

von Johannes A. (Gast)


Lesenswert?

Sorry, ich meinte den Auszug vom Output-Listing, also wo der erzeugte
Code in Hex drinsteht. Ich würde gerne sehen können, ob bei den stssen
wirklich die richtigen Adressen stehen.

Gruß Johannes

von AVRli (Gast)


Lesenswert?

Ohh 8-) Johannes, da müßtest Du wohl erst eine AVRli Wissenslücke
schließen, wo find ich das? Ich verwende die neuste Version vom AVR
Studio.

Gruß AVRli...

von Johannes A. (Gast)


Lesenswert?

Ach so. Na da kann ich auch einfach selber reinkucken. Allerdings glaube
ich beim AVR Studio doch nicht an solche Pannen.

Ich schreib gerade aus der Firma, Mittagspause. Heut abend mehr.

Gruß Johannes

von AVRli (Gast)


Lesenswert?

Hi Johannes,

also ich hab nun mal das gesamte PortE umstrukturiert um OC3A frei zu
bekommen. Fazit da geht's. :-D

Naja ich denk es liegt einfach daran das ich noch lange nicht mit der
Mehrfachbelegung von OC3 A,B,C klar komme.

Nun für die Anwendung wäre eine Lösung gefunden, würde es gerne
verstehen wie es funktioniert, oder besser warum es nicht auf OC3B
ging.

Gruß AVRli...

von Johannes A. (Gast)


Lesenswert?

Hallo AVRli,

oh Himmel, na klar! Sorry, aber gestern war ich wohl voll blind:

Mit (2<<WGMx2) (was dasselbe ist wie (1<<WGMx3)) und (1<<WGMx0) setzt
Du ja den Mode 9 - und dazu steht im Datenblatt OCRxA als TOP! Und weil
OCR3A nach dem Reset 0 ist und Dein Code nichts daran geändert hat, hat
Dein Zähler die ganze Zeit wohl brav von 0 nach 0 und zurück gezählt,
und damit den Wert in OCR3B natürlich nicht erreicht...

Ist mir glatt peinlich, dass ich das nicht gestern schon geblickt habe.
Ich mein, genau damit hab ich mich in meinen AVR-Anfangszeiten selber
schon mal ausgetrickst.

Gruß Johannes

von AVRli (Gast)


Lesenswert?

Hi Johannes,

ob du es glaubst oder nicht, habs noch immer nicht gerafft. Sorry!
Also der Mode 9 ist dran Schlud, ok wie kann man nun den OCR3B
verwenden?

Könnte man den OC3B noch nehmen um nen kleinen SPEAKER für nen Pieps zu
animieren?

Oder hat man durch den Mode 9 die Anzahl der OCR3 Kanäle auf 1
beschränkt?

Gruß AVRli...

von Johannes A. (Gast)


Lesenswert?

Hallo AVRli,

also in Mode 9 - und noch ein paar anderen - bestimmt OCRxA den Wert,
bis zu dem der Zähler hochzählt. Wenn der nun kleiner ist als der Wert
des OCRxB-Registers, mit dem Du Dein Ausgangssignal machen willst, wird
der Wert für die Änderung am OCxB-Pin nie erreicht, und es passiert dort
(logischerweise) nichts.

Mit anderen Worten: Du musst OCRxA immer auf mindesten denselben Wert
setzen wie OCRxB, auch wenn Du den OCxA-Ausgang gar nicht benutzt.

Jetzt klarer?

Gruß Johannes

von Josef K. (zumlin)


Lesenswert?

Hallo,

ich habe ein ziemlich ähnliches Problem. Ich nutze auch OC3B bzw. OC3C 
als PWM Ausgang. Für die 8-Bit Timer funktioniert alles wunderbar, nur 
die Programmierung des 16-bit Timers macht mich etwas stutzig.
Ich will CTC auf OCR3B bzw. OCR3C machen und habe einfach mal OCR3A auf 
0xFFFF gesetzt um mit OCR3A und OCR3B sicher darunter zu bleiben. Hier 
mal  meine Funktion zum Aktivieren der des CTC Moduses:
1
void init_pwm_pe4(int onoff, uint16_t comparevalue)
2
{
3
  OCR3BL = (uint8_t)(comparevalue&0x00FF);
4
  OCR3BH = (uint8_t)((comparevalue>>8)&0x00FF);
5
  TCCR3A = TCCR1A & 0b11001100;
6
  TCCR3A = TCCR1A | 0b00010000;
7
  DDRE |= (1 << DDE4);
8
  // xxxxx abc  
9
  // N= Teiler  abc
10
  //        000  kein clock
11
  //        001  kein teiler
12
  //        010  8
13
  //        011  64  
14
  //        100  256  
15
  //        101  1024 
16
  // f = 16MHz / (2*N*(1+OCR3B))
17
  //CTC Mode 4
18
  if(onoff)
19
    TCCR3B = 0b00001101;
20
  else
21
    TCCR3B = 0b00001000;
22
}
Doch leider läuft die "PWM" mit 0.11 Hz was genau dem Wert für OCR3A 
entspricht. Was mache ich hier falsch? Habe ich bei TCCR3B den falschen 
Modus aktiviert?

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.