ich möchte beim attiny13 die interne Hardware-PWM einschalten. es kommt aber kein PWM-Signal. hier ist der Code, mit dem ich es versucht habe: ---------------- .include "tn13def.inc" main: ldi r16, 0x1F out DDRB, r16 ldi r16, 0x1F out PORTB, r16 ldi r16, 180 out OCR0A, r16 ldi r16, 0xC3 out TCCR0A, r16 ldi r16, 0x09 out TCCR0B, r16 ldi r16, 255 out TCNT0, r16 loop: rjmp loop --------------- also es geht hauptsächlich um die mittleren 3 Register. die oberen habe ich hinterher drangeschrieben. erst habe ich reihenfolge TCCR0A TCCR0B OCR0A versucht. das ging nicht. danach habe ich OCR0A vor TCCR0A TCCR0B gemacht. am ende habe ich noch TCNT0 versucht. es nützt nix. die PWM aktiviert sich nicht an dem betroffenen Pin. dann habe ich zum schluß noch versucht, alle Port-Pins außer dem Reset-Pin auf 1 zu setzen (siehe die anweisungen ganz oben), um zu gucken, ob der PWM-generator den betroffenen ausgangs-Pin korrekt überschreibt. das funktioniert. es schalten alle Pinne auf 1 bis auf den PWM-Pin. der bleibt auf Null, wird also korrekt von dem PWM-generator überschrieben. aber der schaltet sich nicht ein. es ist kein PWM-signal auf dem PWM-Pin zu finden. Wisst ihr, was ich verkehrt gemacht habe? Der Microcontroller läuft mit internem Takt auf ca. 9 MHz, automatischer interner Oszillator. alle anderen Pins sind unbedrahtet, also nur die Pins alleine ohne angeschlossene zusatzsachen, mit dem Oszilloskop gemessen.
1 | ldi r16, 0xC3 |
Das solltest du erstmal in Bitnamen auflösen. Es ist nämlich sehr wahrscheinlich, dass du dich hier vertan hast
Sieht nach falschem Timer-Modus aus. Bei verwendeten PWM-Modus (7) ist OCRA die Obergrenze des Zählers, OCRB die PWM-Rate. Schwer zu sagen, was genau korrigiert werden muss (Modus oder der Pin), weil du nicht schreibst, was du erreichen willst.
ok hm d.h.,die register haben warscheinlich falsche inhalte. ist denn die reihenfolge richtig? in welcher reihenfolge müssen die register gesetzt werden? also ich möchte die PWM erst überhaupt einmal nur ankriegen. ich verstehe die unterschiede der genauen PWM-auswahlen in dem datenblatt nicht ganz. entweder ich habe tomaten auf den augen, oder das datenblatt ist irgendwie schwer formuliert. Ich weiß, daß ich mit CTC unterschiedliche frequenzen machen kann, Fast PWM ist was ganz normales, was den meisten standard-ansprüchen genügt. Phase-Correct ist irgendein extra blabla, keine ahnung ab wann man das braucht. ich vermute mal, daß Fast-PWM für mich völlig ausreicht. ich möchte mit dem controller eine spule über einen transistor ansteuern. das ti/to-verhältnis darf warscheinlich nicht 50/50 sein, sondern eher 30/70 oder so. das verhältnis muß nur ungefähr sein. wenn ich das verhältnis ändern könnte, ist das schon gut, besser wäre aber wenn ich die Frequenz verändern könnte und das verhältnis gleich lassen könnte. dann müßte ich CTC nehmen, der kann aber nur 50/50 und kein 30/70, oder ? und so wie ich das richtig sehe, kann ich bei normaler PWM bei 9 MHz durch 255 maximal so 31 KHz PWM machen, oder ? das ist mir zu wenig. könnte ich irgendwie die Timer, der von 0-255 läuft, so einstellen, daß er nur bis 20 oder so läuft? ..aber das wären dann schon fortsetzungen. erstmal will ich überhaupt nur den PWM ankriegen, ann wenn das nicht geht.. aja und OCRA und OCRB ghören bei diesem controller glaubeich nicht zusammen, der OCRA ist für Pin1 und der OCRB für Pin2. einen zweiten OCRA und OCRB für den 2. Pin gibt es nicht. und wann muß ich jetzt überhaupt mit TCNT0 machen? kann ich dort reinschreiben, daß der zähler nur von 0-20 oder so zählen soll, oder ist TCNT0 die speicherstelle, die permanent beim zählen umgeschrieben wird?
Friedrich Keil wrote: > ok hm d.h.,die register haben warscheinlich falsche inhalte. ist denn > die reihenfolge richtig? in welcher reihenfolge müssen die register > gesetzt werden? Die Reihenfolge ist erst einmal ziemlich schnuppe. > das ist mir zu wenig. könnte ich irgendwie die Timer, der von 0-255 > läuft, so einstellen, daß er nur bis 20 oder so läuft? Dann ist Mode 7 richtig aber der Ausgang falsch. Der zählt von 0 bis OCR0A und kippt den Ausgang wenn OCR0B erreicht ist. Naturgemäss kommt das Signal dann auch am Pin für OCR0B, also OC0B = PB1. > und wann muß ich jetzt überhaupt mit TCNT0 machen? Nix.
Friedrich Keil wrote: > aja und OCRA und OCRB ghören bei diesem controller glaubeich nicht > zusammen, der OCRA ist für Pin1 und der OCRB für Pin2. Pin 1 ist bei meinem Datasheet Reset und Pin 2 hat auch nix mit dem Timer zu tun. Eher schon PB0,PB1, die liegen aber woanders.
ja PB0 und PB1 natürlich, die sind bei mir Pin5 und Pin6, die sind schon richtig. außerdem wenn auf einem der anderen Pinne die PWM drauf wäre, hätte ich es ja gesehen. aber hier bei mir im datenblatt steht auf Seite 70 das hier: OCR0A "The Output Compare Register A contains an 8-bit value that is continuously compared with the counter value (TCNT0). A match can be used to generate an Output Compare interrupt, or to generate a waveform output on the OC0A pin." und OCR0B "The Output Compare Register B contains an 8-bit value that is continuously compared with the counter value (TCNT0). A match can be used to generate an Output Compare interrupt, or to generate a waveform output on the OC0B pin." was stimmt denn dann jetzt? ist mein datenblatt falsch?
Friedrich Keil wrote: > aber hier bei mir im datenblatt steht auf Seite 70 das hier: Stimmt schon. Nützt dir aber wenig, weil OCR0A im Mode 7 noch eine weitere Bedeutung hat: wenn TCNT0 diesen Wert erreicht, wird der Timer auf 0 gesetzt. Und jetzt rate mal, was am Ausgang OC0A passiert, wenn OCR0A Register den gleichen Wert hat wie der Timer-Endwert: nämlich garnix - "Setting the OCR0A equal to MAX will result in a constantly high or low output" und MAX ist in diesem Modus nunmal per Definition identisch mit dem Inhalt von OCR0A. Die Katze beisst sich da in den Schwanz. M.a.W: Im Mode 7 ist der Pin OC0A nicht sinnvoll verwendbar. Dafür kann man festlegen wie weit er zählt. Und genau das willst du ja. > was stimmt denn dann jetzt? ist mein datenblatt falsch? Datenblatt ist ok, du hast bloss den Mode 7 nicht verstanden.
ah ok prima, ich habe jetzt mal statt Mode7 den FastPWM Mode 3 ausgewählt, da geht er ganz normal. also es funktioniert jetzt aber moment.. wenn ich jetzt den Mode 7 nehme, dann kann ich dann nur die Frequenz variieren und das Verhältnis bleibt immer 50/50 ? weil im moment arbeitet er auf Mode 3 mit 32 KHz. wenn ich jetzt auf MOde 7 gehe, könnte ich höhere frequenzen aber könnte ich auch gleichzeitig irgendwie dann 30/70 als Tasverhältnis machen?
ok also Mode7 geht irgendwie nicht: ich habe jetzt: TCCR0A=10000011 OCR0A=40 OCR0B=15 TCCR0B=00001001 klapt aber nicht. jetzt bleibt der ausgang immer an.
jaja egal ne also es geht jetzt. ich hab irgendwann eben noch gesehen, daß an OC0A dann gar nix passiert. also es geht jetzt richtig mit dem OC0B-ausgang.
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.