Forum: Mikrocontroller und Digitale Elektronik atmel attiny PWM aktiviert sich nicht


von Friedrich Keil (Gast)


Lesenswert?

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.

von Matthias L. (Gast)


Lesenswert?

1
ldi    r16, 0xC3
Das solltest du erstmal in Bitnamen auflösen.

Es ist nämlich sehr wahrscheinlich, dass du dich hier vertan hast

von Andreas K. (a-k)


Lesenswert?

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.

von Friedrich Keil (Gast)


Lesenswert?

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?

von Andreas K. (a-k)


Lesenswert?

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.

von Andreas K. (a-k)


Lesenswert?

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.

von Friedrich Keil (Gast)


Lesenswert?

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?

von Andreas K. (a-k)


Lesenswert?

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.

von Friedrich Keil (Gast)


Lesenswert?

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?

von Friedrich Keil (Gast)


Lesenswert?

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.

von Andreas K. (a-k)


Lesenswert?

Sorry, aber ich gebs auf.

von Friedrich Keil (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.