Forum: Mikrocontroller und Digitale Elektronik Taktumschaltung ATtiny2313


von Uli T. (avaron)


Lesenswert?

Hallo zusammen,

nachdem ich gestern schon mal einsehen musste das meine erste Idee wohl 
eher nicht so toll ist, hier die Frage ob jemanden eine gute Lösung 
einfällt.

Problemstellung:

- Es geht um einen mobilen Datenlogger der möglichst Stromsparend mit 3V 
(2*AAA Baterie) arbeiten soll. Dies ist der Normbetrieb der Schaltung.

- Zusätzlich soll ein USB-Port verbaut werden, um die Daten bequem am PC 
auslesen zu können. Aus Platzgründen etc. soll die USB-Kommunikation 
komplett in Firmware via V-USB abgehandelt werden.

Probleme:

- V-USB verlangt einen Quarz von mindestens 12 Mhz
=> Nur der ATTiny2313 normal (also ohne V) ist für mehr als 10Mhz 
spezifiziert. Bei 3V ist auch dieser nur bis 10Mhz spezifiziert


Ich suche nun eine Jumperfreie Lösung, bei der der Tiny bei 5V 
Versorungsspannung (via USB) auf externen Takt bei 12Mhz läuft, bei 3V 
Versorgungsspannung jeodch unterhalb von 10Mhz (genauer Takt fast egal, 
da hier nur relativ selten (alle Sekunde) ein Meßwert per ADC erfasst 
werden soll)

Wichtige Rahmenbedingung: Es darf verlangt werden das die 3V 
Versorungsspannung vor dem anschließen an den USB-Port abgenommen wird. 
Der Tiny bootet also entweder mit 5V oder 3V.

Meine bisherigen Ideen dazu:
- Quarz per Schaltung umschalten => funktioniert nicht da externer Takt 
gefused werden muß
- Step-Up Wandler auf 5V auch im 3V Betriebsfall => gefällt mir nicht, 
Stromverbrauch
- Prescaler verwenden => Glaube ich nicht das das funktioniert, da ich 
denke die Takteinschränkungen kommen daher das CMOS-Technik verwendet 
wird und dann die Ladungen bei zu geringer Spannung nicht mehr umgeladen 
werden können, ich habe also bedenken das der Prescaler bei 3V die 12Mhz 
externen Takt verträgt)

Fällt jemanden eine Lösung ein? Gerne auch andere Mikrocontroller von 
Atmel da hier die Infrastruktur für diese vorhanden ist. PIC würde ich 
aus diesen Gründen ungerne nehmen, auch wenn diese für meinen 
Anwendungsfall wohl scheinbar die geeigneteren Controller sind)

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Setze beim Programmieren die CKDIV8 Fuse. Dadurch läuft der tiny2313 
beim Start erst mal mit 12/8 Mhz. Während der Initialisierung prüfst du, 
ob die Versorgunggspannung 5V oder 3V ist. Wenn VCC=5V setzt du den 
System Clock Prescaler auf ":1".

von Norbert (Gast)


Lesenswert?

Uli Trautenberg schrieb:
> Ich suche nun eine Jumperfreie Lösung, bei der der Tiny bei 5V
> Versorungsspannung (via USB) auf externen Takt bei 12Mhz läuft, bei 3V
> Versorgungsspannung jeodch unterhalb von 10Mhz

> (genauer Takt fast egal,
> da hier nur relativ selten (alle Sekunde) ein Meßwert per ADC erfasst
> werden soll)

Schick das Ding in irgendeinen  PowerDown/Sleep  Mode und gut is'.

Alles was du an esoterischen Schaltungsmaßnahmen drumherum baust wird 
vermutlich mehr Dampf brauchen als der µC beim Pennen.

von tek (Gast)


Lesenswert?

Ich würde die Step Up auf 5V Lösung wählen, und zwar mit einem Regler 
der noch mit recht wenig Spannung auskommt. Nur so holst Du das maximale 
aus den Batterien raus.
Denn was bringen dir deine 2 Zellen direkt am µc wenn schon bei 2,7V 
Schluss ist.

von Uli T. (avaron)


Lesenswert?

Sleep Modes nehme ich, aber ich kann ihn ja schlecht bei 3V mit 12 MHz 
betreiben....
Gut, ihn mit 12/8Mhz hochzufahren klingt vernünftig, aber wie gesagt, 
verträgt der Prescaler den externen 12Mhz Takt auch bei 3V.. Ich nehme 
an auch der Prescaler ist aus CMOS-Logik gebaut....

von Uli T. (avaron)


Lesenswert?

tek schrieb:
> Ich würde die Step Up auf 5V Lösung wählen, und zwar mit einem Regler
> der noch mit recht wenig Spannung auskommt. Nur so holst Du das maximale
> aus den Batterien raus.
> Denn was bringen dir deine 2 Zellen direkt am µc wenn schon bei 2,7V
> Schluss ist.

Hm, das mit dem Spannungseinbruch und der besseren Batterieausnutzung 
bei einem StepUp klingt sinnvoll... Welchen Wandler würdest Du 
empfehlen? Vorzugsweise in SMD verfügbar :D

Besten Dank allen bisher für die Anregungen und Vorschläge

von tek (Gast)


Lesenswert?

Ich hab schon den L6920 verwendet 
http://www.st.com/internet/analog/product/75172.jsp

Gibts bei Reichelt und läuft bei mir Problemlos.

von scherzkeks (Gast)


Lesenswert?

Also bevor Du nun so'n riesen Aufwand betreibst bau zusätzlich einen 
Tiny85 ein den Du mit der internen PLL und V-USB betreibst und nur dann 
mit Strom versorgst wenn die Schaltung am USB hängt.

von Thomas W. (diddl)


Lesenswert?

Oder nimm einen 16U2, der bedient den USB auch noch bei einem MHz.

Auch ein programmierbarer Teile käme in Frage.

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Magnus M. schrieb:
> Setze beim Programmieren die CKDIV8 Fuse. Dadurch läuft der tiny2313
> beim Start erst mal mit 12/8 Mhz. Während der Initialisierung prüfst du,
> ob die Versorgunggspannung 5V oder 3V ist. Wenn VCC=5V setzt du den
> System Clock Prescaler auf ":1".

So würd ich es auch machen, klingt nach einer guten Strategie.

Außerdem würde ich nicht den alten ATtiny2313, sondern seinen 
Nachfolger, den ATtiny2313A, oder gleich den ATtiny4313 (ohne A) 
verwenden. Die neueren Typen laufen nämlich in einem Spannungsbereich 
von 1,8 bis 5,5 Volt und schaffen einen Takt von sogar 20 MHz (ab 4,5 
Volt). Es gibt da also keine Unterscheidung mehr nach V und nicht V.

Nochwas: Falls du zum Loggen der Daten keine exakte Zeitbasis brauchst, 
gehts auch ohne Quarz. V-USB kann man nämlich auch ohne Quarz mit dem 
internen RC-Oszillator betreiben. Dazu brauchst du dann aber einen AVR, 
der intern auch mit 16 MHz läuft, also z.B. den ATtiny85 (8 Pins) oder 
den ATtiny861A (hat auch 20 Pins wie der ATtiny2313).

Markus

von Uli T. (avaron)


Lesenswert?

Nach dem durchlesen aller Kommentare bin ich jetzt wohl zur folgenden 
Lösung gekommen... Verwendet wird ein ATtiny85 im SOIC8 mit internem 
Oszi auf 16Mhz mit einem StepUp Wandler L6920. Der verträgt bis 5,5V, 
bin ich also auch bei USB auf der sicheren Seite :D und brauch nur eine 
nichtschaltbare Spannungsversorgung.

Besten Dank allen die sich Gedanken um mein Problem gemacht haben!

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Uli Trautenberg schrieb:
> Nach dem durchlesen aller Kommentare bin ich jetzt wohl zur folgenden
> Lösung gekommen... Verwendet wird ein ATtiny85 im SOIC8 mit internem
> Oszi auf 16Mhz mit einem StepUp Wandler L6920. Der verträgt bis 5,5V,
> bin ich also auch bei USB auf der sicheren Seite :D und brauch nur eine
> nichtschaltbare Spannungsversorgung.
>
> Besten Dank allen die sich Gedanken um mein Problem gemacht haben!

Hallo Uli,

den Stepup brauchst du nicht, mach es einfach so wie "Magnus M." 
empfohlen hat. Bei Loggen läuft das Teil mit einem sehr langsamen Takt 
(z.B. 64 kHz, spart viel Strom!), bei USB-Betrieb läuft es mit 16 MHz. 
Den Standard kannst du per Fuses auf 2 MHz festlegen, dann läuft der 
Mikrocontroller auch mit 1,8 Volt noch zuverlässig los. Beim 
Programmstart kann dein Programm feststellen, ob USB-Betrieb ist oder 
nicht und stellt den Prescaler für den internen Takt entsprechend um.

Wenn du - wie du ja vorhast - auf den Quarz verzichtest, brauchst du für 
USB-Betrieb 16,5 MHz, das heißt, du musst den internen Oszillator 
kalibrieren. Das ist nur notwendig, wenn das Gerät an USB hängt und kann 
mit dem USB-Takt als Referenz durchgeführt werden, passiert also 
automatisch.

Dazu gibt es schon fertige Prozeduren. Such am besten nach "guloprog S" 
(ist ein einfacher USB-Programmer), für den habe ich den Quellcode 
veröffentlicht. Der enthält alle nötigen Einstellungen für V-USB sowie 
eine Kalibrierungsprozedur, die ich für den ATtiny85 geschrieben habe 
(der ATtiny85 wird auch in dem Programmer verwendet).

Viel Spaß damit!
Markus

von Heinervdm (Gast)


Lesenswert?

Also zu der Sache mit den 12 MHz bei 3V:
Als ich das erste mal von V-USB gelesen habe, habe ich das mal getestet 
und weil ich keine 3.6V Zehner Dioden rumliegen hatte, habe ich den uC 
hat mit 3.3V betrieben. In meinem Test lief er so ohne Probleme, 
allerdings habe ich nicht sehr ausführlich getestet...

von Uli T. (avaron)


Lesenswert?

@Markus:

Bin jetzt etwas verwirrt...

Ich setzte also die Fuses auf 2Mhz, interner Oszi...

Okay, per ClockPrescaler komm ich jetzt auf z.B. 15kHz runter, selbst 
das sollte für mein Logging reichen....

Aber wie bekomm ich den jetzt auf 16,5 Mhz hoch für V-USB?

Und kann ich mit dem StepUp nicht die Batterien "leerer" saugen?

Aber da das ganze ne Mini-Serie mit ca. 200 Stck. werden soll bin ich 
natürlich über jedes Bauteil froh das ich mir spare :D

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Uli Trautenberg schrieb:
> Nach dem durchlesen aller Kommentare bin ich jetzt wohl zur folgenden
> Lösung gekommen... Verwendet wird ein ATtiny85

Warum eigentlich nicht den ATtiny2313A, der dein ursprüngliches
Problem (V geht nur bis 10 MHz, nicht-V geht nur ab 4,5 V) löst?

Uli Trautenberg schrieb:
> Aber wie bekomm ich den jetzt auf 16,5 Mhz hoch für V-USB?

Indem du an OSCCAL "drehst".  Die Frage ist halt nur, wieviel man
da drehen muss.  Vielleicht kannst du das ja aber vor der Auslieferung
messen und dann den passenden Wert im EEPROM hinterlegen?

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Markus Weber schrieb:
> Wenn du - wie du ja vorhast - auf den Quarz verzichtest, brauchst du für
> USB-Betrieb 16,5 MHz, das heißt, du musst den internen Oszillator
> kalibrieren. Das ist nur notwendig, wenn das Gerät an USB hängt und kann
> mit dem USB-Takt als Referenz durchgeführt werden, passiert also
> automatisch.

Laut Datenblatt ist bei knapp 14Mhz Schluss.

von Markus W. (Firma: guloshop.de) (m-w)


Angehängte Dateien:

Lesenswert?

Hallo Jörg,

vielleicht hab ich das nicht klar genug ausgedrückt.

Zur Mikrocontroller-Wahl:

Der ATtiny2313A ist in diesem Fall nicht so gut geeignet, weil er 
regulär nicht mit dem internen RC-Oszillator auf 16 MHz betrieben werden 
kann. 16,5 MHz werden aber benötigt, wenn man V-USB ohne Quarz verwenden 
will. Es gingen auch 12,8 MHZ, aber auch das liegt deutlich außerhalb 
des offiziell zulässigen Bereichs für den ATtiny2313A, man kann sich 
also nicht drauf verlassen, dass es funktioniert.

Folglich bleibt als Alternative der ATtiny861A (ebenfalls 20 Pins). Er 
hat im Gegensatz zum 2313A sogar AD-Wandler. Billiger ist jedoch der 
ATtiny85, und wenn Uli die 8 Pins ausreichen, dann ist der ATtiny85 
sicher die beste Wahl, denn er besitzt ebenfalls einen RC-Oszillator, 
der sich regulär auf 16 MHz einstellen lässt.

Im Gegensatz zum ATtiny2313 löst der ATtiny85 (wie auch der ATtiny861A) 
also nicht nur das Problem mit der Versorgungsspannung, sondern lässt 
auch einen Betrieb ohne Quarz zu. Das ist von Vorteil, wenn man Bauteile 
(Kosten) einsparen will. Der Einfach-USBasp (siehe Bild) macht das auch 
so.

Zum Oszillator:

Zunächst muss der RC-Oszillator des ATtiny85 auf 16 MHz eingestellt 
werden. Dazu muss man die Fuses CKSEL3..0 auf 0001 setzen. Damit die 16 
MHz nicht von Beginn an laufen, muss man das Fusebit CKDIV8 auf 0 
setzen. Dadurch startet der Mikrocontroller mit 16/8 = 2 MHz, läuft also 
auch mit 1,8 Volt zuverlässig los.

Nach dem Start fragt man ab, ob USB-Betrieb vorliegt. Man könnte dazu 
z.B. die Betriebsspannung messen oder Ähnliches. Falls USB-Betrieb, wird 
die Taktfrequenz auf 16 MHz erhöht, falls Batteriebetrieb, wird sie 
verringert, um Strom zu sparen. Das lässt sich über den Prescaler 
erreichen (Register CLKPS).

Bei USB-Betrieb muss die Frequenz auf 16,5 MHz kalibiert werden, damit 
V-USB funktioniert. Dazu wird der Takt des USB-Signals verwendet, man 
kann das also während des Betriebs erledigen und braucht dazu keine 
Werte im EEPROM abzulegen. Schau dir dazu einfach die Prozedur 
calibrateOscillator(void) in der Datei main.c der Quellen des "guloprog 
S" an. Diese Prozedur kalibriert den Oszillator und trägt den 
Kalibrierungswert ins Register OSCCAL ein.

Uli:

Per Clock-Prescaler kommst du leider nicht bis auf 15 kHz runter. Normal 
gingen 32 kHz (8 MHz / 256). Dadurch dass der interne Oszillator aber 
mit 16 MHz läuft, kommst du auf 64 kHz. Das Fusebit CKDIV8 stellt nur 
den Prescaler beim Mikrocontrollerstart auf 8 ein und sorgt nicht für 
eine zusätzliche Teilung. Aber auch bei 64 kHz braucht der 
Mikrocontroller seeehr wenig Strom.

Knut:

Nein, laut Datenblatt kann man wählen zwischen 8 MHz und 16 MHz Takt. 
Beides kann anschließend entsprechend kalibriert werden. 16,5 MHz liegen 
da auf alle Fälle im Rahmen.

So, hoffentlich war ich diesmal klar genug. :-)

Markus

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Markus Weber schrieb:
> Der ATtiny2313A ist in diesem Fall nicht so gut geeignet, weil er
> regulär nicht mit dem internen RC-Oszillator auf 16 MHz betrieben werden
> kann.

Sorry, das hatte ich verwechselt.  Habe in letzter Zeit wohl zu viel
mit den ATmega128RFA1 gemacht, deren internen RC-Oszillator kann man
bis über 20 MHz ziehen, aber das ist natürlich in der Tat eine andere
Implementierung.

Allerdings könntest du ihn natürlich mit einem 16-MHz-Quarz betreiben
und dann nur bei erkannter 5-V-Versorgung den 1:8-Prescaler per
Software abschalten.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Markus Weber schrieb:
> Knut:
>
> Nein, laut Datenblatt kann man wählen zwischen 8 MHz und 16 MHz Takt.
> Beides kann anschließend entsprechend kalibriert werden. 16,5 MHz liegen
> da auf alle Fälle im Rahmen.

Ja, bei dem 85er, aber nicht bei dem 2313, so meinte ich das ;-)

von Uli T. (avaron)


Lesenswert?

So, dann guck ich gleich mal daheim in die Bastelkiste was da zum 
rumprobieren rumliegt.... 85er hab ich mit Sicherheit keine...

Die Lösung gefällt mir irgendwie gut mit der guloprog kalibrierroutine.

88er müssten noch rumliegen, also auf ans fröhliche basteln :D

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Uli Trautenberg schrieb:
> So, dann guck ich gleich mal daheim in die Bastelkiste was da zum
> rumprobieren rumliegt.... 85er hab ich mit Sicherheit keine...
>
> Die Lösung gefällt mir irgendwie gut mit der guloprog kalibrierroutine.
>
> 88er müssten noch rumliegen, also auf ans fröhliche basteln :D

Ich könnt jetzt sagen, besorg dir besser ein paar ATtiny85, aber ich 
kenne den Spieltrieb selber nur zu gut. :-)

Du kannst auch mit dem ATmega88 schon anfangen, musst dann halt wieder 
einiges in der Software ändern, wenn du zum t85 wechselst. USB per 
RC-Oszillator geht auch mit dem ATmega88 – jedenfalls meistens. Statt 
16,5 MHz nimmst du 12,8 MHz und lässt den internen Oszillator von 8 MHz 
auf 12,8 hochdrehen. Das liegt natürlich weit außerhalb des erlaubten 
Bereichs, klappt aber oft trotzdem.

Die Port-Zuordnung musst du dann auch anpassen. Wichtig ist, dass du für 
USB-D+ einen Port wählst, auf dem auch INT0 liegt.

Jörg:

Ich war grad neugierig auf den "ATmega128RFA1" hab ihn aber auf die 
Schnelle nicht gefunden. Ich kenn nur die dicken Brummer ATmega1284 
(40-poliges DIP), der RFA1 ist einer im SMD-Gehäuse?

von Spess53 (Gast)


Lesenswert?

Hi

>Ich war grad neugierig auf den "ATmega128RFA1" hab ihn aber auf die
>Schnelle nicht gefunden. Ich kenn nur die dicken Brummer ATmega1284
>(40-poliges DIP), der RFA1 ist einer im SMD-Gehäuse?

http://www.atmel.com/devices/ATMEGA128RFA1.aspx

MfG Spess

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Spess53 schrieb:
> http://www.atmel.com/devices/ATMEGA128RFA1.aspx

Danke! Irgendwie aber schon verwirrend. Er nennt sich ATmega, ist aber 
bei den Xmegas einsortiert – wenn man nach dem Directory-Pfad geht.
Weder auf der ATmega noch auf der ATxmega-Übersicht hab ich ihn 
gefunden. Wahrscheinlich noch zu neu. Schaut interessant aus. :-)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Markus Weber schrieb:
> Ich kenn nur die dicken Brummer ATmega1284
> (40-poliges DIP), der RFA1 ist einer im SMD-Gehäuse?

Ja, den gibt's nur im QFN. Aber auch einen ATmega1284 bekommst du in
TQFP oder QFN, da sind sie bei weitem nicht so riesig wie in DIP-40.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Markus Weber schrieb:

> Danke! Irgendwie aber schon verwirrend. Er nennt sich ATmega, ist aber
> bei den Xmegas einsortiert – wenn man nach dem Directory-Pfad geht.

Jaja, das ist schon seltsam.

> Weder auf der ATmega noch auf der ATxmega-Übersicht hab ich ihn
> gefunden. Wahrscheinlich noch zu neu. Schaut interessant aus. :-)

Neu?  Neu wäre der Nachfolger ATmega256RFR2, denn der ist gerade erst
zur Produktronika vorgestellt worden:

http://www.atmel.com/devices/ATMEGA256RFR2.aspx

Den 'RFA1 gibt es nun schon so lange, dass man ihn sogar bei Reichelt
kaufen 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.