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.
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 ...
die attiny2313 sind ganz toll! die haben 4 PWM`s ;-) und lassen sich auch gut in c programmieren.
> 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.
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.
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
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.
>> 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. ...
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
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
Code Vision bietet da ein ganz gemütliches Code Wizzard. Habe unlängst für nen Tiny15 nen Drehzahlsteller gebaut.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.