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...
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...
Ä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
voidinit_pwm_pe4(intonoff,uint16_tcomparevalue)
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?