Hallo, ich habe hier eine Testanwendung für Solarbetrieb, bei der der "Einschaltvorgang" nicht so recht funktionieren will. Es handelt sich um einen AVR (ATTiny45) und eine LED (an einem IO-Pin) mit einer Solarzelle (3V nominal, 2 Elkos mit 47µF zum Puffern) als Energieversorgung. Test-Anwendung: Der AVR soll die LED nur kurz (15ms) "anschalten" und dann für 1 Sekunde schlafen gehen (wird per Watchdog-Timer aufgeweckt) und danach wieder von vorn beginnen (also Endlosschleife: sehr kurzes Aufleuchten, lange Pause). Problem: Das ganze funktioniert solange die Spannung (gleich nach der Programmierung des AVR) über 1,8V bleibt. Ich kann also die externe Spannungsversorgung abklemmen und die LED blinkt (wenn auch sehr dunkel) und die Versorgungsspannung pegelt sich bei ~1,98V ein (Solarzelle liefert nominal 3V, ist aber gerade in einer schlecht beleuchteten Wohnung). Wenn ich nun testweise die Solarzelle abklemme sinkt die Versorgungspannung (gemessen mit Voltmeter) langsam unter 1,8V und ab ~1,2V sinkt sie dann ganz ruckartig ab auf ~0,8V und bleibt dort. Wenn ich nun die Solarzelle wieder anklemme, steigt die Versorgungspannung auf ~1,2V an und hängt dort fest (schwankt um +/- 20 mV, eher Messwertrauschen). Auch eine Verzögerung von 8 Sekunden (PowerDown-Sleep-Mode) am Anfang des Programms hilft nicht. Auch wenn ich die LED abklemme kommt die Versorgungsspannung nicht mehr über 1,2V. Was hilft: Die externe Spannungsversorgung (5V) kurz anschließen. Danach läuft alles wieder und pendelt sich bei ~1,8V ein. == Programmdetails: == Peripherie wird beim Startup sofort abgeschalten (d.h. ADC, Timer0+1, USI; danach: BOD, AC + Spannungsreferenz; auch wird DigitalInputDisable für alle IO-Pins aktiviert). Danach geht der AVR für 8 Sekunden schlafen, damit im Falle einer "Unterspannung" sich die Kondensatoren erst einmal etwas aufladen können. Dann Endlosschleife: * IOPin mit LED wird auf "OUTPUT" und "HIGH" geschalten * 15ms WatchDog-PowerDown-Sleep * IOPin mit LED wird auf "INPUT" geschalten (***) * 1s WatchDog-PowerDown-Sleep (***) Erklärung: Der IO-Pin wird auf INPUT umgeschalten, um nicht Energie aufzuwenden, um das Spannungslevel abzusenken. Die (kleine) Kapazität in der LED soll also genutzt werden, um noch etwas nachzuleuchten. == FRAGE == Was kann man da tun, damit ein normales Einschalten per Solarversorung funktioniert? Meine aktuelle Idee dazu wäre: Kann man vllt. irgendwie verhindern, dass der AVR anläuft, wenn weniger als 1,8V Spannungsversorgung anliegen? D.h. dass solange die Spannung < 1,8V ist der AVR z.B. Stromlos geschalten wird oder sowas? Vllt muss man auch irgendwie eine Reset-Leitung irgendwie "anklemmen"?
Vielleicht klappt es schon mit einem ATtiny45V und geringerem Systemtakt.
Lucky schrieb: > Vielleicht klappt es schon mit einem ATtiny45V und geringerem > Systemtakt. Also ich hab mal 128kHz Systemtakt probiert. Verhält sich immer noch so. Ich denke zudem, dass die "V" Varianten das gleiche Problem haben, nur halt bei nem niedrigerem Spannungslevel. Das Löst also wahrscheinlich das Problem nicht.
Du solltest vermutlich den BOD aktivieren, damit der Tiny nach einem Spannungseinbruch wieder in einen definierten Zustand kommt. Für mich klingt das nach einem Latch-Up durch den Betrieb mit undefinierter Vcc. Obacht, wenn die Solarzelle dann richtig Strom liefert (Wolke vor der Sonne geht weg) und der Tiny ist in seinem Zwischenstadium, könnten recht hohe Ströme fliessen, natürlich nur, wenns eine kräftige Zelle ist. Du könnest auch überlegen, ob du einen kleinen Zwischenpuffer aus Akkus oder einem Goldcap integrierst.
Matthias Sch. schrieb: > Du solltest vermutlich den BOD aktivieren, damit der Tiny nach einem > Spannungseinbruch wieder in einen definierten Zustand kommt. BOD mit 1,8V hab ich probiert. Ohne Erfolg. Hatte die BOD während des "Power Down" deaktiviert... testweise aktiviert. Kein Erfolg. > Für mich > klingt das nach einem Latch-Up durch den Betrieb mit undefinierter Vcc. Ein Latch-Up sollte doch eher bei "Überspannung" auftreten, oder? > Obacht, wenn die Solarzelle dann richtig Strom liefert (Wolke vor der > Sonne geht weg) und der Tiny ist in seinem Zwischenstadium, könnten > recht hohe Ströme fliessen, natürlich nur, wenns eine kräftige Zelle > ist. Ja, das würde dann natürlich sinn machen... da reicht bestimmt auch ne kleine Schaltung mit ner 4.7V Z-Diode. Hab ich testweise probiert (4.7V Z-Diode parallel zur Solarzelle, "|"-Markierung in Richtung des Pluspols). > Du könnest auch überlegen, ob du einen kleinen Zwischenpuffer aus Akkus > oder einem Goldcap integrierst. Denke das würde das Problem eher nicht beheben. Denn das Problem ist, dass es -irgendwann- immer vorkommen kann, dass mal nicht genug Sonne ist und dann ist auch ein Akku oder Goldcap leer. Zudem funktioniert es auch nicht "initial" ... d.h. wenn die Batterie bzw. der Goldcap noch nicht aufgeladen ist und die Spannung dann langsam ansteigt. -- NACHTRAG: -- Nach meinen aktuellsten Recherchen ist die langsam steigende Spannung das Problem. Damit der POR (Power On Reset) sauber funktioniert, muss der Spannungsanstieg laut Datenblatt mindestens 0.1 V pro Millisekunde betragen. Sprich: Wir brauchen eine Schaltung, die ab einer bestimmten Grenzspannung (z.B. bei > 1.8V) die Spannung zuschaltet und sonst abschaltet. Könnte z.B. ein Transistor erledigen. Da ich aber mit Analog-Schaltungen noch zu wenig Erfahrungen habe, muss ich mich hier wohl auch wieder erst mal belesen. Werde mal bissl recherchieren und dann per LTSpice testen, wie sich eine Testschaltung (einfacher Transistor richtig rein geklemmt) bzgl. des Spannungsanstiegs auf dem "Ausgang" verhält.
Vllt hilft ja ein Komparator in Verbindung mit normalen und schottky Dioden.. Der könnte dann den Transistor sauber schalten, dass du nicht irgendwo im nicht linearen Teil der Kennlinie bist.
== nächster Nachtrag == Also es haben wohl welche über nen P-Kanal MOSFET gelöst, der aber von der Schaltspannung ziemlich genau stimmen muss. Was auch nicht funktioniert: 1. den AVR extern/manuell zu einen Reset zu verpassen (Puls mit RESET-Pin an GND); Dabei bricht Vcc nochmal ordentlich ein. Wahrscheinlich hängt also der AVR in einer Art Reset-Schleife. Und beim Reset verbrät er wahrscheinlich Unmengen an Energie, die verhindern, dass das Spannungslevel sich weit genug erhöhen kann. 2. BOD auf 2.7V war ebenso erfolglos. 3. Hab auch mal SUT = 00 probiert, also schneller Startup ohne Delay; mit 1.8V BOD und BOD disabled. Das ärgert mich jetzt schon ein wenig, dass wegen einer langsam steigenden Versorgungsspannung noch mehr externe Komponenten nötig sind.
Bloß so ein Gedanke... keine Ahnung, ob er sinnvoll ist: Wenn du den /RESET-Pin über einen Spannungsteiler immer auf ca. 60 oder 70% der Versorgungsspannung hältst, vielleicht bringt das etwas. Oder – du hängst zwischen VCC und /RESET eine Diode. Damit liegt /RESET immer ca. 0,6 Volt unter VCC. Notfalls nimmst du zwei Dioden oder eine Z-Diode.
Stefan K. schrieb: >> Für mich >> klingt das nach einem Latch-Up durch den Betrieb mit undefinierter Vcc. > > Ein Latch-Up sollte doch eher bei "Überspannung" auftreten, oder? Vllt. ist Latch-Up nicht der richtige Ausdruck. Ich meine den Zustand, das in der Gegentaktendstufe des I/O Pins beide FETs leiten und damit einen hohen Querstrom produzieren. Was mir gerade noch einfällt: Wie sind denn die Pegelverhältnisse an den I/Os generell? Da ist nichts dran, was versehentlich noch Strom in den Prozessor leitet, wie eine LED oder so? Dadurch wird evtl. der MC über die internen Schutzdioden gespeist, statt über den Vcc Pin. In diesem speziellen Fall solltest du überlegen, ob es nicht besser ist, LEDs gegen Masse zu schalten und nicht wie sonst üblich gegen Vcc.
Markus W. schrieb: > Wenn du den /RESET-Pin über einen Spannungsteiler immer auf ca. 60 oder > 70% der Versorgungsspannung hältst, vielleicht bringt das etwas. > > Oder – du hängst zwischen VCC und /RESET eine Diode. Damit liegt /RESET > immer ca. 0,6 Volt unter VCC. Notfalls nimmst du zwei Dioden oder eine > Z-Diode. Die Idee hatte ich auch schon (zumindest den Spannungsteiler). Da aber ein manueller Reset (auch) nix bringt, wird das wohl ebenso fehlschlagen. Die Idee mit der Diode find ich auch gut. Hab ich zumindest wieder eine Variante mehr in Reportoir für solche Dinge...
Matthias Sch. schrieb: > Was mir gerade noch einfällt: Wie sind denn die Pegelverhältnisse an den > I/Os generell? Da ist nichts dran, was versehentlich noch Strom in den > Prozessor leitet, wie eine LED oder so? Dadurch wird evtl. der MC über > die internen Schutzdioden gespeist, statt über den Vcc Pin. In diesem > speziellen Fall solltest du überlegen, ob es nicht besser ist, LEDs > gegen Masse zu schalten und nicht wie sonst üblich gegen Vcc. Ich habe nun doch mal die grundlegende Schaltung als Schaltbild gezeichnet. Siehe Anhang... Leider sind auch in diesem Programm nicht alle Bauteile drin, die ich eigentlich habe. Deswegen ist der ATTiny85 (statt ATtiny45) im Schaltbild und die Solarzelle ist als "Peltierelement" eingetragen. Die IC-Eingänge Reset, ADC1 (SCLK), PWM1/0 (MISO/MOSI) hängen am SPI-Port des Programmers (Arduino-Board). Hab den Programmer aber schon mal abgeklemmt. Hatte auch schon einen 10kOhm-Widerstand als Pullup zwischen Reset und Vcc (Pin 1 + Pin 8). Einen Vorwiderstand vor der LED hab ich auch ausgetestet. Stefan
Stefan K. schrieb: > Hab den Programmer aber schon > mal abgeklemmt. Da sollte auch unbedingt so sein. Stefan K. schrieb: > Einen Vorwiderstand vor der LED hab ich auch > ausgetestet. Ja bitte lass ihn auch drin. Egal wie niedrig die Spannung ist, ein Vorwiderstand ist immer nötig, und wenn es nur 22R oder 47R sind. Die LED ist falschrum gepolt gezeichnet, aber so wie ich mir das vorstelle, also an Masse und nicht an Plus. In deinem Init Programm solltest du jedenfalls so schnell wie möglich die LED ausschalten, damit die nicht überflüssig Strom zieht. Evtl. wäre es auch gar nicht dumm, einen der ADC Kanäle zum Messen der Versorgungsspannung heranzuziehen, um einen geordneten Rückzug zu ermöglichen.
Matthias Sch. schrieb: > Ja bitte lass ihn auch drin. Egal wie niedrig die Spannung ist, ein > Vorwiderstand ist immer nötig, und wenn es nur 22R oder 47R sind. Also die Idee war, dass die LED sowieso nur kurz "pulst"... also 15ms pro Sekunde. Das sind nur 1,5% der Zeit. Also der LED sollte das ja eigentlich nicht weh tun. Is halt wie die Hand durch die Kerzenflamme bewegen... schnell geht, langsam durch tut weh... > Die LED ist falschrum gepolt gezeichnet, aber so wie ich mir das > vorstelle, also an Masse und nicht an Plus. Ja, kann durchaus sein... also das mit dem Schaltsymbol der Dioden bekomme ich selten richtig hin (is wie Münze werfen). Hab bei der LED einfach ausgetestet wie herum sie leuchtet ;-). Sie hängt aber definitiv zwischen Masse und IO-Pin. > In deinem Init Programm solltest du jedenfalls so schnell wie möglich > die LED ausschalten, damit die nicht überflüssig Strom zieht. Initial dürfte der IO-Port auf "LOW" sein. > Evtl. wäre > es auch gar nicht dumm, einen der ADC Kanäle zum Messen der > Versorgungsspannung heranzuziehen, um einen geordneten Rückzug zu > ermöglichen. Die Idee hatte ich ganz zu Anfang auch. Deswegen hatte ich am Anfang ein Delay von 8 Sekunden im Programm (mit ausgeschaltener LED). Das hatte aber nichts gebracht, deswegen habe ich es aktuell wieder herausgenommen, weils beim debugging stört (8 Sekunden warten). Allerdings würde der ADC auch nochmal ordentlich Leistung verbraten. Aber klar: definitiv bei weitem nicht so viel wie die LED anzuschalten (wahrscheinlich faktor 100). Der müsste dann entsprechend kurz angeschalten werden und dann schnell wieder aus. Allerdings muss sich laut Datenblatt die Referenzspannung erst stabilisieren, bevor man messen kann. Mit aktivierter BOD müsste die aber aktiviert sein. Gefühlt scheint die BOD aber eher mehr Schaden anzurichten, was das ansteigen des Spannungslevels angeht. Ich werde mal trotzdem mal testweise das Programm so umschreiben, vielleicht waren 8 Sekunden warten einfach nicht genug. Zudem war sowieso angedacht, dass das Programm sich bei wenig Spannung "schlafen legt", damit nicht irgendwelche merkwürdigen Effekte auftreten. Ich bin dabei gerade auch auf ein Problem gestoßen. Im Datenblatt steht nämlich "Note: 1. The device requries a supply voltage of 3V in order to generate 2.56V reference voltage."; und für die 1,1 Volt Referenz wird das ähnlich aussehen. Wahrscheinlich kann die Referenz nur unterhalb der Versorgungsspannung liegen. Sinkt die Spannung z.B. unter 1,4 Volt, sinkt dann wahrscheinlich die Referenzspannung mit. Man muss also, wenn, drauf bauen, dass die Brownout-Detection schon sauber bei etwas unter 1,8V zuschlägt und man solche Messungen überhaupt nicht bekommt. Und kann dann nur mit der 1,1 V Referenz arbeiten. Und zum messen einer höheren Spannung wäre damit ein Spannungsteiler (zwischen Vcc und GND) nötig. Aus Energiespargründen wurde dafür irgendwo (ich weiß nicht mehr wo ichs gelesen habe) vorgeschlagen, dass man statt zwischen Vcc und GND die Spannung zwischen einem IO-Pin und GND mit einem Spannungsteiler halbiert und dann misst. Der Trick dabei ist, dass man den IO-Pin nur für die Messung auf HIGH schaltet und sonst auf LOW. Damit frisst der Spannungsteiler nur im Messzeitraum Energie. Problem: Das kostet dann gleich 2 IO-Pins (wir haben insgesamt nur 6 Stück). Ne andere Idee von mir wäre, mit einen kleinen(!) Kondensator mit PWM und definiertem Duty-Cycle an einem IO-Pin zu laden und dann schnell für die Messung auf Input umzuschalten. Die Messung ist dass vielleicht nicht genau, aber um einen unteren Grenzwert festzulegen, würde das sicher reichen. ---> Problem: Das zieht wieder sofort beim Anschalten um festzustellen, ob das Spannungslevel hoch genug ist. Weitere Idee: Vcc über 2 Dioden in Reihe an einen IO-Pin anlegen und digital messen. Wie oben schon beschrieben, sinkt damit der Spannungslevel um je ~0,6V (d.h. 1,2 Volt). Bei niedriger Vcc (< 2,4 Volt??) müsste das reichen, damit am IO-Pin "LOW" gemessen wird. ---> Problem: Laut Datenblatt soll eine Spannung an den IO-Pins, die irgenwo in der Mitte zwischen High/Low liegt recht hohen Energieverbrauch bewirken. Und auch hier passiert das ja gerade wieder, wenn wir wenig Energie zur Verfügung haben. Welche der Ideen klingt denn am vielversprechensten für Dich / Euch?
Gäste schrieb: > Vllt hilft ja ein Komparator in Verbindung mit normalen und schottky > Dioden.. > Der könnte dann den Transistor sauber schalten, dass du nicht irgendwo > im nicht linearen Teil der Kennlinie bist. Ehe wir diese Beitrag hier "übergehen". Ich habe bisher noch nicht darauf geantwortet, weil ich ihn nicht verstanden habe. Ich muss dazu sagen: Bei Transistorschaltungen schlage ich immer erstmal im Elektronikkompendium nach und hoffe die richtige Variante der Basisbeschaltungen zu erwischen ... und dann wird im Simulator rumprobiert, ob die gewünschten Effekte auftreten. Und in der Realtität funktionierts dann meistens nicht... is dann immer wieder sehr deprimierend :( Ich würd das gern können, aber irgendwie weigert sich die Elektronik mir zu gehorchen... Sprich: Da fehlt mir fehlt da leider jede Menge Erfahrung und Wissen... Worauf ich aber hinaus will: Kann's mir vielleicht einer erklären, was genau gemeint war? Bissl "theoretisches" Wissen hab ich ja... und lerngewillt will bin ich auch ;-)
Stefan K. schrieb: > Welche der Ideen klingt denn am vielversprechensten für Dich / Euch? Die Methode, bei der du VCC als als Voltage Reference (REFS2:0 = 0b000) und VBG als Input Channel (MUX3:0 = 0b1100) wählst. Da brauchst du genau 0,0 I/O-Pins dafür, musst aber ein bisschen um die Ecke denken. (Die Idee dazu habe ich, glaube ich, im Transistortester-Thread aufgeschnappt.)
Konrad S. schrieb: > Die Methode, bei der du VCC als als Voltage Reference (REFS2:0 = 0b000) > und VBG als Input Channel (MUX3:0 = 0b1100) wählst. Da brauchst du genau > 0,0 I/O-Pins dafür, musst aber ein bisschen um die Ecke denken. > (Die Idee dazu habe ich, glaube ich, im Transistortester-Thread > aufgeschnappt.) Ganz klar das Thema verfehlt Konrad! ;-) Diese Idee war nämlich garnicht dabei!!! G Ok, also ich geh's mal durch, ob ich's verstehe: 1. Vcc also Referenz... REFS[2:0] = 000 (wobei das erste bit laut Datenblatt ignoriert wird, 100 würde wohl das gleiche tun); weiter... 2. V_BG (Bandgap Reference Voltage) als Input.. mal schauen... Das Manual schreibt dazu: >> "8.3 Internal Voltage Reference" >> ATtiny25/45/85 features an internal bandgap reference. This reference is >> used for Brown-out Detection, and it can be used as an input to the >> Analog Comparator or the ADC. Klingt perfekt. Wenn die Brown Out Detection (BOD) auch damit arbeitet, is das genau die Grenze bei der die BOD letztlich abschalten wird, d.h. wenn diese zu lange unterschritten wird. Jetzt noch eben "verstehen" wie das Zahlenmäßig aussieht: Messwert = (1023*V_BG) / Vcc Also ist bei "Messwert == 1023" "V_BG == Vcc". Wenn wir unser unteres Limit z.B. mit 10% über V_BG (110% = 1.1) festlegen, wäre das: Messwert = (1023*V_BG) / (V_BG*1.1) = 1023 / 1.1 = 930 Wobei gilt: höherer Wert == schlechter. Also müssen wir mit obiger Einstellung für REFS und MUX messen (Funktion readVBGvsVCC()) und dann: while (readVBGvsVCC() > 930) { sleep(WDTO_1S); } Wobei sleep() ein Powerdown-Sleep ist, der per Watchdog-Timer unterbrochen wird... Alles klar Konrad! Das probier' ich morgen nach der Arbeit aus... und dann meld ich mich mal... Dann hat man doch gleich wieder IO-Pins und externe Bauelemente eingespart. So mag ich das... alles schön in Software, da kenn ich mich aus ;-)
Probiere mal aus ob die Spannung steigt,wenn du Reset vom Tiny fix auf Masse legst. Wenn die Spannung dann steigt,könntest du sowas wie nen 24c021-25 dran anschliessen,der hält den Tiny solange auf reset wie die Spannung unter 2,7V liegt und sorgt dann für einen sauberen Start. Die beiden !Resetleitungen von den beiden chips miteinander verbinden und nen Pullup dran.
Hmm, hab nochmal das Datenblatt durchsucht, aber nicht gefunden, ab welchem Vcc die Bandgap 1,1 Volt REF stabil ist. M.E. steht da aber, das erst ab 2,7 Volt alles im grünen Bereich ist. Du könntest also enweder die 1,1 Volt Referenz nehmen, oder z.B. eine externe Diode im Durchlassbetrieb mit ihrem ca. 0,6 - 0,7 Volt. Ein Spannungsteiler an einem ADC Kanal würde dir dann die Solarspannung liefern können. Beim MC Takt gilt, so hoch wie nötig, so niedrig wie möglich. Du hast ja im Datenblatt schon gesehen, wie hoch der Stromverbrauch bei verschiedenen Takten ist, ausserdem beachte noch die Safe Operation Area. Am besten sind die 128 kHz, die könntest du für den WD oder den BOD sowieso benutzen. Achtung, es ist leicht möglich, sich dabei vom MC auszusperren, wenn gleichzeitig noch CKDIV8 gefused ist. Man muss dann den Programmierer auf 1-2 kHz ISP runterdrehen, das kann nicht jeder. Also erst CKDIV8 löschen, und dann den WD Oszillator aktivieren.
Hi >Du könntest also enweder die 1,1 Volt Referenz nehmen, oder z.B. eine >externe Diode im Durchlassbetrieb mit ihrem ca. 0,6 - 0,7 Volt. Die minimale Spannung für eine externe Referenz sind 2V. MfG Spess
spess53 schrieb: > Die minimale Spannung für eine externe Referenz sind 2V. Hab nochmal das Datenblatt durchsucht. Wo hast du das gefunden?
Hi
>Hab nochmal das Datenblatt durchsucht. Wo hast du das gefunden?
21. Electrical Characteristics -> 21.7 ADC Characteristics -> AREF
MfG Spess
spess53 schrieb: > 21. Electrical Characteristics -> 21.7 ADC Characteristics -> AREF Ah, cool. Ich hatte 'ne alte Version, wo es noch nicht drin stand. Danke Dir! Es bleibt also nur die 1,1 Volt Bandgap Referenz.
Stefan K. schrieb: > Ganz klar das Thema verfehlt Konrad! ;-) > Diese Idee war nämlich garnicht dabei!!! G Ist halt wie im Krimi: Auf den letzten drei Seiten werden noch mal eben schnell zwei neue Charaktere eingeführt: der Mörder und der gemeinsame Friseur von Opfer und Mörder, der die Zusammenhänge aufklärt. ;-)
Mikel M. schrieb: > Probiere mal aus ob die Spannung steigt,wenn du Reset vom Tiny fix auf > Masse legst. Ja, das klingt nach ne guten Test! Wird heute Abend erledigt. @Spess: >> Die minimale Spannung für eine externe Referenz sind 2V. >> 21. Electrical Characteristics -> 21.7 ADC Characteristics -> AREF Danke fürs Raussuchen! @Matthias: >> Es bleibt also nur die 1,1 Volt Bandgap Referenz. Ja, aber die reicht dann ja auch völlig. Mit der ADC-Konfiguration die Konrad geliefert hat, sollte das ja prima funktionieren. @Matthias: >> Beim MC Takt gilt, so hoch wie nötig, so niedrig wie möglich. >> Du hast ja im Datenblatt schon gesehen, wie hoch der Stromverbrauch >> bei verschiedenen Takten ist, ausserdem beachte noch die Safe >> Operation Area. Am besten sind die 128 kHz, die könntest du für den >> WD oder den BOD sowieso benutzen. Ja, also die Safe-Operation-Area geht ja sowieso bis 0 MHz runter. Allerdings steht auch irgendwo, dass die PLL bei <1 MHz nicht sauber "lockt" (Kapitel "Known Issues" glaube ich). Deswegen hab ich's derzeit mit 1 MHz laufen. Außerdem is die Frage, ob kurzzeitig 1 MHz nicht günstiger ist als 128 kHz für die 8fache Dauer. Denn die Initialisierung dauert ja entsprechend 8 mal länger... abgesehen vom zusätzlichen Delay, welches wegen ISP-Zugriff eingebaut wird. >> Achtung, es ist leicht möglich, sich dabei vom MC auszusperren, wenn >> gleichzeitig noch CKDIV8 gefused ist. Man muss dann den Programmierer >> auf 1-2 kHz ISP runterdrehen, das kann nicht jeder. Also erst CKDIV8 >> löschen, und dann den WD Oszillator aktivieren. Ja, davon kann ich ein Liedchen singen... Hab ich am Wochenende schon geschafft. Hab damals schon ausversehen auf externe Taktreferenz gefust und keine Taktreferenz gehabt... und dann ewig gebraucht, das wieder hin zu bekommen (hatte aber zum Glück noch einen zweiten ATTiny45, den ich dann auf nen IO-Pin nen Takt generieren lassen habe). Als ich bei 128 kHz den Chip nicht mehr programmieren konnte dachte ich auch nur "Yikes!" (wie avrdude so schön schreibt) und "diesmal haste's wohl wirklich geschafft!". Weil ja "interner Referenztakt" und ich dachte ich müsse unbedingt den WDT auf "immer an" fusen. Ging aber auch ohne... musste wie du schriebst nur den ISP "runtertakten"; Allerdings brauchte ich dafür ne ISP-"Software" für den Arduino, weil das Hardware-SPI wohl nur bis 500 MHz runter geht. Die Software hat's dann das SPI-protokolldirekt über Software erledigt. @Konrad: >>Ist halt wie im Krimi: Auf den letzten drei Seiten werden noch mal eben >>schnell zwei neue Charaktere eingeführt: der Mörder und der gemeinsame >>Friseur von Opfer und Mörder, der die Zusammenhänge aufklärt. ;-) Was für fiese Krimi's liest Du denn da? Hinterhältig!!! ;-) --- TODO-Liste für heute Abend: --- 1. Check, ob Spannung mit Reset and GND steigt. 2. Messung von V_BG gegen V_cc als Referenz austesten mit 5V (USB) und 3V (Knopfzelle) und Messwert via Serial-Port rausschieben; prüfen, ob's zu Berechnungen und externer Messung der Spannung passt. 3. Schleife mit Prüfung der Versorgungsspannung => Watchdog-Sleep einbauen (erster Schritt, bevor irgendwelche IO-Pins auf HIGH gehen).
> --- > TODO-Liste für heute Abend: > --- > 1. Check, ob Spannung mit Reset and GND steigt. > 2. Messung von V_BG gegen V_cc als Referenz austesten mit 5V (USB) und > 3V (Knopfzelle) und Messwert via Serial-Port rausschieben; prüfen, ob's > zu Berechnungen und externer Messung der Spannung passt. > 3. Schleife mit Prüfung der Versorgungsspannung => Watchdog-Sleep > einbauen (erster Schritt, bevor irgendwelche IO-Pins auf HIGH gehen). Hab leider nicht alles geschafft... und muss nun ins Bett. Vor allem gabs Schwierigkeiten mit der seriellen Datenliefern. Vor paar Tagen hat das noch super funktioniert mit 9600 baud. Hab dann ewig den Fehler gesucht und dann mal 300 baud probiert... das ging... bis 1200 läuft's danach bekomm ich nur noch Müll. Was solls... Aber hier nun die Ergebnisse: 1. Spannung mit Reset an GND => tut... 2. V_BG gegen V_cc als Referenz tut bei ~5.00V --> Messwert(RAW): ~250 bei ~2.98V --> Messwert(RAW): ~383 Die Messwerte weichen stark vom vorhergesagten Wert ab. V_bg muss demnach 1.1-1.25 Volt sein oder der ADC hat nen riesigen Offset und nen Gain-Fehler. Muss wohl mal das Offset messen und dann raus rechnen... der interessiert mich schon. Bei der aktuellen Messwertreihe müssten wir für 1.8V geschätzt irgendwas wie 625 oder 650 messen... 3. schaff ich grad nicht mehr. Kommt morgen... Grüße, Stefan
Stefan K. schrieb: > Allerdings steht auch irgendwo, dass die PLL bei <1 MHz nicht sauber > "lockt" (Kapitel "Known Issues" glaube ich). Deswegen hab ich's derzeit > mit 1 MHz laufen. PLL? Oha, das wird mit der schwankenden Vcc aber ein Affentänzchen. Wenns irgendwie geht, probier auf die PLL zu verzichten, da kann es nämlich auch mal zu einem Lock-up kommen. Du müsstest jedenfalls zyklisch testen, ob die PLL noch gelockt ist, das ist aber ein wenig wie der Baron, der sich selber am Zopf ausm Sumpf zieht, denn je nach Konfiguration taktet die ja auch Sysclk oder die Peripherie. Mit einem 1:4 oder 1:5 Spannungteiler am ADC Kanal und der Bandgap Referenz jedenfalls sollte es möglich sein, die Solarzelle zu überwachen. Wenn sie in den kritischen Bereich kommt, geordneten Rückzug und den WD aktivieren. Du könntest dann per WD den MC zyklisch aktivieren und die Spannung testen. Wenns reicht, LED blitzen lassen, wenn nicht, Hände in den Schoss und den WD neu starten. Stefan K. schrieb: > V_bg muss demnach 1.1-1.25 Volt sein oder der ADC hat nen riesigen > Offset und nen Gain-Fehler. Oder beides. Atmel nimmts da nicht so genau und empfiehlt immer, für genaue Messungen den ADC vorher zu kalibrieren. Die Bandgap ist auch ein bisschen schwammig definiert, lt. Datenblatt 1,0-1,2 Volt. Das macht schon was aus. Wenn das eine Massenschaltung wird, solltest du einmal kalibrieren und die Werte im EEPROM speichern, wenn nicht, hart die Limits in den Code programmieren.
Hi >Du müsstest jedenfalls >zyklisch testen, ob die PLL noch gelockt ist, das ist aber ein wenig wie >der Baron, der sich selber am Zopf ausm Sumpf zieht, denn je nach >Konfiguration taktet die ja auch Sysclk oder die Peripherie. Die PLL des ATTiny45 ist nur für Timer1 zuständig. Allerdings erschließt sich mir nicht, wozu man zum Led-Blinken einen Timer mit 64MHz braucht. MfG Spess
@Matthias > PLL? Oha, das wird mit der schwankenden Vcc aber ein Affentänzchen. > Wenns irgendwie geht, probier auf die PLL zu verzichten, da kann es > nämlich auch mal zu einem Lock-up kommen. Ich hab da jetzt nicht speziell ne PLL aktiviert. Aber üblicherweise hängt doch eine PLL am Oszillator / Resonator. In dem Fall der internen Taktquelle für den Systemtakt. Wenn die allerdings ganz normal erzeugt wird und nur immer brav geteilt wird (zwei mal durch 8), um auf 128 kHz zu kommen... wird schon alles passen. Wenn aber z.B. auf nen anderen Ressonator umgeschalten wird, oder z.B. ne größere Kapazität zugeschalten wird (damit er langsamer schwingt)... dann könnte die PLL nen Problem werden. Und die Vcc schwankt ja auch wenn "langsam" im Vergleich zum Systemtakt. Deswegen hängen auch 2 Elkos + ein Entstör-Kondensator parallel zur Vcc, die letztlich die Probleme mit dem zu langsamen Anstieg der Vcc verursachen. > Mit einem 1:4 oder 1:5 Spannungteiler am ADC Kanal und der Bandgap > Referenz jedenfalls sollte es möglich sein, die Solarzelle zu > überwachen. Schauen wir mal, ob das noch nötig ist. > Oder beides. Atmel nimmts da nicht so genau und empfiehlt immer, für > genaue Messungen den ADC vorher zu kalibrieren. Ja, das muss ich mir noch anschauen, wie das geht... > Wenn das eine Massenschaltung wird, solltest du einmal > kalibrieren und die Werte im EEPROM speichern, wenn nicht, hart die > Limits in den Code programmieren. Für den Test reicht jetzt mal ne manuelle Kalibrierung. Aber is halt auch nen Übungsobjekt... ich soll was daraus lernen. Am Ende gibts vielleicht paar Prototypen (<10 Stück) für ne Wissenschaftliche Untersuchung. Denke aber nur einen zum zeigen der Machbarkeit... Rest mit Knopfzelle. Da ist nur wichtig, dass das was das Teils tut funktioniert und möglichst preiswert ist. Dabei soll der AVR aber nicht viel tun. Geht nur darum, dass man das Teils irgendwo an die Wand hängen kann und es tut was es tut* und man muss weder Batterien tauschen noch nen Kabel für Stromversorgung verlegen. Das brauch ich sozusagen nur als "Kostenargument", weil es sonst bei ner Konferenz heißt: "aber das kostet doch dann viele Euros". Wenn man aber sagen kann: die Bauteile kosten in 1000+ Stückzahlen <3 EUR sind sie glücklich.
Hi >Ich hab da jetzt nicht speziell ne PLL aktiviert. Aber üblicherweise >hängt doch eine PLL am Oszillator / Resonator. Beim ATTiny45 nicht üblicherweise. Da ist eine PLL nur in Spiel, wenn diese aktiviert ist und der 16MHz Takt verwendet wird. Externen Taktquellen wird keine PLL verwendet. MfG Spess
Stefan K. schrieb: > Die Messwerte weichen stark vom vorhergesagten Wert ab. > V_bg muss demnach 1.1-1.25 Volt sein oder der ADC hat nen riesigen > Offset und nen Gain-Fehler. Oder das hier trifft zu: "The first ADC conversion result after switching voltage reference source may be inaccurate, and the user is advised to discard this result." Die Referenz wird zwar nicht umgeschaltet, aber sie ändert sich. Machst du nur eine Messung?
@Spess: >> Die PLL des ATTiny45 ist nur für Timer1 zuständig. Allerdings >> erschließt sich mir nicht, wozu man zum Led-Blinken einen Timer >> mit 64MHz braucht. Nö, in dem Fall benutz ich die PLL nicht... [Sarkasmus] PS: Wir wollen natürlich mit einer Genauigkeit von +/-20 ns regeln können, wie lang die LED an ist... den Nutzer interessiert nämlich nur, dass das Licht nicht unnötig an ist... wieviel der µC dafür unnötig an Saft mehr verbrät ist, is dabei nicht relevant! Dann musst Du nur noch einen Aufkleber mit so nem grünen Blatt aufs Gehäuse kleben und das Produkt kauft sich wie warme Semmeln. Also: Immer kundenorientiert denken... der DAU muss glücklich gemacht werden! ;-) [/Sarkasmus] @Konrad: > Oder das hier trifft zu: "The first ADC conversion result after > switching voltage reference source may be inaccurate, and the user is > advised to discard this result." > Die Referenz wird zwar nicht umgeschaltet, aber sie ändert sich. > > Machst du nur eine Messung? Ja, hab mir das Kapitel ADC extra genau durchgelesen. Diese Stelle entsprechend auch so umgesetzt. Der ADC wird aktuell immer wieder (insb. nach dem "Tiefschlaf" mit deaktiviertem ADC) komplett neu initialisiert. In der Initialisierungsroutine wird dann eine "Dummy"-Messung durchgeführt, die verworfen wird. Gemessen wird per ADC-Noise-Cancelation-Sleep-Mode... Allerdings habe ich da auch eine andere Software gesehen, die die ersten 3 Messungen weg wirft... Durch den ADC-Sleep-Mode sollte auch der Energieverbrauch während der Messung dann nicht so extrem hoch sein.
Hallöle, also wie's aussieht, hat mein USB-zu-Serial-Kabel den Geist aufgegeben. Da muss ich mir erstmal was neues basteln. Wahrscheinlich war das auch der Grund, warum plötzlich nur noch 1200 baud gingen. Wird also bissl dauern bis es wieder im Thread weiter geht. Ich danke aber schon mal für alles, was ihr mir so weit beigebracht habt. Da ist sehr viel nützliches dabei gewesen. Stefan
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.