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...
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
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...
Hast Du die M103 Fuse gelöscht? Die ist im Auslieferungszustand nämlich gebrannt, und damit ist Timer 3 nicht vorhanden... Gruß Johannes
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...
Dann poste doch mal den entsprechenden Ausschnitt von dem Listing. Gruß Johannes
Ä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...
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
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...
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
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...
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
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...
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.