Taktumschaltung ATtiny2313

#2916411
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)
Gast #2916435
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.
#2916445
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
(Firma: guloshop.de) #2916909
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
#2917137
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!
(Firma: guloshop.de) #2917244
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
#2917449
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
Moderator Persönliche Seite #2917453
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?
(Firma: TravelRec.) Persönliche Seite #2917664
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.
(Firma: guloshop.de) #2917686
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
Angehängte Dateien:
Moderator Persönliche Seite #2917746
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.
(Firma: guloshop.de) #2918343
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?
(Firma: guloshop.de) #2918387
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. :-)
Moderator Persönliche Seite #2924315
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. ;-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren