mikrocontroller.net

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


Autor: AVRli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Johannes A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: AVRli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Johannes A. (Gast)
Datum:

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

Gruß Johannes

Autor: AVRli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Johannes A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann poste doch mal den entsprechenden Ausschnitt von dem Listing.

Gruß Johannes

Autor: AVRli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Johannes A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: AVRli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Johannes A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: AVRli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Johannes A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: AVRli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Johannes A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Josef Kkk (zumlin)
Datum:

Bewertung
0 lesenswert
nicht 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:
void init_pwm_pe4(int onoff, uint16_t comparevalue)
{
  OCR3BL = (uint8_t)(comparevalue&0x00FF);
  OCR3BH = (uint8_t)((comparevalue>>8)&0x00FF);
  TCCR3A = TCCR1A & 0b11001100;
  TCCR3A = TCCR1A | 0b00010000;
  DDRE |= (1 << DDE4);
  // xxxxx abc  
  // N= Teiler  abc
  //        000  kein clock
  //        001  kein teiler
  //        010  8
  //        011  64  
  //        100  256  
  //        101  1024 
  // f = 16MHz / (2*N*(1+OCR3B))
  //CTC Mode 4
  if(onoff)
    TCCR3B = 0b00001101;
  else
    TCCR3B = 0b00001000;
}
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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.