Forum: Mikrocontroller und Digitale Elektronik PWM ATtiny


von Jörg (Gast)


Lesenswert?

Hallo allerseits.
Leider bin ich auf dem AVR Gebiet absoluter Neuling.

Mein Problem ist folgendes. Ich muss einen DC Motor mittels PWM
ansteuern (Drehzahl Langsam hoch / herunterfahren).
Diese will ich mittels eines ATiny erzeugen. Leider weiss ich nicht,
welchen ATtiny ich dafür verwenden könnte. Ich habe mir schonmal den
ATtiny 13 und den ATtiny15L ins Auge gefasst wobwi mir der AT15L lieber
wäre, da dieser 2 PWM Ausgänge hat.
Meine Fragen wären nun.
Kann ich den 15L mit dem Paralellportinterface für den ATtiny13
programmieren.
Kan ich den ATtiny15L auch ohen Perepheriebeschaltung wie den ATtiny13
nutzen?
ICh würde mich auch sehr freuen, wenn mir jemand sagen könnte, wie eine
PWM in Assembler zu programmieren ist.
Hab sowas noch nie gemacht.

Danke schonmal im Voraus.

von Hannes L. (hannes)


Lesenswert?

Tiny15 hat zwar 2 Timer, aber nur einen PWM-Ausgang. Er lässt sich per
ISP (Parallelportinterface) "flashen". Der Tiny15 läuft auch ohne
Peripheriebeschaltung, benötigt aber einen Abblock-C und einen
Widerstand von Reset nach Vcc. Wenn du totaler AVR-ASM-Neuling bist,
dann hilft dir das vielleicht weiter:
http://www.hanneslux.de/avr/divers/index.html
Und wenn du das durch hast, dann vielleicht der Rest der Seite:
http://www.hanneslux.de/avr/index.html

...

von KoF (Gast)


Lesenswert?

die attiny2313 sind ganz toll! die haben 4 PWM`s ;-)
und lassen sich auch gut in c programmieren.

von Rolf Magnus (Gast)


Lesenswert?

> Ich habe mir schonmal den ATtiny 13 und den ATtiny15L ins Auge
> gefasst wobwi mir der AT15L lieber wäre, da dieser 2 PWM Ausgänge
> hat.

Hast du da was verwechselt? Der Tiny13 hat zwei PWM-Ausgänge, der
Tiny15L nur einen.

von Jörg (Gast)


Lesenswert?

Ja,
Möchte den Tiny13.
Sorry.

von Rolf Magnus (Gast)


Lesenswert?

Du kannst jedenfalls den Tiny15L und den Tiny13 weitgehend auf die
gleiche Art benutzen. Programmierung und Beschaltung sind ähnlich
Pinbelegungen unterscheiden sich evtl, auch Protokolldetails beim
Programmieren, aber du kannst dasselbe Programmiergerät benutzen und
die Beschaltung ist ansonsten gleich.

@KoF:

Der Tiny13 ist auch prima in C programmierbar.

von Jörn-H. G. (joern_g)


Lesenswert?

Tiny13 ist super, auch weil er gleich noch nen ADC mitbringt und in C
gut programmierbar ist, kaum Strom schluckt und viele andere neue tolle
Features hat (neuste Generation!).

Wieso muss es ein Tiny sein? Wenn du was neues anfängst, dann ist es
oft leichter einen etwas weniger beschränkten (vom codeplatz her) zu
nehmen, z.B. atmega8 - kostet ja auch kaum mehr. Hätte auch den
Vorteil, dass seine PWM 16bit kann.

Später kann man immernoch runterbrechen auf den tiny.

Ein Vorteil des Tiny für Einsteiger ist allerdings, dass die Features
weniger reichhaltig sind und daher auch das Datenblatt übersichtlicher
und weniger verwirrend.

Wenn du Assembler programmieren möchtest, dann reicht der tiny13 immer,
also mehr Codeplatz brauchst du dann sicher nicht. Atmega8 ist aber
unter C angenehmer, weil du z.B. kein sprintf in den tiny13 bekommst
(schon gar nicht mit float) - schon die lib ist zu groß.

cu joern

von Jörg (Gast)


Lesenswert?

Möchte keinen Atmega verwenden, da der Tiny für meine Bedürfnisse
vollkommen ausreicht. Auserdem möcht ichs mir nicht unnötig kompliziert
machen.
Tu mir irgendwie etwas schwer, da ich bisher nur 8051 programmiert
habe. Der braucht mir aber zu viele Bauteile ausen herum. Da sind die
Atmels wirklich angenehm.
Wäre euch aber echt dankbar, wenn mir jemand ein paar Einrichtzeilen
und etwas Assemlercode zur PWM schicken könnte.
Vielleicht hat ja jemand schonmal so etwas mit dem ATtiny13 gemacht und
hats nochauf der Platte rumliegen.
Wäre jedenfalls super.

von Hannes L. (hannes)


Lesenswert?

>>
Tu mir irgendwie etwas schwer, da ich bisher nur 8051 programmiert
habe. Der braucht mir aber zu viele Bauteile ausen herum. Da sind die
Atmels wirklich angenehm.
Wäre euch aber echt dankbar, wenn mir jemand ein paar Einrichtzeilen
und etwas Assemlercode zur PWM schicken könnte.
<<

Hast du den schon den Link oben verfolgt und dir die Quelltexte und
Beschreibungen angesehen?

Allerwichtigstes Hilfsmittel ist das Datenblatt des jeweiligen AVRs, in
dem die entsprechenden Hardware-Features aufs Bit genau beschrieben
sind.

Um die Hardware-PWM (ganz allgemein gesehen) benutzen zu können, musst
du in der Init-Routine:
- den zuständigen Timer einschalten (Vorteiler)
- aus den Tabellen im Datenblatt den entsprechenden Modus auswählen
  und mit den entsprechenden Bits in die entsprechenden
  Steuerregister manipulieren
- die betreffenden Portpins als Ausgang schalten (DDRx)
- die entsprechenden Tastgrade in die Compare-Register eintragen.

Um dann in der Mainloop den Tastgrad zu ändern, musst du nur die neuen
Werte in die Compare-Register eintragen.

Und das ist schon alles...

Da der Tiny13 noch relativ neu ist, und er mich nicht wirklich
überzeugt hat, habe ich noch keine PWM-Projekte damit realisiert. Daher
kann ich dir auch keinen entsprechenden Code posten.

...

von Jörn-H. G. (joern_g)


Lesenswert?

Standardweg: letzte Seiten des Kapitels PWM im Datenblatt aufschlagen,
da wo die Register nochmal zusammengefasst werden.
Dann einfach jedes Register durchgehen, Bit für Bit. Wir können dir
kaum abnehmen, dem für dich passenden PWM-Modus zu finden.

Fast-PWM ist aber oft OK. Vorteilerfrequenz probierst du einfach aus.
Ob nun 8051 oder AVR ist doch egal, wenn es um das Anschmeissen einer
PWM geht, oder? Die Regfister zu füllen ist zwar anders (8051 mit MOV
A, ..., AVR mit LDI R16,...) aber ansonsten muß man sich eben bei allem
mit dem Datenblatt beschäftigen - im Prinzip ja nur mit den Seiten
68-73.

ldi temp,

Tiny13 oder ATmega ist doch alles dasselbe bei 8bit-PWM. Höchsten ein
Register hat mal 'ne zusätzlich null im Namen, oder so.

Für den T13 in C habe ich z.B. das mal gemacht (in C - aber auch das
ist doch genau das gleich in Assembler):

-------------------------
DDRB  = (1<<LED) | (1<PWM); //LED und PWM sind Ausgänge
PORTB = (1<<LED);

//FastPWM, TOP=0xFF, non-invert OC0x
TCCR0A = (1<<COM0A1) | (1<<WGM01) | (1<<WGM00);
TCNT0  = 0;
OCR0A  = 128;  //50%
TCCR0B = (1<<CS02);//fclk/256/8=4kHz PWM-Takt (+Start)
-------------------------

in Assembler wäre es :

-------------------------
.include "tn13def.inc"

.equ PWM = PB0 ;OC0A
.equ LED = PB1
.def temp = R16

rjmp RESET
rjmp RESET; EXT_INT0
rjmp RESET; PCINT0
rjmp RESET; TIM0_OVF
rjmp RESET; EE_RDY
rjmp RESET; ANA_COMP
rjmp RESET; TIM0_COMPA
rjmp RESET; TIM0_COMPB
rjmp RESET; WATCHDOG
rjmp RESET; ADC

RESET:
ldi temp, low(RAMEND)
out SPL,temp

ldi temp, (1<<LED) | (1<PWM)
out DDRB, temp
ldi temp, (1<<LED)
out PORTB, temp

ldi temp,(1<<COM0A1) | (1<<WGM01) | (1<<WGM00)
out TCCR0A, temp
und so weiter und so fort (wie oben)
-------------------------

Natürlich musst du dich in ASM (wieso eigentlich muß es ASM sein?) um
die RJMPs am Anfang für die IRQ-Vektoren und das laden des Stacks
selber kümmern usw. Das würde dir WINAVR abnehmen.
Das steht aber im Tutorial und im Datenblatt (S.41 !!).

cu joern

von Jörn-H. G. (joern_g)


Lesenswert?

Ach ja, mit dem OCR0A Register kannst du quasi dann "dimmen".
In diesem Fall entspricht ein 0 dort drin, "aus" und eine 255 "an",
alles dazwischen verschiebt eben das AN/AUS-Verhältnis.

cu joern

von Berti (Gast)


Lesenswert?

Code Vision bietet da ein ganz gemütliches Code Wizzard.
Habe unlängst für nen Tiny15 nen Drehzahlsteller gebaut.

von Jörg (Gast)


Lesenswert?

Danke für eure Antworten.
Denke, ich komm so weiter.
Assembler musste es eben sein, weil ich das schon etwas kann... .

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.