Forum: Projekte & Code Glühwürmchen in Rotkohlglas gefangen


von Hagen R. (hagen)


Angehängte Dateien:

Lesenswert?

FireFly/Glühwürmchen Projekt

Dieses Projekt basiert auf einer Idee von 
http://www.instructables.com/id/Jar-of-Fireflies/ Gemeinsamkeiten sind 
die Idee und der ATtiny45V. Unterschied ist das bei diesem Projekt 12 
LEDs angesteuert werden, die Spannungsversorgung aus einem 1.2V NiMH 
Akku und einem Stepup Wandler besteht. Der Akku wird durch ein 
Solarpanel aus einer Gartenlampe geladen. Statt einer Shottkydiode für 
das Solarpanel wird eine quasi "ideale Diode" mit geringstem 
Eigenstombedarf benutzt (D1, Q3, Q1, T1, 10mV Spannungsabfall). Als 
Stepupwandler wird ein MAX1724 
(http://www.maxim-ic.com/quick_view2.cfm/qv_pk/3024) benutzt.
Die Software auf dem AVR besteht aus meinem AVRootloader, ein 1-Wire 
Bootloader der 512Bytes benötigt und im Ordner \FireFly\Bootloader\ zu 
finden ist. Das eigentliche Projekt befindet sich im Ordner 
\FireFly\FireFly\AVR.

Die 12 LEDs werden an 4 Pins des AVRs angechlossen. Man lötet jeweils 2 
grüne LEDs (SMD0603 Lowcurrent in meinem Fall) antiparallel an zwei 
möglichst grünen Kupferlitzen an (alternativ mit grünem Edding 
anpinseln). Davon benötigen wir 6 solcher Litzen um auf 12 einzelne LEDs 
zu kommen. Diese 6 Litzen werden so angeschlossen: PB0-PB1, PB0-PB2, 
PB0-PB5, PB1-PB2, PB1-PB5, PB2-PB5.
Das Solarpanel kommt mit + an den + Pol des Akkus. Als Akku wurde ein 
1.2V AAA NiMH benutzt besser wäre aber einer der neueren NiMHLi Akkus 
von Sanyo da diese einen weitaus geringeren Innenwiderstand haben und 
somit eine wesentlich geringere Selbstentladung. Die meiste Zeit 
befindet sich der AVR im Power Down Modus und bei meinen Messungen 
verbraucht die Schaltung dann < 20µA.

Im Ordner \FireFly\HEX\ liegen das AVRootloader.hex File für den 
Bootloader und das FireFly.hex File für die eigentliche Software.

Die FireFly Software benutzt eine optimierte PWM Ansteuerng der 12 LEDs. 
Sie läuft mit einer PWM pro LED mit 122Hz bei 256 Schritten Dutycycle. 
Dabei verbraucht sie minimal nur 0.85% und maximal nur 1.46% an 
Rechenzeit der MCU um alle 12 LEDs anzusteuern. Die PWM benutzt den 
Overflow und Compare Match Interrupt des Timer0. Die 12 Glühwürmchen 
leuchten in 32 verschiedenen Blinkmustern=Waves, dh. die PWM benutzt 
eine Wavetable zur Ansteuerung der Glühwürmchen PWMs. Jede dieser Wave 
hat eine "Energiebilanz" und die 12 Firelies haben ebenfalls einen Wert 
für die Energiebilanz des Glühwürchens, Member ->Hungry. Ein Firefly 
beginnt zu leuchten wenn der Wert in ->Hungry == 0 ist. Dabei wird per 
Zufall aus den 32 Waves eines ausgewählt und als neues Blinkmuster dem 
FireFly zugeordnet. Die Energiebilanz dieser Wave wird auf die 
Energiebilanz des Glühwürmchens gebucht, dh. der Wert Hungry wird um den 
Energiewert der Wave inkrementiert. Jeder Energiepunkt stellt dabei eine 
Wartezeit des WDTs von 16ms dar. Je länger und intensiver das 
Glühwürmchen mit dem aktuellen Wave leuchtet desto länger dauert es also 
bis es erneut leuchten wird. Zusätzlich werden alle Nachbarglühwürmchen 
jeweils um die Hälfte von der Hälfte von der Hälfte usw. mit dem 
Energiewert belastet. Dh. das benachbarte Glühwürmchen ebenfalls in 
ihrem Leuchtinterval durch das aktuell leuchtende Würmchen belastet 
werden. Je weiter entfernt also ein Glühwürmchen zum aktuellen ist desto 
weniger Energiepunkte bekommt es abgezogen. Das Auswählen der Wave ist 
der einzige Punkt bei dem Zufall im Spiel ist. Die minimale Zeitbasis 
des WDT von 16ms ist also gleichzusetzen mit dem Füttern der 
Glühwürmchen um 1 Energiepunkt. Damit bestimmen die Werte in 
FireFly->Hungry also direkt die Gesamtzeit des WDTs in der der AVR im 
Power Down Modus warten muß bis zum nächsten Leuchten eines/mehrer 
Glühwürmchens.

Für das globale Timing wird der Watchdog Timer benutzt um auch längere 
Zeit im Power Down Modus der MCU verbleiben zu können. Über diesen wird 
auch das Messen der Battery- und Solarpanelspannnung erledigt. Aktuell 
ca. alle 6 Minuten wird die Akku/Solarpanel Spannung gemessen. Wenn die 
Akkuspannung >= 0.9 Volt ist kann ein Leuchten stattfinden. Fällt diese 
Spannung unter 0.9 Volt so passiert nichts da der Akkku erstmal durch 
das Solarpanel aufgeladen werden muß. Danach wird die Spannung am 
Solarpanel gemessen. Übersteigt diese die Akkuspannung so ist es Nacht 
und die Glühwürmchen können beginnnen zu leuchten. In der Nacht liefert 
das Solarpanel keine Spannung und verhält sich wie ein Ohmscher 
Widerstand. Der Minuspol ist durch die aktive Diode (MOSFET) von GND 
getrennt da ja die Solarpanelspannung kleiner der Akkuspanung ist 
(minimale Differenz 0mV und Spannungsabfall der idealen Diode ist 
10mV!). Demzufolge wird in der Nacht am Minuspol des Solarpanels quasi 
die Akkuspanung gemessen da der Pluspol des Akkus und Solarpanels 
zusammengeschaltet sind.

Die Ausnutzung der Power Down Zeiten ist maximal. Dh. die Wartezeiten 
bis das nächste Glühwürmchen leuchten soll verbringt der AVR im Power 
Down Modus. Tagsüber ist der AVR also immer im Power Down Modus und 
wacht ca. alle 6 Minuten auf um 3 ADC Messungen in ~280µs durchzuführen. 
Durchschnittlich alle 8 Sekunden wacht der AVR für ca. 10 µs auf. Wenn 
Nachts keines der Glühwürmchen leuchtet gelten die selben Bedingungen, 
ansonsten wenn es leuchtet wird bei meiner Schaltung ca. 1-20mA 
verbraucht je nach Anzahl der Glühwürmchen die gleichzeitig leuchten und 
wie lang sie mit welcher Wave leuchten. In dieser Zeitspanne befindet 
sich der AVR zu 99% seiner Zeit im Idle Sleep Modus. Durchschnittlich 
leuchtet dann 1 Glühwürmchen alle 15 Sekunden mit 1.2 Sekunden 
Leuchtdauer. Das sind aber nur Schätzwerte da auf Grund der sehr 
unterschiedlichen Waves und der eingebauten Periodizität der 
Glühwürmchen über den Hungry_Threshold mal längere Zeit (über Minuten) 
kein Glühwürmchen leuchtet und dann mal wieder mehrere Glühwümchen quasi 
in Gruppen aufleuchten. Also so wie in der Natur.

Alle ISR-Handler wurden aus Effizienzgründen in Assembler geschrieben, 
Datei Isrs.S.
Als Zufallsgenerator kommt ein 32Bit LFSR zur Anwendung, Dateien lfsr.h 
und lfsr.S. Dessen Startwert wird bei jedem Powerup aus dem EEPROM 
gelesen, ein neuer Startwert berechnet und dieser wieder ins EEPROM 
geschrieben wird. Dazu werden zwei unterschiedliche 32Bit Polynome 
benutzt.

Im Ordner \FireFly\FireFly\Windows\ befindet sich ein Wave-Editor für 
MS-Windows Systeme. Mit diesem kann man eigene Blinkmuster/Waves für die 
Glühwürmchen erzeugen, austesten, laden, speichern und als Header Datei 
exportieren kann. Aktuell benutzt das Projekt 32 verschiedene Waves 
zusammengesetzt aus einem Wave mit 827 samples. Damit stehen im AVR noch 
rund 1.5Kb an FLASH ungenutzt zur Verfügung. Die Leuchtdauer dieser 
Waves geht von 0.22 bis 2.88 Sekunden.

Setup:
1.) Schaltung aufbauen ;)
2.) AVRootloader.hex aufspielen, Fuses auf 8Mhz interne PLL, Brownout 
Detection off setzen
3.) AVRootloader.exe starten und Testverbindung herstellen, EEPROM mal 
lesen und schreiben
4.) wenn alles funktioniert, noch Fuse für RESET Pin als normalen PIN 
aktivieren (PB5 wird ja benötigt) und Lockbits entsprechend setzen. Dann 
ISP ab, da dieser auf Grund des deaktivierten RESET Pins eh nicht mehr 
funktioniert.
5.) mit AVRootloader.exe nun FireFly.hex programmieren
6.) alles irgendwie zuammenbauen so das im Deckel eines zb. 
"Rotkohlglases" die Elektronik sitzt, oben drauf das Solarpanel und in 
das Glas hineinhängend die 6 Litzen mit den 12 LEDs. Bei mir strahlen 
die LEDs alle nach unten ab. Noch ein bischen Plastikgrünzeugs rein 
(sollte jeder anständige Bastler auf grund der Vorlieben der eigenen 
Frau zur Hand haben, bei mir wars ein Plasikast aus der Dekoration im 
Badezimmer), und fertig.

Im Ordner FireFly\FireFly\Schematic\ der Schaltplan und das Boardlayout 
als Bitmaps (600 dpi).
Im Ordner FireFly\FireFly\Images\ par Bilder meines Aufbaues.

Was wird also benötigt:

- AVR ATtiny45/85V, Lowvoltage Version wäre gut
- MAX1724 oä. Stepupup Wandler auf 3Volt mit geringem IQ (hier 1.5µA)
- 12 grüne LEDs, am besten Lowcurrent und SMD so klein wie man es noch 
löten kann
- 12 kurze dünne Kupferlitzen möglichst in grün, ansonsten ein grüner 
Edding um sie einzufärben
- Solarpanel, Nachts freundlichst ausgebaut aus Nachbars 
LED-Gartenleuchte, oder eben ein geschenktes Teil ;)
- 1.2V AAA Akku, am besten die neueren Teile von Sanyo
- Glas mit Schraubdeckel, zb. Rotkohlglas von Hengstenberg (nicht den 
Inhalt essen bitte artgerecht entsorgen als Giftmüll)
- naja Hühnerfutter, par LED Vorwiderstände, ein Pullup a 330k für PB2 
(Bootloader-Detection im AVR) und 2 Low-ESR-Kondensatoren um die 1µF, 
und par Litzen.
- ansonsten Kleber, in meinem Aufbau hab ich das SOlarpanel mit solchen 
Klebestrips von Pritt (Mutifix) für Poster/Fotos angeklebt hält super. 
Ansonsten den Batteryhalter (aus so'n Mini-Fernsteuer-Panzer) mit UHU 
puls Endfest 300 an die Unterseite des Deckels angeklebt.
- und natürlich par ansprechnede Plastikgrünpflanzen
- die "aktive ideale Diode" kann auch komplett weggelassen werden und 
durch eine Shottky-Diode ersetzt werden. Dann aber diese Diode mit der 
Kathode an - des Solarpanels und mit der Anode an GND der Schaltung. Der 
Messpunkt des ADC befindet sich dann an der Kathode dieser Diode. 
Allerdings nutzt man so nicht die volle Power des Solarpanels aus da so 
erst bei +200mV über der Akkuspannung geladen wird. Mit der aktiven 
Diode liegt dieser Spannugsabfall nur bei maximal +10mV. Übigens die 
BAV70 Dioden stellen sehr hochohmige Pullups dar.

Bisher konnte ich jeden Besucher ohne Probleme davon überzeugen das im 
Glas echte Glühwürmchen für meine Unterhaltungsgier schmachten müssen ;) 
Meine Nichte war schon drauf und dran gewaltsam diese Glühwürmchen 
freizulassen und es dauerte einige Zeit ihr zu erklären das es keine 
echten sind.

Gruß Hagen

von Hagen R. (hagen)


Angehängte Dateien:

Lesenswert?

Bild 1

von Hagen R. (hagen)


Angehängte Dateien:

Lesenswert?

Bild 2

von Hagen R. (hagen)


Angehängte Dateien:

Lesenswert?

Bild 3

von Hauke R. (lafkaschar) Benutzerseite


Lesenswert?

Schickes Projekt!

Gut um sich m al genauer mit der Energeispaarproblematik 
auseinadnerzusetzen ;)

Ist nen schönes Geschenk, mal gucken wann ich das baue :D

von jo (Gast)


Lesenswert?

schöner beitrag!
ich dachte hier schon mal einen 'nachbau' des ursprünglichen projektes 
gesehen zu haben, aber täusche mich wohl.

von Hagen R. (hagen)


Lesenswert?

>Schickes Projekt!
>Gut um sich m al genauer mit der Energeispaarproblematik
>auseinadnerzusetzen ;)

Danke, und ja das Projekt hat einiges Potential das erstmal nicht so 
offensichtich ist, bei dem was man lernt.

1.) Wachtdog, was ist der Unterschied wenn man WDE und WDIE Bits setzt 
im WDT Interrupthandling ?! Habe lange danach gesucht. Der WDT wird 
aktiviert wenn man WDE oder WDIE oder WDE und WDIE setzt, Punkt 1. Setzt 
man WDE und WDIE so wird in der WDT-ISR autom. das WDIE Flag gelöscht. 
Beachtet man dies nicht so heist dies das der nächste WDT Timeout also 
einen WDT-RESET auslösst und nicht in die WDT-ISR verzweigt. Setzt man 
von Anfang an nur WDIE so wird die WDT-ISR ausgelösst und dann das WDIE 
Flag nicht autom. gelöscht. Die nächsten WDT-Timeouts lösen also 
weiterhin die WDT-ISR aus.
2.) Brownout Detection kann beim ATtiny45 per Software deaktiviert 
werden, aber welche Reihenfolge vor einem Sleep ist die richtige um 
diese Detection auch wirklih abzuschalten ? Ich habe sie per Fuse ganz 
abgeschaltet da die Powerup Zeiten aus einem Deep Power Down Modus stark 
verlängert werden und somit ab einem bestimmten Breakevenpoint mehr 
Strom verbraucht wird. Dh. zb. die abschaltbare Brownoutdetection macht 
nur dann Sinn wenn der AVR längere Zeit im Power Down Modus ist, bei mir 
musste der AVR weit länger als 8 Sekunden im Power Down sein, also weit 
länger als die macimal Zeit des WDTs. Die verlängerte Startup Zeit der 
MCU bei zuschaltbarer Brownout Detection frass dann mehr Strom als ohne 
diese.
Davon mal abgesehen muß ein ganz gewisses Timing beim Scheiben der 
Register beachtet werden damit das Mistding auch wirklich per Software 
abgeschaltet wird. Ach und ganz wichtig !! möchte man mit abschaltbarer 
Brownout und WinAVR GCC arbeiten dann vergesst ganz schnell die Sleep.h 
zu benutzen. WinAVR GCCs Sleep Makros machen alles falsch in diesem 
Fall.
3.) PWM Erzeugung für 12 LEDs, quasi Charlieplexing, die aber nur 
durchschnitlich 0.85% CPU Last hat. Die von mir implementierte PWM 
Routine dürfte wohl das Minimum an Rechenzeit benötigen das möglich ist. 
Jedenfalls sehe ich kein weiteres Optimierungspotential mehr um das noch 
kürzer zu bekommen. Leuchten alle LEDs permanent in ihrem Muster so 
verbraucht die MCU dafür nur 1.45% an Rechenzeit. Pro weiteren LED 
Kanal, also dann 20,30,42,56 LEDs, werden dann nur weitere +0.11% mehr 
an MCU zeit benötigt. Also eine 20 LED Ansteuerung würde dann minimal 
0.85% statt 0.74% und maximal 1.56% statt 1.45% an MCU Zeit benötigen. 
Der Zusammenhand ist linear.
4.) variable Watchdog Zeiten um einen genauen Zielzeitpunkt anzusteuern, 
natürlich nur in der Genauigkeit die man vom WDT verlangen kann.
5.) wie ist das mit der WDTON Fuse ? löscht man sie muß dem AVR der Saft 
abgedreht werden damit das auch wirkt.
6.) PinChange ISR. Man muß sehr vorsichtig damit umgehen, besonders wenn 
man diese ständig ein/ausschalten möchte. Aktiviert man eine PinChange 
ISR so sollte das in einem CLI()/SEI() Block erfolgen und man muß immer 
die ISR-Flags in GFIR explizit löschen. Gleiches sollte man auch in der 
PinChange-ISR immer machen. Sollte man kurz vor der Aktivierung einen 
PullUp am zu überwachenden Pin aktiviert haben dann ist es ratsam je 
nach MCU Takt par NOPs danach einzufügen und erst dann den PinChange zu 
aktivieren.

Gruß Hagen

von Hauke R. (lafkaschar) Benutzerseite


Lesenswert?

Ja das mit dem Watchdog hab ich beim tiny13 durch.

Ich habe so eine LED kerze mit RGB LED gebaut, besonderheit ist der 
Kapazitive näherungsschalter zum ein und ausschalten.

Dort benutze ich den Watchdog interrupt um die Kapazitive taste zu 
"entprellen" (Das Sensorergebnis muss Stabil sein, damit ein  wirklicher 
absichtlicher Druck erkannt wird)

Wenn ein Tastendruck erkannt wurde wird die Hauptschleife mit der PWM 
durchlaufen. Ist schon nen bisschen her, aber ich glaub die zwischenzeit 
verbringt er im Idle.

Wenn die Lampe dann wieder ausgeschaltet wird, verbringt er wieder die 
meiste Zeit im Tiefschlaf.

von gast (Gast)


Lesenswert?

Oh super! Das stand schon immer auf meiner todoliste :)

Lad doch mal ein video bei youtube hoch, würd ich gern mal sehen :) :)

von Hagen R. (hagen)


Lesenswert?

Ist ein Problem da ich keine bessere Cam habe und mit der Kamera meines 
HTC Touch bekommt man im Dunkeln keine guten Bilder hin. Und tagsüber 
ist der Eindruck den die LEDs erzeugen auch nicht der gleiche wie 
nachts. Ergo, nachbauen ist die Devise ;)

Du kannst dir aber im beigelegten WaveEditor 
(\FireFly\FireFly\Windows\WaveEditor.exe) die von mir benutzten Waves 
anschauen und auch austesten. Starte die EXE, lade die Wave.dat und 
doppelklicke mit der Maus in die Liste der einzelnen Waves. In der 
schwarzen Box leuchtet dann ein grüner Kreis in der ausgewählten Wave.

Gruß Hagen

von Benedikt K. (benedikt)


Lesenswert?

Schönes Projekt !
Werde ich mal nachbauen. Ich muss nur noch eine Alternative für den 
MAX1724 finden, da dieser nicht ganz so leicht zu bekommen ist.

von Ja mann (Gast)


Lesenswert?

Höhö, sehr lustiges Projekt, super!
Mich würde der Schaltplan, speziell der Teil mit der idealen Diode, 
interessieren. Könntest du da den Schaltplan(ausschnitt) reinstellen ?

von Ja mann (Gast)


Lesenswert?

Ach sehe gerade ist ja schon gaaanz oben drin. Verzeihung. Lesen 
bildet...

von Hagen R. (hagen)


Lesenswert?

Vielleicht gehts auch ganz ohne Stepup Wandler. Ich habe den nur 
eingebaut weil ich von Anfang an einen 1.2V Akku benutzen wollte. Und 
diesen wollte ich benutzen weil dessen Nennspannung weit unterhalb der 
3.5V des Solarpanels bei Sonnenbestrahlung ist. Bei Normallicht und am 
Akku angeschlossen fließen, bei einem Akku der auf 1.35V voll aufgeladen 
ist, gerade noch 200µA vom Solarpanel, das reicht für den AVR und als 
Erhaltungsladung für den Akku aus. Somit ist die Wahl des 1.2V Akkus und 
dem dann nötigen Stepup Wandler nur den Eigenschaften des Solarpanels 
geschuldet und dient dem Ziel die Energie des Solarpanels so gut wie 
möglich ausnutzen zu können. Wenn man also ein anderes Solarpanel 
benutzt, oder sogar ganz darauf verzichtet dann kann man auch zb. 2 oder 
3 solcher AAA Akkus benutzen. Mit 1000mAh sollten diese über Wochen 
ausreichend sein.
Bei 0.9V im Akku macht die Schaltung dicht. Das dient zum Schutz vor 
Tiefenentladung aber auch um die Funktonsweise der "idealen Diode" zu 
gewährleisten. Diese arbeitet zwar auch bei Spanung < 0.8V korrekt, aber 
dann wird der Ladestrom über die interne Bodydiode des MOSFETs fließen, 
weil der MOSFET bei <0.8V nicht mehr durchgeschaltet wird. In diesem 
Moment haben wir wieder den unerwünschten Spannungsabfall der Bodydiode 
des MOSFETs und hätten dann gleiche ne Shottky benutzen können. Da aber 
immer 0.9V minimal am Akku sichergestellt sind ist dieses Problem 
eliminiert. Der Voltagegdrop dieser "idealen Diode" geht lauft 
Simulation mit LTSpice gegen 10µV und verbraucht dann ~8nA Strom.

Den MAX1724 habe ich bei MAXIM gesampelt, und ich bin mit dem Teil 
wirklich zufrieden und kann diesen speziell für solche Lowpower 
Anwednung nur wärmstens empfehlen (mal ohne preisliche Wertung nur aus 
Sicht der Technologie), zb. wird bei sehr geringem Sromverbrauch am 
Ausgang der PWM Modus umgeschaltet und er Stepup zieht dann nur noch 
sehr wenig Strom um die Ausgangsspanung nur konstant zu halten, ideal 
also für die Spannungsversorgung eines AVRs der im Power Down ist.
Ein kleines Manko hat er aber. Der Shutdown Modus trennt nicht den 
Ausgang vom Eingang. Eine höhere Spannung am Ausgang fließt also auch im 
Shutdown Mode zurück zum Eingang. Es gibt aber auch ähnlich gute MAXIM 
teile die dann einen echten Shutdown haben.

Gruß Hagen

von Hagen R. (hagen)


Angehängte Dateien:

Lesenswert?

B1 = Solarpanel
C1 = Akku

Wenn gewünscht poste ich auch noch die Dateien für die Simulation in 
LTSpice.
Idee stammt von hier 
http://library.solarbotics.net/circuits/misc_switching.html

Gruß Hagen

von Hagen R. (hagen)


Lesenswert?

>>Das dient zum Schutz vor Tiefenentladung aber auch um die Funktonsweise der 
>>"idealen Diode" zu gewährleisten.

und natürlich auch für den MAX1724 der ab 0.8V erst beginnt sauber zu 
arbeiten.

Die BAV70 kann bzw. muß durch Widerstände ersetzt werden wenn man 
schnellere Schaltvorgänge hat. Da aber der Tag/Nachwechsel bei diesem 
Projekt so arsch langsam ist kann man auch die BAV70 nehmen um Strom zu 
spraen. Insgesamt ist die Schaltung enorm hochohmig und damit auch 
störanfällig. Dumm nur das man deren korrekte Funktionsweise mit 
Amateurmiteln nicht ausmessen kann da jedes Multimeter/Oszi dessen 
Funktionsweise durch die Messungen verändert. Ich habe sie demzufolge 
nur per Simulation überprüft und dann über Monate mit einem Akku + 
Solarpanel + Amperemeter praktisch ausgemessen, sie funktioniert.

Gruß Hagen

von Mario G. (mario)


Lesenswert?

Als Alternative für den MAXIM1724 könnte man den PR 4402 (0,63€) von 
Reichelt nehmen. Eigentlich ein LED-Driver (bis 40mA). Mit einer Z-Diode 
am Ausgang sollte es gehen...

von Hagen R. (hagen)


Lesenswert?

PR4402

Quiescent Supply Current Vcc > 950mV ist 8 mA.

Wenn der Akku auf mehr als 0.9 Volt aufgeladen wurde zieht das Teil ohne 
irgendeine Last am Ausgang, also nur für sich selber zum Eigenbedarf, 8 
mA. Das ist das 400 fache dessen was der AVR im Durchschnitt brauch. Zum 
Vergleich der MAX1724 benötigt 0.0015mA für sich selber.
Ich mag diese Teile nicht sonderlich, für billige LED Anwendungen sind 
sie super, aber nicht für mehr. Desweiteren ist das ein Stepup der am 
Ausgang eine Stromsenke, sprich LED, erwartet und kein Regler der auf 
eine definierte Spannung regelt. Das ist schon ein Unterschied. Mit dem 
Vorschlag der Z-Diode vernichtet man also exakt die wertvolle Energie 
die man mit dem Rest der Schaltung mühsam vesucht hat einzusparen.

Jeder kann das halten wie er will. Ich würde diesen LED-Treiber nicht 
als Ersatz für einen Lowcurrent Highefficiency Stepup benutzen.

Gruß Hagen

von Gerd (Gast)


Lesenswert?

Wie siehts mit der Laufzeit aus wenn man einen Supercap/Goldcap (50F) 
anstelle des Akkus verwendet?

von Benedikt K. (benedikt)


Lesenswert?

Ich überlege gerade es mal mit 2x 1,2V NiMH Akkus zu versuchen. Es wird 
zwar vermutlich etwas knapp (grüne LEDs: typ 2,2V), könnte aber 
funktionieren.
Das größte Problem dürfte sein, dass die Helligkeit stark von der 
Spannung abhängt. Beim Goldcap dürfte das noch extremer sein, denn NiMH 
haben eine vergleichsweise flache Entladekurve.

Eventuell könnte der AVR auch die PWM Werte abhängig von der 
Akkuspannung kompensiert ausgeben ?

von Hagen R. (hagen)


Lesenswert?

>Ich überlege gerade es mal mit 2x 1,2V NiMH Akkus zu versuchen.

Na dann kannst du auch 3 solcher Akkus nehmen, das passt lässig in den 
Deckel rein. Mein Batteriehalter (das güne Teil) war ursprünglich für 3 
AAAs gedacht. Die Platine selber ist ebenfalls so breit und lang wie 1x 
AAA.
Bei vollgeladenen Akkus wären das 4 Volt und 2.7 Volt bei fast 
entladenen Akkus. Dann geht das Ganze auch komplett ohne 
Spannungsregler, was weniger Verluste bedeutet. Das Problem düfte halt 
das Solarpanel sein. Meines hat einen Innenwiderstand von 3k, eine 
Überladung von NiMH Akkus ist damit ausgeschlossen da immer die Spannung 
des Solarpanels rapide einbricht. Mein Solarpanel lieferte bei voller 
Sonnenbestrahlung ~6 Volt, ohne Last. Mit Last dann 3.5 Volt bei ~10mA. 
Aber eben nur bei vollster Sonnenbestrahlung. Bei normalem Tageslicht in 
einem Wohnraum (also hinter Glasscheiben) sieht das schon wieder ganz 
anders aus. Dann fließen bei 1.35 Volt vollgeladenem AAA Akku nur noch 
200-280µA aus dem Solarpanel. Das nimmt dann zu wenn der Akku zb. nur 
noch 1.1 Volt Nennspanung liefert. Grundsätzlich ist die gemessene 
Spannung am Akku wenn er geladen wird immmer nur die aktuelle 
Akkuspannung. Nur über den Strom kann man den Ladevorgang ausmessen. Der 
hohe Innenwiderstand des Solapanels sollte also sicherstellen das der 
Akku nicht leiden muß.

>Eventuell könnte der AVR auch die PWM Werte abhängig von der
>Akkuspannung kompensiert ausgeben ?

Würde ich anders machen, bzw. das ist der letzte Feinschliff an diesem 
Projekt der noch fehlt. Erstmal folgt jetzt ein Dauertest bei dem ich 
alle 7 Tage das Teil ausmesse. Danach kommt die letzte Änderung und die 
ist folgende:

Beim Tag/Nachtwechsel wird der Akustand der letzten Messung mit dem 
aktuellen verglichen. Ist der aktuelle Akkustand kleiner als der des 
Vortages wird ein Zähler inkrementiert ansonsten der Zähler 
dekrementiert.  Dieser Zähler ist in der Nacht ein Limit der 
Schnelligkeit wie oft die Glühwürmchen blinken dürfen. Im Grunde ist 
dieser Zähler schon vorhanden, nämlich Hungry_Threshold. Exakt so würde 
dieser 2. Zähler arbeiten nur eben das er das zeitliche Limit darstellt 
was die Glühwürmchen abwarten müssen bis sie wieder leuchten dürfen.
Somit stellt sich das Leuchten der Glüwürmchen Nachts auf einen Wert ein 
der direkt zur gesammelten Energie am Tag proportional ist. Dabei wird 
auch zwischen den Jahreszeiten oder der örtlichen Position (Lichtmenge) 
des Glases ünterschieden. Es entsteht eine Energiebilanz die ausgewogen 
ist, nur die Energie wird verbraucht die per Solarpanel erbracht wurde.

>Wie siehts mit der Laufzeit aus wenn man einen Supercap/Goldcap (50F)
>anstelle des Akkus verwendet?

Habe ich mal durchgerechnet, geht nicht, bzw. zu teuer. Die Entscheidung 
auf AAA Akkus fiel auf Grund ihres Preise, Bechaffbarkeit, 
Unempfindlichkeit und nicht zuletzt weil ich auch ein Ladegerät für die 
Teile habe ;)
Bei GoldCaps muss man auf den Innenwiderstand achten und die maximale 
Ladespannung. Besser wären dann diese sogenannten SuperCaps, allerdings 
reichen 50F nicht aus. Man kann sich das leicht selber ausrechnen: alle 
15 Sekunden leuchtet ein Glühwürmchen für 1 Sekunde mit durchschnittlich 
2.5mA Stromverbrauch. 1/15s*2.5mA*360=60mAh Worstworstcase. Das wird mit 
SuperCaps einfach zu teuer besonders weil mit den Sanyo AAA NIMhLi Akkus 
eine bessere Alternative vorhanden ist.

Ich hatte aber auch kurzeitig diese Alternative in Betracht gezogen. Die 
Energieausbeute in Ratio zur Baugröße/Preis hats entschieden.

Gruß Hagen

von Hagen R. (hagen)


Lesenswert?

>Das größte Problem dürfte sein, dass die Helligkeit stark von der
>Spannung abhängt.

Die LED-Vorwiderstände nicht zu klein machen und die regeln dann den 
Strom und nicht die Spannung ! Ergo keinerlei Schwankungen, die aber 
auch garnicht stören würden, sondern ein Feature sind bei Glühwürmchen 
die ja sowieso mit ihrem chemischen Prozess Schwankungen in der 
Leuchtintensität erzeugen.
Bei Lowcurrent LEDs können diese Vorwiderstände sogar ziemlich groß 
sein. Denn je stärker die LEDs leuchten desto unrealistischer wird es im 
Vergleich zur Natur. Der PWM Dutycycle kann dann nicht mehr einen weiten 
Helligkeitsbereich abfahren und das bedeutet das die Waves sehr 
undifferenziert aufleuchten. Der Trick ist ja gerade das die LEDs quasi 
nur glimmen sollen damit es Nachts echt aussieht. Tagsüber bringt das 
leuchten garnichts und wird ja auch deaktiviert. Es ist schon doof wenn 
Nachts die halbe Fensterbank grün ausgeleuchtet wird, das schafft in der 
Natur kein Glühwürmchen, mal davon abgesehen das wir gerade im grünen 
Farbspektrum auch am empfindlichsten sind.

Über die Helligkeit oder deren Schwankungen würde ich mir die geringsten 
Sorgen machen ;)

Gruß Hagen

PS: als LEDs keine dieser Ultragrünen/TrueGreen oder sowas benutzen. Die 
normalen LEDs mit 2.2V haben exakt das gewünschte Farbspektrum das nach 
Neongrün aussieht. Übrigens gibts auch Leuchtkäfer die Karminrot, Orange 
und Türkis glühen ;)

von Marius S. (lupin) Benutzerseite


Lesenswert?

Hab nicht alles gelesen, aber das Gestrüpp in deinem Glas wird dir 
schnell eingehen. Wäre netter mit ner richtigen Bepflanzung im Glas :)

von Hagen R. (hagen)


Lesenswert?

Glaube ich nicht. 1000 Jahre später wird dieses Plastikimmitat immer 
noch exitieren und das Glas schon zu Milchglas korrodiert sein, der Akku 
samt Schaltung sich selber weggeätzt haben und das Solarpanel nur noch 
10mV bei Sonne liefern, eventuell sogar die LEDs schon von den 
Kupferlitzen abgefallen sein da mein Flußmittel sie abgeätzt hat ;)

Gruß Hagen

von Benedikt K. (benedikt)


Lesenswert?

Ich bine gerade am zusammenlöten der Schaltung. Allerding komme ich 
nicht so recht weiter:
- Mir ist nicht ganz klar, wie man die 12 LEDs verdrahten muss. Ich habe 
4 Ausgänge, wie schließt man da die 12 LEDs an ?
- Wie funktioniert das mit dem Bootloader, wo bzw. wie schließt man den 
an ?
- Kann es sein, dass im Schaltplan die Bezeichnungen von Batterie und 
Solarzelle etwas durcheinander sind ? Bzw. was ist BAT1+ und BAT2+, und 
wiso gibt es keine BAT- sondern nur SOL1- und SOL1- ?
- Sollte der Akku nicht eigentlich direkt an den Eingang der Stepups 
(also hinter die "Diode" ? So wie es momentan gezeichnet ist, ist der 
Akku direkt parallel zur Solarzelle und die "Diode" hat keinen Nutzen.

Ich habs gerade mal ausprobiert:
Grüne LEDs leuchten bereits bei 2V ordentlich hell.
Ich denke ich werde es einfach mal mit 2x 1,2V NiMH Akkus probieren. Ich 
habe noch eine 6V Solarzelle mit ein paar 10mA rumliegen, die ich vor 
Jahrzehnten mal gekauft habe.

von Hagen R. (hagen)


Lesenswert?

Erstmal muß ich mich entschuldigen, der Schaltplan war eigentich nur für 
mich gedacht und deshalb ist er so ein "Gewusst-wie-Ding".

1.) Falsch im Schaltplan sind PB3 und PB4, dieses sind in der Realität 
vertauscht. Das liegt daran das im Schaltplan ein ATTiny15 herhalten 
musste. Das macht aber nichts, wichtig ist die Pinzuordnung und da beide 
Pins nur den ADC1/ADC2 betreffen wird das in der Software schon richtig 
gemacht.


>- Mir ist nicht ganz klar, wie man die 12 LEDs verdrahten muss. Ich habe
>4 Ausgänge, wie schließt man da die 12 LEDs an ?

Ganz einfach. Nehme 2 LEDs und 2 Kupferlitzen. Am Ende dieser zwei 
Litzen nun eine der LEDs angelötet. In der Mitte der Litzen dannn die 2. 
LED aber antiparallel zur ersten. Als praktisch hat sich erwiesen mit 
einem Multimeter das auch LEDs ausmessen kann (sie glimmen dann leicht) 
zu arbeiten. So kannst du die antiparallele Polung der LEDs 
sicherstellen. Antiparallel bedeutet Anode der einen LED an Kathode der 
anderen LED und umgekerht. Nun verdrillst du nur noch die zwei Litzen 
und fertig hast du ein von sechs nötigen Leuchtmittel. Du baust das 6 
mal so auf und hast somit 12 LEDs verbaut.

Nun haben wir 4 Pins am AVR, sind mit LED? bezeichnet.
An PB0-PB1 eine dieser 2 fach LED Litzen, also an PB0 ein Ende und an 
PB1 das andere Ende. Es sieht am Ende so aus

PB0-PB1
PB0-PB2
PB0-PB5

PB1-PB2
PB1-PB5

PB2-PB5

Umsoriert sähe es so aus

PB0-PB1
PB1-PB2
PB2-PB5

PB0-PB2
PB5-PB5

PB0-PB5

es ist egal wie herum du die 2 Enden einer 2 fach LED Litze an die Pins 
anschließt, die 2 LEDs sind ja antiparallel verschaltet.

Zwischen einem jeden Pin-Paar, in allen möglichen Kombinationen aus 
PB0,PB1,PB2,PB5 befinden sich also 2 LEDs die antirallel geschaltet 
sind. Male dir mal 4 waagerechte Linien auf dem Papier auf, bennen sie 
PB0,PB1,PB2,PB5 und zeichne nun senkrecht alle 12 LEDs so ein das man 
jede einzeln ansteuern kann.

Die PWM geht nun so vor das sie 4 Rows abbildet. Jeweils Row für PB0, 
PB1,PB2,PB5. Die Row wird als Ausgang geschaltet und auf VCC gesetzt. 
Die zugehörigen Columns stellen dann alle restlichen 3 Pins dar.

Wennn Row PB0 auf Ausgang/VCC ist dann kann ein Strom fließenen zu den 
Pins PB1,PB2,PB5. Also 3 LEDs können gleichzeitig leuchten. In der 
Timer0 Overflow ISR wird also PB0 auf High Ausgang gesetzt und nun 
anhand der nötigen Dutycycle der 3 LEDs in Richtung PB1,PB2,PB5 die DDRB 
Bits berechnet. Soll die LED von PB0 nach PB1 also leuchten dann ist 
PB0=1 und PB1 als Ausgang mit GND Pegel. Soll die LED nach PB2 nicht 
leuchten dann wird im DDRB Register dieser Pin als Input ohne Pullup, 
ergo High-Z gesetzt. Somit besteht die Gesamt-PWM aus 4 Phasen. In jeder 
Phase wird die Timer0 Overflow ISR aufgerufen, also 4 mal für einen 
kompletten PWM Zyklus =122Hz effektiv. In diesen Phase wird nacheinander 
PORTB auf PB0,PB1,PB2 und PB5 High/Ausgang gesetzt, alle anderen Bits 
auf 0. Nun werden max. 3 DDRB Werte berechnet. Diese 3 Registerwerte 
bestimmen welche LED zu welchem OCR0A Wert zu leuchten hat indem über 
DDRB die Pins als Ausgang-Low/Eingang-HighZ gesetzt werden. Zu diesen 3 
DDRB Werten können maximal 3 OCR0A Werte enstehen die sortiert werden. 
Also angenommen LED0 hat Duty 100, LED1 hat 150, LED2 hat 50. Also alle 
3 LED dieser aktuellen Row sollen leuchten. Dann muß folgendes Muster 
erechnet werden. Zum Timerzeitpunkt 255-150 muß DDRB so gesetzt sein das 
LED1 auf Ausgang geschaltet wird. Bei Timerwert 255-100 die LED0 und 
LED1 auf Ausgang gesetzt, und bei 255-50 die LED0,LED1 und LED2 auf 
Ausgang gesetzt werden. Bei Timerwert 256 = Overflow greift die Overflow 
ISR, diese setzt DDRB erstmal auf 0 und dann den entsprechnenden neuen 
PORTB Wert für die nächste Row, hier also PB1.

Die Timer0 TOF ISR lädt also zu 3 FireFly Einträgen aus der Struktur 
Fireflies die Samples aus der zugeordneten Wave -> FireFly->wave_ptr. 
Das sind die OCR0A Werte = Dutycylce der LEDs. Danach lädt sie zur 
aktuellen PWM Phase (0,1,2,3) aus ddr_data[] den PORTB Wert und die 3 
möglichen DDRB Werte zu den LEDs an den Pins. Durch Umdefiniton dieser 
ddr_data[] Tabelle kann man also zu den FireFlys andere physikalische 
LEDs zuordnen. Nachdem die ISR diese Werte geladen hat werden diese 
Paare aus OCR0A/DDRB Wert nach deren OCR0A Werte absteigend sortiert. 
Danach negiert man die OCR0A Werte man rechnet also 255-x aus. Somit 
besteht die Dunkelphase einer LED mit Dutycylce 200 aus 255-200=55. Ab 
Timerwert 55 beginnnt die LED zu leuchten bis der Timer auf 256 
überläuft. Nach der Sortierung werden noch die mitsortierten DDRB Werte 
ver-odert. Dann noch diese 3 Wertpare in das array ocr_data[] 
gespeichert da diese in der Timer0 Output Compare Match ISR als Input 
dienen zum Setzen des nächsten OCR0A und aktuellem DDRB Wert. Damit 
benötigt die OC-ISR nur 18 Taktzyklen. Sie wird minimal 0 mal aufgerufen 
nämlich immer dann wenn keine der 3 LEDs leuchten sollen (wave_ptr = 
nil). Oder aber maximal wird diese OC-ISR 3 mal aufgerufen wenn nämlich 
alle 3 LEDs leuchten sollen und deren Dutycylce sich alle voneinander 
unterscheiden. Sollten also zb. 3 LEDs leuchten deren Duty ist aber 
identisch dann wird die OC-ISR nur einmal pro Timerdurchlauf aufgerufen. 
Die TOF-ISR benötigt die meiste Rechnenzeit, minimal 122 Takte, maximal 
185 Takte, jenachdem wieviele LEDs pro Zeile leuchten sollen. In 64*256 
Takten pro Timerdurchlauf werden so nur minimal 0.74% und maximal 1.45% 
an rechenzeit für diese ISRs verbraten. Dabei macht aber die TOF-ISR 
auch noch das Laden und Inkremetieren des FireFly->wave_ptr und 
überprüft ob dieser Zeiger FireFly->wave_end erreicht hat. Sobald alle 
12 LEDs aufgehört haben in ihrer Wave zu leuchten (wave_ptr=nil bei 
allen) wird in Flags das Bit FLAG_TIMER gelöscht. Ab diesem Moment wird 
der Timer0 samt ISRs deaktiviert und der AVR geht vom Idle-Sleep-Mode in 
den Power-Down-Sleep-Mode über, bis das/die nächste/n FireFly/s leuchten 
soll/en.
Die TOF ISR benötigt maximal 185 Takte. Das bedeutet bei Prescaler 64 
für Timer0 auch das sie quasi 3 Timerzyklen lang dauert. Und das 
bedeutet das der Dutycycle der LED nur von 0 bis 252 gehen kann. Deshalb 
werden die OCR0A Werte auch negiert. Die PWM beginnt also für alle LEDs 
bei OFF und schaltet dann bei 255-Dutycycle die LEDs erst ON. Somit kann 
der Dutycylce von 0=aus bis 252=hellstes Leuchten gehen. Da durch unser 
logaritmisches Sehen wir eh keinen Unterschied beim Leuchten einer LED 
mit Dutycylc 252 bis 255 sehen ist dieses Vorgehen akzeptabel. Wichtiger 
war mir das die kleinen Dutycycles bei 0 bis 128 ausgeprägt sind da das 
zarte Leuchten einer LED viel schwieriger zu bewerkstelligen ist. Und 
eben der Fakt das das komplette Wavebasierte Leuchten der LEDs samt 
Multiplexing etc. pp. voll in den ISRs im Hintergrund ablaufen kann. 
Nicht in einer schwer synchronsierbaren Main Funktion oder sonstwo, und 
das die Synchronistation beim Setzen neuer Waves in den FireFlies auch 
sauber ohne Störungen und Zeitverlust durch Sperrung per CLI()/SEI() 
Blöcke vonstatten geht. Achte mal drauf wie die Waves in 
update_fireflies() aktualisiert werden.
Man könnte die kompletten ersten drei Blöcke in der TOF-ISR entfernen 
und auf ein Array[12] of uint8_t ersetzen. Statt also mit Waves zu 
arbeiten würde man dann dort den Dutycycle der 12 LEDs eintragen. Und 
fertig wäre die effiziente PWM für 12 gemultiplexte LEDs an 4 Pins die 
nur 1.45% MCU Zeit benötigt, wahrscheinlich sogar weniger da nun das 
Laden der Wavesampoles usw. entfallen würde.

Ups, dieser Text ist eine längere Umschreibung der Funktionsweise als 
die Anzahl an Sourcezeilen die es dann real umsetzt in Hardware.

> Wie funktioniert das mit dem Bootloader, wo bzw. wie schließt man
>den an ?

PB2 ist der Bootloader Pin an diesen Pin direkt lötest du das 1-Wire 
RX/TX Kabel, hat 330k nach Vcc dran (denke das der Pullup sogar 
weggelasen werden könnte). Der Bootloader arbeitet im 1-Wire-RS232, 
siehe hier Beitrag "AVR-Bootloader mit Verschlüsselung"
Du nimmst eine RS232 Buchse und benutzt die Schaltung im 1-Wire.jpg. Am 
anderen Ende der PC auf dem AVRootloader.exe läuft.

Im ersten Step musst du per ISP den AVR einmalig mit 
\FireFly\HEX\AVRootloader.hex programmieren. Dann erstmal die 
PC-Software mit dem soeben programmierten AVR austesten, also eine 
Verbingung zum Bootloader herstellen und mal EEPROM/SRAM auslesen, 
verändern und zurückschreiben in den AVR und nochmal lesen zur 
Verfikation.
Wenn das alles geht nochmal per ISP ran und die Fuses setzen. Diesesmal 
RESET Pin als normalen Pin fusen und die Lockbits vorher setzen wenn 
gewünscht. Danach kannst du ISP vergessen und ablöten, geht eh nicht 
mehr. Du müsstest dann also schon im Highvoltage Modus den AVR 
zurücksetzen !!
Übrigens da wo bei mir im Borad die 4 LEDs drankommen, also PB0,PB1,PB2 
und PB5 liegen auch die ISP Pins MISO,MOSI,RESET,SCK.
Nun kannst du die \FireFly\HEX\FireFly.hex über den Bootloader flaschen. 
Ein RESET des AVRs ist danach nicht nötig da die Software im Power Down 
Modus den PB2 Pin auf PinChange überwacht. Sollte also die PC-Software 
versuchen mit dem Bootloader im AVR zu verbinden und der arbeitet gerade 
die FireFly Software ab und befindet sich im Power Down Modus dann 
schlägt die PB2 PinChange ISR zu und ruft direkt den Bootloader auf. 
Diesen kannst du auch fürs Debugging benutzen indem du über das SRAM HEX 
Window den SRAM des AVRs ausliest. Du kannst dir also globale SRAM 
Variablen definieren und dort deine Debugwerte reinschreiben. Im MAP 
File schaust du nach welche Adddresse sie belegen und kannst dann direkt 
in der PC-Software deren SRAM Inhalt auslesen.

>- Kann es sein, dass im Schaltplan die Bezeichnungen von Batterie und
>Solarzelle etwas durcheinander sind ? Bzw. was ist BAT1+ und BAT2+, und
>wiso gibt es keine BAT- sondern nur SOL1- und SOL1- ?

Jain ;) BAT1+ BAT2+ sind SMD Pads und die haben eine gewisse Größe. 
Schlußendlich also aus Layoutgründen so gemacht. Es ist ganz einfach: an 
BAT1+/BAT2+ das ist ein großes Pad kommt Akku+ und Solar+ dran. An 
SOL1-/SOL2-, ebenfalls ein gemeinsammes großes Pad kommt -Pol vom 
Solarpanel dran. Damit liegt dieser Pol an ADC2 und am Drain des 
MOSFETs.
-Pol des Akkus geht nach Masse, das ist das Via in der Mitte meines 
Boards. Exakt daran kommt auch noch Masse des Bootloader Kabels, benötgt 
also GND und PB2. Im Schematik befindet sich Masse da wo auch GND des 
MAX1724 ist. Habe ich nicht eingezeichnet sorry.

>- Sollte der Akku nicht eigentlich direkt an den Eingang der Stepups
>(also hinter die "Diode" ? So wie es momentan gezeichnet ist, ist der
>Akku direkt parallel zur Solarzelle und die "Diode" hat keinen Nutzen.

Der Akku liegt mit Pluspol wie auch das Solarpanel mit Pluspol am 
Eingang des Stepup, da wo der BAT/SHDN (Shutdown) Pin des MAX sind. Die 
Doppeldiode BAV70 liegt mit beiden Kathoden ebenfalls an dieser 
Versorgungsleitung, also sehr hochohmige Pullups für die beiden 
Transistoren T1/T3.

Wie gesagt das Schematik ist nicht so dolle, aber ich dachte mir das ich 
es trotzdem so veröffentliche statt mit dem Projekt hinterm Berg zu 
halten.

Gruß Hagen

von Hagen R. (hagen)


Lesenswert?

Du kannst den ganzen Quatsch mit der idealen Diaod auch weglassen und 
durch eine Schottkydiode ersetzen. Diese mit der Anode dann nach GND der 
der Schaltung. An Kathode kommt -Pol des Solarpanels und der geht auch 
an ADC2 des AVRs.

Beim Fusen bitte die interne PLL mit 8Mhz benutzen, also CDIV8 raus. Den 
Brownout deaktivieren da dieser zu viel Strom frisst und wir selber 
darauf achten das keine Tiefenentladung der Akkus erfolgt. Nicht WDTON 
aktivieren, wir wollen den Watchdog ja im Interrupt Modus benutzen, und 
ausschließlich nur in diesem Modus. Dann setzt du die Lockbitfuses wenn 
gewünscht, LPM/SPM muß noch ausführbar bleiben ! Wenn das alles geht als 
letzten und wirklich überprüften Schritt den RESET Pin als normalen Pin 
fusen. Ab diesem Moment kann man den AVR nur noch über Highvoltage 
zurücksetzen.

Gruß Hagen

von Hagen R. (hagen)


Lesenswert?

schau mal hier rein Beitrag "10 Duo LEDs mit ATTiny15 über 5 Pins steuern"
Das zeigt die Anschlußbelegung für 20 LEDs an 5 Pins.

y=x(x-1), wobei x Anzahl der Pins und y Anzahl der LED ist.

Gruß Hagen

von Benedikt K. (benedikt)


Lesenswert?

Danke für die Erklärung. Ich habe gemerkt, dass die meisten Antworten 
auf meine Fragen irgendwo in deinen Texten versteckt drin stehen. Ich 
glaube ich sollte erstmal alles gründlich durchlesen. Aber so ist das 
halt, wenn man alles so schnell wie möglich am Laufen haben möchte...

Ich habe alles jetzt aufgebaut und die Software geflashed, nur es tut 
sich nichts. Fusebits passen, der Bootloader läuft.
Die Software musste ich etwas anpassen, wegen der geänderten 
Betriebsspannung.
Kommentiere ich die Zeile
if (flags & FLAG_ISNIGHT)
aus, dann sehe ich die LEDs "blinken", und zwar immer den ganze Schwarm, 
ziemlich genau im 17s Rhytmus.
Aus irgendeinem Grund wird also das ISNIGHT Flag nicht gesetzt.
In measure_isnight() setze ich daher das Flag immer (unabhängig von den 
ADC Werten, um das als Fehler auszuschließen). Es geht aber trotzdem 
nicht. Anscheinend wird measure_isnight() nie aufgerufen.

Was könnte ich falsch gemacht haben ?

von Hagen R. (hagen)


Lesenswert?

Also erstmal ist das doch schon super, ich meine für einen 
Übernachtaufbau ;)
Jetzt kommentierst du alle in "measure_isnight()" aus und lässt nur 
drinen

flags |= FLAG_ISNIGHT;

Somit ist der ganze ADC Kram deaktiviert und wir simulieren das es immer 
Nacht ist.

Nun conntectest du einmal mit  PC-Booloader, Button "Conect to device" 
und wenn Verbindung steht wieder ein "Disconnect". Damit machen wir 
quasi ein RESET per PC-Software. Das führt dazu das alle 12 FireFlies 
Einträge auf alle 0 stehen. Sie beginnen also alle mit einem Schlag zu 
leuchten. Schau dir an ob sie

1.) im alerersten gemeinsammen Leuchten mit unterschiedlichem Muster 
leuchten
2.) das sie nach dem ersten Leuchten erst einige Zeit später erneut 
leuchten
3.) das dann eine Phase eintritt mit längerer Dunkelheit aller LEDs
4.) danach dann vereinzelt die LEDs beginnen zu leuchten, so alle 15 
Sekunden

Wenn das geht nochmal mit PC-Software ein "Connect"/"Disconnect" machen 
und das Spiel nochmal von Vorne.

Gruß Hagen

PS: sorry, bin noch übernächtig, wer Tippfehler findet darf sie behalten

von Hagen R. (hagen)


Lesenswert?

Achso, ein Connect zum Bootloader ist immer erst dann möglich wenn das 
hauptprogram im Power Down Sleep Modus ist. In Main() der letzte IF 
Block. Solange also noch eine LED leuchtet muß der Bootloader 
(PC-Software) noch warten.

Gruß Hagen

von Benedikt K. (benedikt)


Lesenswert?

Ich habe jetzt
measure_isnight();
durch
flags |= FLAG_ISNIGHT;
ersetzt.
Ergebnis: Es passiert garnichts.
Nur wenn ich das Flag von Anfang an setze, blinken die LEDs.

von Hagen R. (hagen)


Lesenswert?

Sorry, du musst jetzt bis zu 12 Minuten warten bis was passiert ;)

Das FLAG_ISNIGHT wird erst gesetzt wenn der Measure Timer = 
MEASURE_INTERVAL abgelaufen ist, das sind momentan 6 Minuten.

Ändere in FireFly.h

#define MEASURE_INTERVAL  (uint16_t)(10)

um. Das wären dann 10*16ms an Interval, geht dann alles ein bischen 
schneller vom Ablauf her ;)

Dann solltest du aber trotzdem obige 4 Punkte beobachten können. Erst 
wenn wir das verifiziert haben machen wir Schritt für Schritt weiter.

Gruß Hagen

PS: die LEDs blinken nicht, sondern leuchten in einer Wave ;) hoffe ich 
doch.

von Hagen R. (hagen)


Lesenswert?

Benedikt, hast du Skype ?

von Benedikt K. (benedikt)


Lesenswert?

Dank, jetzt läufts ! Es lag an den 12 Minuten. 6 Minuten hatte ich immer 
gewartet, dass es 12 Minuten sein müssen, darauf wäre ich nie 
gekommen...

Ich werde jetzt die ADC Routine noch etwas anpassen, damit das ganze mit 
2,4V läuft.

von Hagen R. (hagen)


Lesenswert?

>Dank, jetzt läufts

Dh. du sieht nach einem "RESET" per PC-Software erstmal alle 12 LEDs 
leuchten, in einem jeweils anderen zufälligen Muster. Dann verlöschen 
diese im Leuchten so langsam bis keine merh leuchtet. Dann entsteht ein 
längere Phase, so bis 1 Minute wo alles dunkel bleibt und danach 
beginnen die LEDs so eine nach der anderen oder auch par in Gruppen zu 
leuchten. Wenn dies so ist ist erstmal alles richtig.

Du solltest jetzt dein Amperemeter mal benutzen, Meßbereich 50mA bis 
10µA. Während der Bootloader verbunden ist sollten es um die 20mA sein, 
während alle LEDs leuchten so um die 15mA maximal (hängt aber von deinen 
LEDs und Vorwiderständen ab). Und wenn dann alles dunkel ist sollte der 
Strombedarf (Power Down Mode) rapide sinken, < 20µA.

Nun machst du folgendes:

In measure_isnight() kopieren wir die Deklarationen von

uint16_t bat_volt;
uint16_t sol_volt;

raus und setzen sie als globale Variablen vor diese Funktion. Dann 
kompilisert du alles und öffnest die Datei FireFly.MAP. Suche in dieser 
die Einträge für bat_volt/sol_volt raus und merke dir deren 
SRAM-Speicheraddressen. Sollten so bei 0x00CC liegen.

Über die PC-Bootloader-Software das HEX flashen und dann kannst du auf 
der "SRAM Content" Page mit "Read from Device" Button den SRAM Inhalt 
des AUVs auslesen. An der Speicheraddressee 0x00CC oä. stehen dann die 
bat_volt und sol_volt.

Du kannst auch mal den EEPROM mehrmals auslesen. Du solltest dann sehen 
das sich die ersten 4 Bytes ständig verändern. Das ist der gespeicherte 
Startwert des LFSR-Zufallsgenerators. Diese dürfen niemals auf 
0x00,0x00,0x00,0x00 stehen !

Nun stellt sich die Frage: Welche Spannungen wirst du erwarten am 
ADC3/ADC2 ?

Bei 2 AAA NiMH Akkus sind das maximal 1.35*2 = 2.7 Volt. Das wäre zu 
hoch für die ARef=2.56V. Du solltest also auf ARef = VCC gehen aber das 
ist ein Problem da du ja keinen Spanungsregler drinnen hast. Du kannst 
nicht VCC messen mit VCC als ARef.

Ergo must du in deinem Falle für das Messen der Akkuspannung einen 
Spannungsteiler benutzen 1/2 und dann denoch mit 2.56V ARef messen, die 
sind dann ja ein stabislisierter absoluter Bezugspunkt zu deiner 
veränderlichen Vcc=Akku.

Problematisch wird das Ausmessen des Solarpanels werden. Falls du die 
Idela Diode aufgebaut hast haben wir ein Problem mit dem Messen per ADC. 
Denn ein Spannungsteiler müsste vom 
ADC->Widerstand->SolarPanelMinusPol->Widerstand->GND gehen. Der 
Widerstand von Solar- nach GND würde aber unsere Diode überbrücken, das 
ist schlecht.

Also müssen wir das anders machen bei deinem Aufbau. Das Solarpanel ist 
mit Plus an Akku+=ADC3 und mit Minus an ADC2. Das habe ich absichtlich 
so gemacht. Denn du kannst die Solarpanel Spannung nun per 
differentiellem Messen über ADC3-ADC2 versuchen auszumessen. Wichtig ist 
dabei ja nur der Fall das diese Spannnung wenige Millivolt betragen 
sollte für die Erkennung der Nacht. Sollte das Solarpanel tagsüber mehr 
als 2.56V ARef/2 liefern so wird der gemessene ADC Wert saturieren auf 
0x03FF.

Deshalb empfehle ich dir den Trick mit dem Auslesen des SRAM per 
Bootloader damit du nachschauen kannst ob die Messwerte des ADC auch 
stimmig sind.

Gruß Hagen

von Hagen R. (hagen)


Lesenswert?

>Dank, jetzt läufts ! Es lag an den 12 Minuten. 6 Minuten hatte ich immer
>gewartet, dass es 12 Minuten sein müssen, darauf wäre ich nie
>gekommen...

sein können. Minimal sind es 6 Minuten maximal 12 Minuten - x 
Millisekunden*16. Zuzüglich die Schwankungen in der Ungenauigkeit des 
WDT-Oszillators und die können schonmal 25% betragen.

Du musst dann noch das #define BATTERY_OK an deinen Aufbau anpassen. Und 
eventuell die Abfrage

if ((sol_volt > bat_volt) && (sol_volt >= BATTERY_OK)) flags |= 
FLAG_ISNIGHT;

abändern, da du ja nicht mehr über das Solarpanel die Akkuspannung 
indirekt messen kannst. Es sollte dann eher so aussehen bei dir


if ((bat_volt >= BATTERY_OK) && (sol_volt < par Millivolt)) flags |= 
FLAG_ISNIGHT;

Mache deinen Spannungsteiler hochohmig um Strom zu sparen.

Gruß Hagen

von Benedikt K. (benedikt)


Lesenswert?

Nochmals danke für die Hilfe !
Ich habe das ganze jetzt mit 2x NiMH Akkus am laufen. Die Vorwiderstände 
habe ich weggelassen, da die Ports des AVRs bei niedrigen 
Betriebsspannungen relativ hohe Innenwiderstände haben (ein paar 10 
Ohm). Bis hinunter zu 2V kann man die LEDs noch deutlich glimmen sehen. 
Bei 2,4V zieht eine aktive LED etwa 1mA, was optimal ist.
Der Ruhestromverbrauch liegt bei 3µA +/- ein paar µA Messfehler. Also 
nahezu unmessbar und warscheinlich geringer als die Selbstentladung von 
den billigen Akkus die ich verbaut habe.
Die Messung der Akkuspannung habe ich über einen kleinen Trick erledigt 
und so sogar noch einen Pin eingespart: Ich verwende Vcc als ADC 
Referenz und messe die interne Referenzspannung.

Jetzt kommt der für mich schwierige Teil: Grünzeug besorgen und das 
ganze optisch schön zusammenbauen...

von Hagen R. (hagen)


Lesenswert?

>Der Ruhestromverbrauch liegt bei 3µA +/- ein paar µA Messfehler. Also
>nahezu unmessbar und warscheinlich geringer als die Selbstentladung von
>den billigen Akkus die ich verbaut habe.

Dachte ich mir schon. Ich habe nämlich zu voreilig bei meinem Board 
vergessen das ich auch mal den Strom des AVR nach dem Stepup messen 
möchte mit vorzusehen. Da mein Stepup nicht ideal dimensioniert ist, 
sprich keine Low ESR Kondensatoren und die Spule wohl eher ne Drosssel 
ist komme ich auf 22µA. 22µA / (3.1V Vout/1.35V Vin/0.8 Effizienz) = 
~7.5µA - 1.5µA IQ Stepup = 6µA des AVRs. Das kann aber nicht stimmen da 
laut meiner Rechnerei er auf unter 3µA kommen sollte. Sprich mein Stepup 
benötigt 3µA mehr an Power auf Grund der falschen Dimensionierung. Mein 
Multimeter hat als unterste Meßbereiche 200µA und 20µA.

>warscheinlich geringer als die Selbstentladung von den billigen Akkus die
>ich verbaut habe

Ich werde demnächst auf die neuen Sanyo Teile umrüsten.

>Die Messung der Akkuspannung habe ich über einen kleinen Trick erledigt
>und so sogar noch einen Pin eingespart: Ich verwende Vcc als ADC
>Referenz und messe die interne Referenzspannung.

Super Idee muß ich mir merken. Mit dem zusätzlichen freien Pin kannst du 
ja 5 LED Ausgänge machen, somit wären mit der gleichen Methode 20 LEDs 
an 10 Strippen möglich.

Wie kommen die Waves rüber ? Ich habe bisher noch nicht soviel Zeit 
gehabt meine Wave.dat besser zu optimieren. Die kleinen Helligkeiten in 
der PWM kommen bei mir zu hell rüber, undifferenziert, eben zu kleine 
Vorwiderstände verbaut.

Hast du den 330k Pullup an PB2 verbaut für den Bootloader ? Der könnte 
eventuell weggelassen werden.

Ähm, da fällt mir auf: du misst aber am Solarpanel per ADC immer noch im 
Single Ended Modus bei 2.56 VRef ? Das bedeutet das bei voll geladenen 
Akkus = 2.7V schon bei 2.56V der ADC saturiert. Ergibt 2.7V - 2.56V = 
140mV die du schon als Nacht-Spannung am Solarpanel erkennst. Das wäre 
bei mir noch regnerischer Tag.

Eventuell wäre es also besser die Schaltung anderst aufzubauen.
Solarpanel- an Masse, Solarpanel+ and Schottk Anode und Kathode an Vcc. 
ADC misst nun an Solarpanel+/Anode Schottkydiode. Dann kannst du wieder 
ohne Probleme mit Single Ended ADC und VRef 2.56V messen, sogar 1.1V 
VRef um die Auflösung bei kleinen Spannnng am Solarpanel = Nachts, zu 
erhöhen.

Alles in Allem dürfte dein Aufbau sogar noch eleganter sein, da weniger 
komplex. Wenn ich das richtig verstanden habe wäre es ganz vereinfacht 
so:

- 2x 1.2V NiMh Akkus in Reihe
- Parallel dazu Solarpanel mit - an Masse und + an Schottky Diode Anode 
und deren Kathode an VCC.
- parallel dazu AVR
- Ein ADC vom AVR geht zwischen Solarpanel+ und Anode Schottky Diode
- LEDs direkt ohne Vorwiderstände an AVR, 5 Pins für 20 LEDs wären damit 
verfügbar

Gruß Hagen

von Fabian B. (fabs)


Lesenswert?

sagt mal, wo habt ihr eure Solarpanels denn her gehabt? Einfach ne 
Gartenleuchte geschlachtet (so was: 
http://www.pollin.de/shop/shop.php?cf=detail.php&pg=NQ==&a=MTM4ODY0OTk= 
?) oder gibts die irgendwo direkt?

Gruß
Fabian

von Hagen R. (hagen)


Lesenswert?

Mein Schwiegervater hat mir eines zum Schlachten geschenkt. Ist älteres 
Modell und neuere dürften wohl besser sein.

Gruß Hagen

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Hi.

Echt ein schönes und lustiges Projekt!

Ich hab letzte Woche mein altes Händi geschlachtet, und der Li-Pol Akku 
bietet sich dafür an. Liefert 4 Volt und ist nur 7mm dick.

Hab etwas an dem Code rumgebastelt, um das in den ATtiny25 
reinzubekommen. Aber jetzt geht's und ich hab's jezt auf genau 2048 
Bytes runter schwitz . Natürlich ohne Bootloader und nur mit avr-gcc 
3.4.6.

Momentan ist ja Glühwurm-Zeit, und ich hab die Tierchen neulich auf ner 
Nachtwanderung beobachten dürfen, wirklich beeindruckend wenn die in 
grösseren Mengen auftreten! Allerdings leuchten die recht entspannt und 
ausdauernd und sind kaum hektisch am blinken -- ok, kommt vielleicht 
noch wenns mit dem Poppen losgeht...

@Hagen:

Gibt's da noch Optimierungspotential? Ich würd gerne 11 LEDs 
anschliessen und die eine, die nicht antiparallel ist, zur 
Helligkeitsmessung nehmen. Vom Prinzip her geht das, hab das schon mal 
gemacht. Allerdings braucht man da einiges an Code (Input-Capture).

Was ich bisher optimiert hab ist:

-- TIM0_OVF_vect: Laden von _a, _b und _c in eine Funktion ausgelagert
-- Zeug für Bootloader-Support entfernt
-- Kleinigkeiten, um GCC bei der CSE-Optimierung zu helfen.
-- Sortierung von _b gegen _c in eigener Funktion

Dann, soweit ich sehen kann, können alle Daten im RAM ebensogut 
uninitialisiert sein nach RESET? Hab mal die .init4 rausgekickt 
(clear-bss + copy-data). Das funzt genauso mit anderem Startmuster und 
würd nochmal satte 40 Bytes bringen!

von Hagen R. (hagen)


Lesenswert?

An den Waves, den leuchtmustern, muß noch verbessert werden. Dazu ist ja 
der beigelegte Waveeditor von mir auch da. Bisher bin ich noch im 
Langzeittest, zwecks Energieverbrauch und diesen ausgewogener 
hinzubekommen.

>>-- TIM0_OVF_vect: Laden von _a, _b und _c in eine Funktion ausgelagert

Hat das was gebracht ? Du musst auch immer darauf achten das die maximal 
nötige Anzahl an Takten dabei nicht größer 192 wird. Ansonsten benötigt 
die TOV ISR nämlich nicht mehr 3 sondern zb. 4 Timerzyklen und dann darf 
der höchste PWM Wert in den Waves 251 nicht überschreiten.

>>-- Sortierung von _b gegen _c in eigener Funktion

Wieviel hat es eingespart ? FLASH zu Taktzyklen ?
Es sind 3 Elemente zu sortieren.

[asm]
// now sort each pair of DDRB/OCR0A values descending to OCR0A value == 
PWM dutycycle for each LED
        cp      _b_ocr, _c_ocr
        brsh    50f
        movw    _y, _b
        movw    _b, _c
        movw    _c, _y
50:     cp      _a_ocr, _b_ocr
        brsh    51f
        movw    _y, _a
        movw    _a, _b
        movw    _b, _y
        cp      _b_ocr, _c_ocr
        brsh    51f
        movw    _y, _b
        movw    _b, _c
        movw    _c, _y
51:
[/asm]

Es sind maximal 3 Vergleiche auszuführen und in 50% der Fälle werden 
tatsächlich nur 2 der obigen Vergleiche real durchgeführt. Pro Vergleich 
fallen 3 Takte, bzw. 6 Takte an und benötigt 10 Bytes FLASH. Lagert man 
dies in Funktionen aus so gewinnt man wirklich nur marginal an FLASH 
Speicher erhöht aber überproportional die Anzahl der nötogen Takte, 
wegens rcall/ret Opcodes und verbraucht mehr Stack.

Zeig doch mal deinen Source damit man das besser beurteilen kann, aber 
aus meiner Sicht wäre das die letzte Stelle an der ich irgendwas 
optimieren würde, da der Gewinn einfach nicht den Aufwand rechtfertig.

Da ist die Optimierung das Laden der PWM Dutycylce für a,b,c am Anfang 
dieser ISR wirklich lohnenswerter.

>>Gibt's da noch Optimierungspotential?

Wenig. Man kann immer noch was optimieren, allerdings bin ich nicht der 
Typ von Programnmierer der Stunden damit verbringt um schlußendlich das 
letzte 0.1% an besseren Code noch rauszuquetschen. Der Source dürfte für 
ein AVR GCC C Projekt schon ziemlich kompakt sein. Ich stand eben auch 
vor der Entscheidung den Source noch nachvollziehbar zu halten. Man 
könnte so einige C Funktionen noch nach Assembler portieren, meistens 
gewinnt man so nach meiner Erfahrung bis zu 50% an FLASH und es wird 
auch noch effizienter.
2k FLASH sind halt ziemlich schnell verbraucht wenn man in C 
programmiert.

>>Ich würd gerne 11 LEDs
>>anschliessen und die eine, die nicht antiparallel ist, zur
>>Helligkeitsmessung nehmen.

Ich kenne deinen konkreten Aufbau nicht. Du kannst erstmal nichwas an 
der HW verbesseren (habe ich schon getestet).

Man kann einen ADC Pin einsparen und hätte somit noch einen freien Pin 
zur Verfügung. Das geht so:
Wir benötigen nur einen ADC Eingang der die Spannung am Solarpanel 
misst. Damit hast du deine Tag/Nacht==Helligkeitserkennung drinnen. Das 
Messen der AKKU Spannung wird geändert und erfolgt gegen die interne 
AREF von 2.56V/1.1V. Statt also mit einem eigenen ADC Pin zum AKKU 
dessen SPannung zu messen, mesen wir VCC gegen AREF, denn du arbeitest 
ja ohne Stepup Wandler direkt den AKKU am VCC Pin, richtig ?

Man könnte aber auch die Messung des Solarpanels noch wegoptimieren. 
Dann so wie du es vorschlägst über die LEDs selber. Dabei ist es egal ob 
die LEDs single oder double-antiparellel angeschlossen sind, denn man 
misst dabei ja die Kapazitive Ladungsmenge der LEDs um die Helligkeit zu 
ermitteln. Dürfte also auch mit antiparelle verschalteten LEDs gehen.

Allerdings würde ich halt die Mehtode des Solarpanels benutzen, dürfte 
weit exakter sein.

>Dann, soweit ich sehen kann, können alle Daten im RAM ebensogut
>uninitialisiert sein nach RESET?

Ja das geht schon und ich habe bei den Datenstrukturen/Register 
Belegungen/Initialisierung exakt darauf geachte das es uninitialisiert 
sein könnte. Allerdings habe ich das Linkerskript nicht dahingehend 
angepasst, einfach weil es dann für unerfahrene Leute nicht mehr 
verständlich wäre.

Es macht also aus Sicht des programablaufes nur den Unterschied aus das 
dann die Fireflys quasi schon zufällig initialisiert wären, und das 
beeinflusst nur das Delay der erste Dunkelphasen der Glühwürmchen, mehr 
nicht.

>Momentan ist ja Glühwurm-Zeit, und ich hab die Tierchen neulich auf ner
>Nachtwanderung beobachten dürfen, wirklich beeindruckend wenn die in
>grösseren Mengen auftreten! Allerdings leuchten die recht entspannt und
>ausdauernd und sind kaum hektisch am blinken -- ok, kommt vielleicht
>noch wenns mit dem Poppen losgeht...

Nee leider nicht. Wie üblich finde ich es bei solchen Projekten eben 
auch spannend mich mit der Materie drumherum intensiv zu befassen (plane 
sogar meinen Vietnamurlaub eventl. neu um die nur dort existierenden 
roten Glühkäfer zu sehen :) Ich habe also auch im WEB intensiv 
recherchiert um das Leuchtverhalten der Simulation an die Realität 
anpassen zu können. Das zu planen/herauszufinden hat übrigens die meiste 
Zeit gekostet ;)
Nungut, ich selber bin mit der Simulation auch unzufrieden. Die Waves 
müssen länger und ruhiger leuchten, was aber über den Waveeditor ja 
leicht anpassbar ist.

In der Fortpflanzungszeit verändert sich das Leuchtverhalten nur 
unmerklich. In der Natur ist es so das eine Gruppe von Männchen um 
ein/zwei Weibchens buhlen muß. Dabei sind die Weibchen defakto die 
Auslöser der Leuchtmuster, dh. die Männchen antworten im Grunde als 
Gruppe (am Anfang unsynchronisiert bishin zu vollständigen 
Synchronisation) auf die Weibchen. Das ist ein wesentlicher Unterschied 
zu meiner Simulation.
Ein weiterer Unterscheid ist die Anzahl, mit 12 LEDs ist man im Grunde 
schon unrealistisch beschränkt.

Da ich nun schon drei Aufträge aus meiner Familie habe für einen Nachbau 
arbeite ich nebenbei an einer neuen Version. Diese wird einfacher 
aufgebaut sein und mit 20 LEDs funktionieren. Der Aufbau ist sehr 
simpel, ein Solarpanel das mehr Spannung liefert (5V-6V) wird mit 
Pluspol direkt an einen ADC Pin des AVRs angeschlossen. An VCC kommt ein 
3.7V LiPo Akku ohne jedweige Schutz/Ladeelektronik. Über den AVR Pin und 
die Software im AVR wird der Akku dann vom Solarpanel Pluspol -> AVR ADC 
Pin -> nach VCC -> Akku aufgeladen. Wenn man bestimmte Kriterien 
beachtet so geht das hervoragend und erste Langzeittest laufen schon. 
Dh. der AVR stellt sowas wie ein Solar-LiPo-Laderegler dar. An die 
restlichen Pins dann die 20 LEDs im Charlieplexing. Somit kein Stepup, 
keine ideale Diode, keine Shottkydiode mehr.

Übrigens denke ich das du deinen zeitlichen Aufwand enorm reduzieren 
könntest wenn du 20 Cent mehr investieren würdest, nämlich in einen 
ATTiny45V statt einem 25'er. Das beseitigt all deine Problem mit dem 
geringsten Aufwand ;) (ich weiß das man als Hobbybastler immer das 
verbauen möchte was man da hat, aber in einem solchen Fall denke ich 
pragmatisch).

Gruß Hagen

von Hagen R. (hagen)


Lesenswert?

Achso, du könntest auch die Wave[] kürzer machen. Statt mit 32 Waves zu 
arbeiten zb. nur mit 16 Waves. Das spart dann schonmal in Wave_Data[] 
exakt 96 Bytes FLASH. Dann noch Wave[] selber verkürzen. Starte einfach 
mal im Ordner \Windows\ die WaveEditor.exe und lade dort die Wave.dat. 
Du kannst dann mit der Maus oben im Waveeditor die Samples verschieben 
und somit kürzere Waves bzw. deren Anzahl verändern.

Es sollten dabei 8,16,32,64 Einzelwaves entstehen (links in der Listbox 
die Anzahl der Einträge). Sollte die Anzahl nicht eine Potenz von 2 sein 
so musst du im AVR Source in uprdate_fireflies() den Aufruf von lfsr(5) 
verändern. Bei 16 Waves dann lfsr(4) (4 Bits = 16). Bei zb. 24 Waves 
dann so: lfsr(4) + lfsr(3) == 2^4 + 2^3 = 16 + 8 = 24.

Gruß Hagen

von Hagen R. (hagen)


Lesenswert?

Und dann könnte man die Art der Erzeugung der Waves noch verändern. 
Statt nun  die Wave als Samples mit fester Samplingfrequenz (122Hz) 
abzuspeichern, speichert man quasi nur Stützstellen mit zb. 12Hz. Wenn 
man sich die Wave genau anschaut so erkennt man lange Phasen in denen 
die Samples identisch sind. Das lässt sich wegoptimieren indem man quasi 
einen Bresenham-Linien/Spline-Algorithmus anwendet. Bei langsammeren 
Wavemustern (was ja erwünscht ist) könnte man so mindestens 90% der Wave 
einsparen und hätte den gleichen Effekt wie jetzt. Mein Waveeditor 
arbeitet ja auch mit einem Splinealgorithmus. Allerdings wollte ich mir 
das zeitlich nicht antun ;)


Gruß hagen

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Hagen Re wrote:
> An den Waves, den leuchtmustern, muß noch verbessert werden. Dazu ist ja
> der beigelegte Waveeditor von mir auch da. Bisher bin ich noch im
> Langzeittest, zwecks Energieverbrauch und diesen ausgewogener
> hinzubekommen.
>
>>>-- TIM0_OVF_vect: Laden von _a, _b und _c in eine Funktion ausgelagert
>
> Hat das was gebracht ? Du musst auch immer darauf achten das die maximal
> nötige Anzahl an Takten dabei nicht größer 192 wird. Ansonsten benötigt
> die TOV ISR nämlich nicht mehr 3 sondern zb. 4 Timerzyklen und dann darf
> der höchste PWM Wert in den Waves 251 nicht überschreiten.
>

In wave[] ist der größte Wert 0xFA=250, also ist da noch einiges an 
Luft, was die Ticks bis >251 (also >=252) angeht. Und Werte auf 251 
kappen wäre auch nicht schlimm, weil man in dem PWM-Bereich eh kaum 
einen Unterschied wahrnehmen dürfte. Kritischer wäre, wenn kleine 
PWM-Werte nach unten beschränkt wären.

Das Laden in eine Func auszulagern dürfte nur unmerklich mehr an Strom 
kosten, bringt aber 52 Bytes -- n Haufen Holz, wenn man um jedes Byte 
kämpfen muss!

>>>-- Sortierung von _b gegen _c in eigener Funktion

Schon wieder raus, waren nur 4 Bytes. Wie gesagt, wenn's Program nicht 
passt, passt's eben nicht. Hab aber inzwischen den Code anderwärtig 
verändert.

> Da ist die Optimierung das Laden der PWM Dutycylce für a,b,c am Anfang
> dieser ISR wirklich lohnenswerter.

Sieht so aus jetzt:
1
load_fly:
2
        clr     _c_ocr
3
        ldd     _zl, y + WAVE_PTR                      // if fly->wave_ptr == 0 goto 1:  Fly don't ligthing
4
        ldd     _zh, y + WAVE_PTR+1
5
        sbiw    _zl, 0
6
        breq    1f
7
        ori     _flag, (1 << FLAG_WAVE)                // any fly is ligthning
8
        lpm     _c_ocr, z+                             // load next wave sample = fly->wave_ptr
9
        ldd     _c_ddr, y + WAVE_END                   // check if fly.wave_ptr >= fly.wave_end, finished lightning ?
10
        cp      _zl, _c_ddr
11
        ldd     _c_ddr, y + WAVE_END+1
12
        cpc     _zh, _c_ddr
13
        brne    0f
14
        clr     _zl                                    // if finish setup fly.wave_ptr = nil
15
        clr     _zh
16
0:      std     y + WAVE_PTR  , _zl
17
        std     y + WAVE_PTR+1, _zh
18
1:      adiw    _y, SIZEOF_FLY                         // increment _fly_ptr by 1 fly
19
        ret
20
21
...
22
        rcall   load_fly
23
        movw    _a, _c
24
        rcall   load_fly
25
        movw    _b, _c
26
        rcall   load_fly
27
...

>>>Gibt's da noch Optimierungspotential?
>
> Wenig. Man kann immer noch was optimieren, allerdings bin ich nicht der
> Typ von Programnmierer der Stunden damit verbringt um schlußendlich das
> letzte 0.1% an besseren Code noch rauszuquetschen. Der Source dürfte für
> ein AVR GCC C Projekt schon ziemlich kompakt sein. Ich stand eben auch
> vor der Entscheidung den Source noch nachvollziehbar zu halten. Man
> könnte so einige C Funktionen noch nach Assembler portieren, meistens
> gewinnt man so nach meiner Erfahrung bis zu 50% an FLASH und es wird
> auch noch effizienter.
> 2k FLASH sind halt ziemlich schnell verbraucht wenn man in C
> programmiert.

>
>>>Ich würd gerne 11 LEDs
>>>anschliessen und die eine, die nicht antiparallel ist, zur
>>>Helligkeitsmessung nehmen.
>
> Ich kenne deinen konkreten Aufbau nicht. Du kannst erstmal nichwas an
> der HW verbesseren (habe ich schon getestet).

Bei der nächsten Bestellung werd ich mit nen ATtiny44 oder so für das 
Projekt nehmen, da hat man ein paar Ports mehr zum Messen. Die Größe ist 
ja kein Thema, eher die Bauhöhe und die ist gleich, und Preis ist für 1 
Prokejt auch egal.

Prinzipiell geht's so:

LED-A = I/O-HIGH
LED-K = I/O-HighZ -> AnaComp -> InputCapture

Die entstehenden Ladungsträger bauen in der LED ein Potential auf, je 
heller desto schneller. Hatte mal den Versuch gestartet, die 
lichtabhängige Kapazität einer LED zu messen, aber das hat überhaupt 
nicht gefunzt (mit Kondensatoren ging das bis runter zu 10pF oder so).

Prinzip da:

http://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=160444

>
> Man kann einen ADC Pin einsparen und hätte somit noch einen freien Pin
> zur Verfügung. Das geht so:
> Wir benötigen nur einen ADC Eingang der die Spannung am Solarpanel
> misst. Damit hast du deine Tag/Nacht==Helligkeitserkennung drinnen. Das
> Messen der AKKU Spannung wird geändert und erfolgt gegen die interne
> AREF von 2.56V/1.1V. Statt also mit einem eigenen ADC Pin zum AKKU
> dessen SPannung zu messen, mesen wir VCC gegen AREF, denn du arbeitest
> ja ohne Stepup Wandler direkt den AKKU am VCC Pin, richtig ?

Ja, hab ich ohne StepUp geplant, d.h. ich bin an 4V. Allerdings sehe ich 
nicht, wie ich das mit AREF = 2.56 ausmessen kann. Bei einer VCC < 2.56 
Volt ist der LiPOL wohl tiefentladen? Und bei "interner" Messung kann 
ich kein Spannungsteiler anklemmen.

>
> Man könnte aber auch die Messung des Solarpanels noch wegoptimieren.
> Dann so wie du es vorschlägst über die LEDs selber. Dabei ist es egal ob
> die LEDs single oder double-antiparellel angeschlossen sind, denn man
> misst dabei ja die Kapazitive Ladungsmenge der LEDs um die Helligkeit zu
> ermitteln. Dürfte also auch mit antiparelle verschalteten LEDs gehen.

Wie gesagt, meine Versuche in die Richtung sind fehlgeschlagen. Bei 2 
antiparallelen LEDs wird nur ein kleiner Sprom im Kreis fliessen und 
sich kein Potential aufbauen können

>>Dann, soweit ich sehen kann, können alle Daten im RAM ebensogut
>>uninitialisiert sein nach RESET?
>
> Ja das geht schon und ich habe bei den Datenstrukturen/Register
> Belegungen/Initialisierung exakt darauf geachte das es uninitialisiert
> sein könnte. Allerdings habe ich das Linkerskript nicht dahingehend
> angepasst, einfach weil es dann für unerfahrene Leute nicht mehr
> verständlich wäre.

Hab ich so gemacht, geht bestimmt besser. Mit Linker-Skripten kenn ich 
mich nähmlich net aus...

noinit.ld:
1
SECTIONS
2
{
3
    .nirvana : { *(.init4) }
4
}

Beim Link-Aufruf (avr-gcc als Linker) gibt man zusätzlich als Optionen 
an
1
avr-gcc ... noinit.ld -Wl,--section-start,.nirvana=0xa00000

> Nungut, ich selber bin mit der Simulation auch unzufrieden. Die Waves
> müssen länger und ruhiger leuchten, was aber über den Waveeditor ja
> leicht anpassbar ist.

Am einfachsten wäre es doch, den gleichen Datensatz nicht nur 1x sondern 
zB 4x hintereinander zu nehmen. Aber seh noch nicht wo ich da was 
aufbohren müsste.

> Ein weiterer Unterscheid ist die Anzahl, mit 12 LEDs ist man im Grunde
> schon unrealistisch beschränkt.

Für ein Glas in das doch ok, da wäre der Effekt mir 1 LEDs bestimmt 
schon auch faszinierend für Deine Nichte.

> Übrigens denke ich das du deinen zeitlichen Aufwand enorm reduzieren
> könntest wenn du 20 Cent mehr investieren würdest, nämlich in einen
> ATTiny45V statt einem 25'er. Das beseitigt all deine Problem mit dem
> geringsten Aufwand ;) (ich weiß das man als Hobbybastler immer das
> verbauen möchte was man da hat, aber in einem solchen Fall denke ich
> pragmatisch).

Jo, bei der nächsten Bestellung. Hab den ATtiny25 eben hier und der ist 
bin-kompatibel zum 45. Aber 2K sind schon gut, weil dann würde das in 
nen ATtiny2313 passen, und der hat leider keinen großen Bruder.

> Achso, du könntest auch die Wave[] kürzer machen. Statt mit 32 Waves zu
> arbeiten zb. nur mit 16 Waves. Das spart dann schonmal in Wave_Data[]
> exakt 96 Bytes FLASH. Dann noch Wave[] selber verkürzen. Starte einfach
> mal im Ordner \Windows\ die WaveEditor.exe und lade dort die Wave.dat.
> Du kannst dann mit der Maus oben im Waveeditor die Samples verschieben
> und somit kürzere Waves bzw. deren Anzahl verändern.

Die Anzahl der Waves wollte ich eigentlich so lassen, auch wenn die 
mächtig Flash saugen.

Weiß ja auch net, wie Du an wave_data[] rangekommen bist. Wenn die 
Indizes durch 4 teilbar wären, könnte man statt der Adressen den durch 4 
geteilten Index in wave[] speichern und zur Laufzeit die Adresse 
ausrechnen. Geht bestimmt in deutlich weniger als 64 Bytes.

von Randy (Gast)


Lesenswert?

> Den MAX1724 habe ich bei MAXIM gesampelt, und ich bin mit dem Teil
> wirklich zufrieden und kann diesen speziell für solche Lowpower

gibts so einen ähnlichen Step-Up mit geringem Eigenverbrauch den man bei 
den "üblichen Hobbyversendern" kaufen kann? Sampeln geht ja nur bei 
einem Einzelstück.

Ohne die Datenblätter im Detail verglichen zu haben: Was müsste man 
ändern um den Code auf einen Tiny44 anzupassen? Dann wären ein paar mehr 
LEDs möglich ohne die wie-spare-ich-noch-einen-Pin Diskussionen. Und das 
bisschen Platz ist eigentlich auch egal.

Randy

von Hagen R. (hagen)


Lesenswert?

>Ohne die Datenblätter im Detail verglichen zu haben: Was müsste man
>ändern um den Code auf einen Tiny44 anzupassen?

Das müsste eigentlich sehr einfach möglich sein, da keine speziellen 
HW-Feasture benutzt wurden, ein besserer Timer reicht. Das ganze Projekt 
dürfte auf fast allen AVRs mit mäßigen Aufwand portierbar sein, solange 
sie einen ADC, WatchDog-ISR und Timer mit Timer Overflow ISR und Output 
Compare ISR haben.
Allerdings muß man den Pulsstrom der LEDs durch das vergrößerte 
Multiplexing bei mehr LEDs immer höher treiben und das geht auf Grund 
der max. Ströme des AVRs nicht. Somit wird man immer an eine Grenze 
stoßen ab der die LEDs in ihrer maximalen Gesamthelligkeit immer weiter 
abnehmen. Ich denke für das Glühwürmchenprojekt kann man noch einen Pin 
mehr benutzen um dann 20 LEDs statt 12 LEDs zu treiben. Bei noch einem 
Pin mehr wären das dann schon 30 LEDs und dann dürfte das 
Multiplexingtiming so schecht werden das die LEDs nicht mehr voll 
getrieben werden können.

Gruß Hagen

von Randy (Gast)


Lesenswert?

> Allerdings muß man den Pulsstrom der LEDs durch das vergrößerte
> Multiplexing bei mehr LEDs immer höher treiben und das geht auf Grund
> der max. Ströme des AVRs nicht.

Stimmt, daran hatte ich gar nicht gedacht. Hast du probiert ob das Glas 
mit mehr LEDs spürbar interessanter aussieht? Beim Tiny44 könnte man ja 
zwei getrennte Ketten machen.

Randy

von Hagen R. (hagen)


Lesenswert?

>mit mehr LEDs spürbar interessanter aussieht?

Nein nicht probiert. Je nach Betrachtungsabstand kann man ab 2 Meter eh 
nicht mehr exakt unterscheideen welche der 12 LEDs gerade geblinktert 
hat. Mehr LEDs würden also nur dann Sinn machen wenn man sie auch 
räumlich weiter voneinander entfernen möchte, sprich größerers Glas 
benutzen möchte. Dann leidet aber die Glaubwürdigkeit der Konstruktion, 
denn keiner fängt Glühwürmchen in einer Vitrine ;)

>Beim Tiny44 könnte man ja zwei getrennte Ketten machen.

Das wiederum ist möglich und man könnte die Software dahingehend 
anpassen.

Gruß Hagen

von Aike T. (biertrinker)


Lesenswert?

Hallo,

da ich gerade eine bestellung bei Reichelt fertig mache wollte ich mir 
auch mal eben die paar sachen für dieses nett Projektchen hier mit in 
den Korb werfen. 10µF Keramik-Kondensatoren habe ich noch rum liegen. 
Der Maxim sollte auch irgendwann kommen.
Nun muss ich noch die passende Drossel für L2 finden.
Welches model von Reichelt wäre denn da empfehlenswert und würde ins 
layout passen?
Ich hätte zwar noch eine sehr kleine Würth Speicherdrossel da, aber die 
hat nur 2,2µH. Das Datenblat bleibt da leider etwas schwammig, was die 
Induktivität angeht.
Ach ja, in Hagens Schaltplan stehen 150µH dran, das ist ja nun ganz 
ordendlich mehr. Was denn nun richtig?

viele Grüße

Aike

von Hagen R. (hagen)


Lesenswert?

5-10uH, besser sind 10uH mit 500mA Sättigungsstrom der Spule. Dann 
arbeitet der DC-Konverter schon bei 0.8V am Eingang.

Gruß Hagen

von Aike T. (biertrinker)


Lesenswert?

So, Drossel und leds sind da, 0603 sind doch recht klein ;-)
Mal sehen wie lange Maxim bruacht bis der 1724 da ist.

wenn ich erfolg habe oder auch nicht sag ich mal bescheid

vielen Dank

Aike

von Hagen R. (hagen)


Lesenswert?

Super, es scheint aber noch einen kleinen Bug in der Software zu geben. 
Die Art und Weise wie per ADC die Akku-Spannung und Solarzellen-Spannung 
gemessen wird muß ich nochmal umändern. Es scheint so das wenn der Akku 
schön voll ist, dann Nachts über die Schranke zum Einschalten des 
Blinkens der LEDs, also die Messung der Solarzellenspannung, 
fehlschlägt. Das führt dazu das mehrere Tage lang die LEDs nachts nicht 
leuchten wenn sie es eigentlich sollten. Nach par Tagen fängt sich dann 
die Software und das Projekt läuft anstandslos, bis zum nächsten 
"Aussetzer". Nungut, ich verkaufe es gerne als Feature, aber es ist ein 
Softwarefehler denn ich demnächst nochmal korregieren muß.

> 0603 sind doch recht klein ;-)

Jupp und dann noch 0.2er Kupferlitze dranlöten kann eine Herausforderung 
sein. Ich habe es meditativ gesehen und fast 5 Stunden für die 12 LEDs 
an 6 Strippen benötigt, und war dann kurz vorm Nirvana fertig ;)

> Mal sehen wie lange Maxim bruacht bis der 1724 da ist.

eine Woche. Ich habe noch in der selben Woche der Bestellung die 
Lieferung erhalten.

> So, Drossel...

Du redest immer von Drossel, meinst aber hoffentlich eine 
Speicherdrossel bzw. Induktor. Wichtig ist für den MAX1724
- Induktivität ca. 10µH mit 500mA Strombelastbarkeit, also 
Sättigungsstrom
- am Eingang und Ausgang nicht zu große Kondensatoren, Low-ESR 
selbstverständlich, ich habe X7R verbaut geht auch, sie sollten aber 
nicht mehr als 4.7µF haben, ich habe 1µF drinnen sekundär und 470nF 
primär weil dort ja auch der leistungsfähige Akku sitzt

Über die Vorgehensweise der ersten Test habe ich oben schon was 
geschrieben. Zuerst deaktiviert man in Software die ADC Messungen, also 
Spannungsüberwachung Akku und Solarpanel. Das Projekt wird also so 
laufen als wenn es permanent Nacht ist. Damit saubt man einen extern 
voll geladenen Akku beim ersten Langzeittest vollständig leer. Man misst 
dabei die Zeitspanne die dafür benötigt wird. Dann aktiviert man in 
Software die ADC Messungen, aber nur die Akku Überwachung. Nun wird das 
Projekt immer dann leuchten, egal ob Tag oder Nacht, wie der Akku im 
vorgesehen Spannungsbereich liegt. Nun misst man wieder die Zeitspanne 
bis der Akku aufgeladen ist. Als letztes dann auch die ADC Messung des 
Solarpanels aktivieren.

Gruß Hagen

von Aike T. (biertrinker)


Lesenswert?

Hallo,

so ein Bug ist natürlich nicht so schön, wie oft kommt der denn vor? Wie 
das mit dem messen der Solarspannung genau funktioniert muss ich mir 
nochmal genauer ansehen wenn ich das aufgebaut habe. Habe den Code auch 
noch nicht so genau gelesen, mache ich dann wenn ich auch mal nachmessen 
kann. Vielleicht kann ich dann ja auch selber was dran tun.

2 Stunden habe ich für die Leds nicht gebraucht, aber mir sind leider 5 
Stück Kaput gegangen jetzt habe ich noch genau 12 über für ein 
eventuelles 2. Glas für meine Freundin ;-) man muss die doch sehr 
vorsichtig behandeln.
Ich habe mir vorher die stellen an die ich die leds löten wollte mit nem 
großen Lötkolben mit 460° abisoliert und dann habe ich die dräte an 
diesen stellen verlötet und die Dräte dann verdrillt. Danach dann das 
Lötzin wieder weg machen, dann ist es nicht mehr so schwer die leds 
richtig zu positionieren.


> Du redest immer von Drossel, meinst aber hoffentlich eine
Speicherdrossel bzw. Induktor.

Ja, ich meine eine Speicherdrossel. Habe die L-PIS2408 von Reichelt 
genommen, die sollte gehen denke ich.

> am Eingang und Ausgang nicht zu große Kondensatoren, Low-ESR
> selbstverständlich, ich habe X7R verbaut geht auch, sie sollten aber
> nicht mehr als 4.7µF haben, ich habe 1µF drinnen sekundär und 470nF
> primär weil dort ja auch der leistungsfähige Akku sitzt

Nanu? Ich habe eigentlich vor 10µF X5R zu nehmen, die habe ich halt noch 
da. Ich hätte jetzt nicht unbedingt gedacht das da größere Kondensatoren 
schaden können. Was ist denn da der Grund für?

Deine Erläuterungen zur Inbetriebnahme hier im Thread habe ich schon 
aufmerksam gelesen, bin mal gespannt ob das alles auf anhieb klappt. Ich 
habe mir bei Pollin jetzt auch 3 Solarlampen und zwei von diesen neuen 
NiMhLi Akkus geordert, hast du da schon drauf umgerüstet?

viele Grüße

Aike

von Jochen M. (taschenbuch)


Lesenswert?

Wer Lust hat, kann sich ja mal diese Links ansehen. Auch die 
Google-BILDERsuche nach pummer brngt einiges zu diesem Thema.

In anderen Ländern existiert eine regelrechte und nicht kleine Szene, 
die sich ausgiebig mit diesen Dingen beschäftigt. Hier isn D ist mir das 
nicht bekannt, oder hat da jemand andere Infos?

Die Links bringen jede Menge Schaltungen und Anregungen, besonders auch 
Ladeschaltungen für Accus und Goldcaps:

http://www.solarbotics.net/
http://www.solarbotics.net/bestiary/1120_pummer_gal.html


Jochen Müller

von Hagen R. (hagen)


Lesenswert?

>so ein Bug ist natürlich nicht so schön, wie oft kommt der denn vor?

so 1-2 mal im Monat, dann für 2-3 Tage.

> Nanu? Ich habe eigentlich vor 10µF X5R zu nehmen, die habe ich halt noch
> da. Ich hätte jetzt nicht unbedingt gedacht das da größere Kondensatoren
> schaden können. Was ist denn da der Grund für?

Passt schon so. Viele denken mehr ist besser, stimmt aber nicht. Ein 
Stepup erzeugt Stromspitzen die ausgeglichen werden müssen. Dabei 
entscheidet primär die Kombination aus Input Kondensator + Spule + 
Output Kondensator über die Effizienz, Frequenz und max. Leistung des 
Stepups. Um mit dem MAX1724 bei möglichst kleinen Spannungen schon 
arbeiten zu können empfiehlt der Hersteller die Inuktivität ein bischen 
größer zu dimensionieren. Der AVR läuft schon ab 2.7V stabil und der 
Stepup sollte der 3V oder 3.3V Typ sein, selbst bei 300mV Ripple am 
Ausgang des Stepups also kein Problem. Die Größe der Kapazitäten hat nun 
einen entscheidenden Einfluß auf die Verluste die durch den Stepup 
entstehen. Auf Sekundärseite haben wir den Akku, meistens ein NiMH mit 
1200mAh und damit ein guter Energielieferant für einen Stepup. Wir 
können also die Eingangskapazität des Stepups kleiner halten und kommen 
so einfacher an Caps. mit kleinem ESR ran. Dieser ESR ist für die 
Verluste im Cap verantwortlich. Gleiches gilt auch für die Sekundärseite 
des Stepups.

>NiMhLi Akkus geordert, hast du da schon drauf umgerüstet?

Nein bisher nicht und es zeigt sich auch das bei meinem Aufbau der Akku 
ständig gut geladen ist. Das Problem ist halt das man über die 
Solarpanelspannng die Entscheidung trifft ob es Tag oder Nacht ist. 
Viele der besseren Gartenleuchten benutzen dafür einen Photowiderstand, 
die billigeren Leuchten werten ebenfalls das Solarpanel aus. Dies kann 
aber problematisch sein da auch Infrarotstrahlung eine Spannung im 
Solarpanel erzeugt. Dh. wenn es Nachts sehr dunkel ist aber auch sehr 
warm bzw. aufgeheizte Wände noch Wärme abgeben, dann liefert das 
Solarpanel zuviel Spannung und die Software kann die Nachtphase nicht 
als solches erkennen. Ich denke das dies auch der "Bug" in der Software 
ist. ZZ. verändere ich die Meßmethode für das Solarpanel und Akku und 
passe die Thresholds besser an. Man könnte die Schaltung auch umbauen 
und mit einem Photowiderstand + Spannungsteilerwiderstand erweitern, 
aber das wollte ich vermeiden um Strom zu sparen.

Gruß Hagen

von Aike T. (biertrinker)


Lesenswert?

Hallo mal wieder,

ich habe jetzt obwohl mir noch die Solarzelle, der richtige akku und der 
Max1724 fehlen mal einen kleinen Test gemacht.
Ich habe einen noch hier zu testzwecken rumliegenden TPS61200 genommen, 
den auf 3,0V eingestellt und an VCC und Masse gehängt.
Dann die Software angepasst so das immer Nacht ist.
Soweit so gut, nach 12 Minuten fangen die Leds an zu leuchten, sieht 
schon ganz nett aus.
Leider ist das leuchten noch viel zu dunkel, was wohl an den 
Vorwiederständen liegt, die ich verwendet habe. Hatte nurnoch 1k 
Widerstände da, das macht dann 1mA, die Leds würden aber 2 mA benötigen, 
sind ja sowiso nicht so sehr hell die Lowcurrent-Leds.
Daher muss es wirklich stockduster sein, damit man was sieht.
Naja, Habe gerade noch ein paar 472Ohm miniMelfs gefunden, mal sehen ob 
ich die irgendwie auf die Pads bekomme ;-)

Eine sache ist allerdings noch seltsam. Wenn ich den Programmier-Adapter 
anstöpsel dann ist sofort Ende mit leuchten. Auch die Stromaufnahme von 
4µA im Standby auf ca. 25µA.
Nach dem Programmieren steigt dann die Stromaufnahme auf irgendwas 
größer 1mA was das Multimeter dann nicht anzeigt.
Programmieradapter ab, reset und dann gehts los.
Dafür habe ich noch keine rechte Erklärung.

Auf jeden Fall schonmal ein sehr cooles Projekt!

viele Grüße

Aike

von Aike T. (biertrinker)


Lesenswert?

Kleiner Nachtrag,

hatte bei meinen Vorwiderständen natürlich total übersehen, das das ja 
ne Matrix ist. Habe jetzt auf 100Ohm reduziert, jetzt sind die Leds auch 
was heller.

von Hagen R. (hagen)


Lesenswert?

>Eine sache ist allerdings noch seltsam. Wenn ich den Programmier-Adapter
>anstöpsel dann ist sofort Ende mit leuchten. Auch die Stromaufnahme von
>4µA im Standby auf ca. 25µA.
>Nach dem Programmieren steigt dann die Stromaufnahme auf irgendwas
>größer 1mA was das Multimeter dann nicht anzeigt.
>Programmieradapter ab, reset und dann gehts los.
>Dafür habe ich noch keine rechte Erklärung.

1. Sobald der Adapter angeschlossen ist wird ein Strom für die RS232 
verbraucht.

2. die effektive Stromaufnahme kann also nur exakt ermittelt weren wenn 
der
Adapter nicht angeschlossen ist

> Habe jetzt auf 100Ohm reduziert...

könntest sie ohne Probleme noch weiter reduzieren.

Gruß Hagen

von Aike T. (biertrinker)


Lesenswert?

Hallo mal wieder,

leider bin ich immer noch nicht fertig, der Max1724 ist leider noch 
nicht da :-(
Dafür sind heute von Pollin die solar-Lampen gekommen.
So ne schöne Solarzelle wie bei dir ist da aber leider nicht drin, da 
sind einfach vier von diesen Streifen in den Deckel eingegossen. Habe 
gerade mal gemessen, in der prallen Sonne bringt die 2,5V und 50mA 
Kurzschlussstrom.
So muss ich dann mal schauen, wie ich die möglichst elegeant da raus 
sägen kann und hoffen, das das reicht.

viele Grüße

Aike

von Fabs (Gast)


Lesenswert?

Darum hatte ich auch mal gefragt wo's schöne Zellen gibt. Die meisten 
Solarlampen haben hab nur noch etwas lächerlich aussehende "Splitter" 
verbaut. Die schönste solche Zelle hab ich mal in so ner Leuchtkugel 
gefunden...nur leider funktionierte die Kugel noch und die Besitzer 
wollten sie nicht hergeben ;-). Da war die Zelle ca 5x5cm gross und vom 
aussehen her a-Si oder CIS Zelle (schwarz).

Gruß
Fabian

von Aike T. (biertrinker)


Lesenswert?

So, da bin ich mal wieder. Habe inzwischen Post von Maxim bekommen. 
Direkt von den Phillipinen. Habe den Max1724 direkt eingelötet.
Leider funktionert der nicht. Ich messe am Ausgang nur 0,8V.
Ich vermute mal, das das jetzt kein simples Standard-Problem ist was 
sich aus der Ferne diagnostizieren läst, oder?

von Hagen R. (hagen)


Lesenswert?

Richtig rum eingelötet ?

von Aike T. (biertrinker)


Lesenswert?

Das sollte man doch eigentlich nicht falsch rum einlöten können, auf 
einer seite fehlt doch der pin in der Mitte.

von Hagen R. (hagen)


Lesenswert?

Stimmt. Ich habe zuerst nur den Stepup aufgebaut, also ohne AVR. Diesen 
dann getestet und ging auf anhieb. Danach AVR drauf und programmiert.

Wenn es also bei dir nich geht dann vermute ich das deine "Drossel" + 
Kondensatoren nicht ganz passen, oder du hast nicht richtig verlötet.

>Ich messe am Ausgang nur 0,8V.

Wieviel Spannung hast du am Eingang des Stepups ? Es sollten erstmal 
mehr als 0,8V sein da ansonsten der Stepup nicht anschwingt. Wenn er 
erstmal läuft dann saugt er den Akku auch unter 0.8V leer, bei mir bis 
0.65V runter.

Gruß Hagen

von Aike T. (biertrinker)


Lesenswert?

Hagen Re wrote:
> Wenn es also bei dir nich geht dann vermute ich das deine "Drossel" +
> Kondensatoren nicht ganz passen, oder du hast nicht richtig verlötet.
Werde ich morgen nochmal gründlich prüfen. Vielleicht sitzt doch noch 
irgendwo ein Tropfen Lötzin. Induktivität und Kondensatoren sollten 
eigentlich passen. Aber wer weiß.

> Wieviel Spannung hast du am Eingang des Stepups ?

1,29V frisch von Akku.

viele Grüße

Aike

von Hagen R. (hagen)


Lesenswert?

>1,29V frisch von Akku

also damit läuft mein Stepup wunderbar.

Gruß Hagen

von Aike T. (biertrinker)


Lesenswert?

Meine Güte, wie früh bist du denn wach?

Nun gut, mein Stepup läuft jetzt auch, die Spule war an einer Seite wohl 
nicht richtig verlötet.
Leider funktioniert jetzt der µC nicht mehr, aber den Grund dafür finde 
ich hoffenlich noch. Der hat ja vorher mit externer Versorgung 
funktioniert.

von Hagen R. (hagen)


Lesenswert?

>Meine Güte, wie früh bist du denn wach?

Meine Güte, wie früh bist du denn noch wach? wäre die richtige Frage. 
Wenn es nach mir ginge würde ich am liebsten 24h pro Tag wach sein ;)

Ansonsten: du wirst das Ding schon zum Laufen bringen, toitoi.

Gruß Hagen

von Aike T. (biertrinker)


Lesenswert?

Oder auch so ;-)

Nun denn, ich will jetzt nicht mit allen Details rumnerven, aktueller 
Status ist das es jetzt läuft, der Tiny hat wohl was ab gekrigt und 
wurde nun ersetzt.
Ich muss jetzt mal ausgibig testen.

Vielen vielen Dank auf jeden Fall für dieses tolle Projekt und die viele 
Hilfe von dir!

Aike

von Aike T. (biertrinker)


Lesenswert?

Hallo doch nochmal,

ich habe mich jetzt zu den etwas interessanteren Problemen vor 
gearbeitet.
Also erstmal ein paar grundsätzliche Fragen damit ich weiß, das ich das 
alles richtig verstehe.
1. Wenn ich die Spannung der Solarzelle zwischen SOL- und BAT+ messe, 
dann werde ich max. eine Spannung knapp über der Batteriespannung messen 
können, also ca. 1,3V? Weil die Spannung der Solarzelle mit last 
einbricht.
2. Wenn ich mit im RAM die werte für sol_volt und bat_volt ansehe, dann 
sinkt der wert bei steigender Spannung der Solarzelle. Bis 
sol_volt=bat_volt ist?

Gut, so kann ich es jedenfalls nachvollziehen.

Dann also zum Problem. Das Programm wechselt offensichtlich nicht in den 
Nachtmodus. Wenn ich das Solarpannel umdrehe, dann habe ich im Speicher 
sowas stehen wie: e5 01 und für bat_volt f5 01. Also 485 zu 501.
Da scheint es mir auch logisch das sol_volt>bat_volt nicht erfüllt 
werden kann.

Wo ist also mein Fehler?

viele Grüße

Aike

von Hagen R. (hagen)


Lesenswert?

Mach mal

if (sol_volt >= bat_volt) &&

draus. Wir messen BAT+ minus Solarpanel Spannung. Wenn es Nacht ist 
liegt ja SOL- über die Diode an Akku-. Exakt an SOL- messen wir mit dem 
ADC. Bei Nacht degradiert das Solarpanel zu einem Widerstand, dh. an 
SOL- messen wir quasi die Akkuspannung abzüglich der minimalen 
Solarpanelspannung.

Du könntest, um den Source an dein Solarpanel anzupassen, es auch so 
abändern:

uint16_t sol_volt = ADC + x; // x für Spannung des Solarpanels bei 
Dunkelheit

Aber Recht hast du, denn an diesem Punkt vermute ich auch bei meinem 
Projekt noch eine Schwachstelle. Solarpanels sind halt nicht besonders 
gut als "Tag/Nacht" Sensor geeignet.

Gruß Hagen

Edit: aber Vorsicht mit dem Messen durch ein Multimeter. Die "ideale 
Diode" die SOL- von AKKU- trennt falls Solarspannung < Akkuspannung ist 
enorm hochohmig, ergo sehr empfindlich. Das Multimeter/Tastkopf Oszi 
beeinflusst diese Schaltung. Defakto kann man die korrekte Funktioon 
dieser Diode nur per Strommessung korrekt messen.

von Aike T. (biertrinker)


Lesenswert?

Hallo,

seltsames Problem. Ich habe jetzt mal Probehalber zum sol_volt wert 200 
hinzu addiert, damit komme ich einen bereich bei dem einfaches umdrehen 
des Panels dazu führt das ich einmal einen sol_volt Wert habe der 
deutlich über bat_volt liegt und einmal einen der deutlich darunter 
liegt. Ich habe mir jetzt mal alle wichtigen Werte ins SRAM geschrieben 
- auch ein flag das mit das ergebnis der If Abfrage ausgibt.
Aus den Werten im SRAM geht eindeutig hervor, das isnight gesetzt ist, 
aber nix passiert.
Schreibe ich allerdings als letzte Zeile in die funktion measure_isnight

flags |= FLAG_ISNIGHT

dann glimmen die Leds direkt los, so wie es am Anfang sein soll. Leider 
durchblicke ich den rest des Programms noch nicht so weit, das ich da 
einen Grund für erkennen könnte.

Weißt du noch Rat?

viele Grüße

Aike

von Hagen R. (hagen)


Lesenswert?

Jo, warte par Minuten ;) Der Test auf Nacht wird ja nur so ca. alle 6 
Minuten durchgeführt. Es kann dann noch weitere 6 Minuten dauern bis das 
System loslegt und blinkt. Ich habe dies absichtlioch so konstruiert da 
man so quasi einen "Lowpass Filter" erhält und das System nicht sofort 
jedesmal anfängt zu leuchten nur weil kurzzeitig eine Verdunklung der 
Solarzelle erfolgte. Und zusätzlich sparrt es Strom da der AVR nach dem 
ADC auslesen erstmal für 6 Minuten in den Powerdown geht.

Ansonsten wäre es angebracht wenn wir per Mail weiter machen. Denn dann 
kannst du mir auch entsprechende Source senden und ich schaue drüber.

Gruß Hagen

von Randy (Gast)


Lesenswert?

Hallo,

ich hab die sache jetzt mal nachgebaut, und - ta,ta - funktioniert 
nicht.
OK, woran könnte das liegen?
Per ISP hab ich versucht die Fuses richtig zu setzten... leider ist das 
evtl. nicht so übersichtlich dargestellt:

> Beim Fusen bitte die interne PLL mit 8Mhz benutzen, also CDIV8 raus. Den
> Brownout deaktivieren da dieser zu viel Strom frisst und wir selber
> darauf achten das keine Tiefenentladung der Akkus erfolgt. Nicht WDTON
> aktivieren, wir wollen den Watchdog ja im Interrupt Modus benutzen, und
> ausschließlich nur in diesem Modus. Dann setzt du die Lockbitfuses wenn
> gewünscht, LPM/SPM muß noch ausführbar bleiben ! Wenn das alles geht als
> letzten und wirklich überprüften Schritt den RESET Pin als normalen Pin
> fusen. Ab diesem Moment kann man den AVR nur noch über Highvoltage
> zurücksetzen.

Was ich ggü. default geändert habe:
- CkDIV8 deaktiviert
- SelfPrgGen aktiviert
- den Reset hab ich nicht deaktiviert, weil ich danach nicht mehr an die 
Fuses rankomme.
Ich hab einen Ponyprog-Screenshot angehänt.

Wenns nicht die Fuses sind:
Ich betreibe das Teil gerade im "Trockendock", d.h. ohne Soalrzelle und 
Akku, einfach mit 3,3V Betriebsspg. Um die "Akku-voll" und "Dunkel" 
Messung zu simulieren habe ich die Pins 2 und 3 auf 3,3V gehängt. Das 
sollte doch so korrekt sein?

Hat einer eine Idee woran es scheitern könnte?
Ich hab nach dem Einschalten durchaus 20 min gewartet, aber nix 
passiert. Die LEDs sind richtig verdrahtet, beim ISP-Programmieren sieht 
man sie blinken.
Die Software scheint auch zumindest irgendwas zu tun, zumindest haben 
die ersten 4 Bytes im EEPROM ihre Werte verändert (d.h. AVRrootloader 
geht, damit kann ich das EEPROM lesen), das kann eigentlich nur die 
uC-Software gemacht haben... (-> Startwert für das Rückgekoppelte 
Schieberegister neu geschrieben)

Was kann ich noch probieren?

Randy

von Randy (Gast)


Angehängte Dateien:

Lesenswert?

Natürleich den Screenshot vergessen

von Aike T. (biertrinker)


Lesenswert?

Hallo,

da Hagen im Moment nicht Antwortet, versuche ich mal zu helfen.

Kennst du den Fuses Calculator?

http://palmavr.sourceforge.net/cgi-bin/fc.cgi?P_PREV=ATtiny45&P=ATtiny45&V_LOW=6A&V_HIGH=DF&V_EXTENDED=FF&M_LOW_0x3F=0x2A&M_LOW_0x40=&M_LOW_0x80=0x00&M_HIGH_0x07=0x07&M_HIGH_0x08=&M_HIGH_0x10=&M_HIGH_0x20=0x00&M_HIGH_0x40=&M_HIGH_0x80=&M_EXTENDED_0x01=&B_SPIEN=P&B_SUT0=P&B_CKSEL3=P&B_CKSEL2=P&B_CKSEL0=P&B_SELFPRGEN=P&O_BITS=Apply+fuse+bits

So sind die Fuses auf deinem Screenshot gesetzt, das sieht glaube ich OK 
aus.
Allerdings kann ich nicht nachvollziehen, was du dann machst. Der 
nächste Schritt wäre jetzt den Bootloader auf den Tiny zu laden. Dann 
musst du dir noch diesen 1Wire adapter bauen damit du mit dem Bootloader 
kontakt aufnehmen kannst.
Das würde ich als erstes angehen.

viele Grüße

Biertrinker

von Randy (Gast)


Lesenswert?

> So sind die Fuses auf deinem Screenshot gesetzt, das sieht glaube ich OK
> aus.

Vielen Dank für deine Antwort. Die einzige Fuse bei der ich mir 
tatsächlich unsicher war ist die WDTON.
Die hab ich auf Factory-Default gelassen. (=1, d.h. unprogrammiert)

> Allerdings kann ich nicht nachvollziehen, was du dann machst. Der
> nächste Schritt wäre jetzt den Bootloader auf den Tiny zu laden.

Bootloader geht. Damit hab ich das eigentliche Prg auf den uC geladen 
und testweise das EEPROM gelesen. Funktioniert also.
Was ich dann gemacht habe: Pin 2 und 3 auf Betriebsspg. (3,3V) gezogen, 
das sollte nach meinem Verständnis dazu führen dass die Software 
"Akku-voll" und "dunkel" registriert und die Glühwürmchen von der Leine 
lässt, aber nichts passiert. Auch nicht nach >12min. Deshalb die Frage 
im Forum...

Randy

von Ssss S. (sssssss)


Lesenswert?

Hi!

Muss die Spannung an pin3 nicht kleiner als an pin2 sein ?
Also spannung solar < spannung akku -> glühwürmchen an

Gruss

von Ssssss (Gast)


Lesenswert?

sorry hab nicht richtig hingeguckt, da hängt ja sol- dran...

von Randy (Gast)


Lesenswert?

Hallo,

ich nochmal:
wenn ich die "measure_isnight" Routine deaktviere, d.h. das Flag immer 
setzte, und dann noch das MEASURE_INTERVAL auf 100 oder was kleineres 
setzte:

> Ändere in FireFly.h
>
> #define MEASURE_INTERVAL  (uint16_t)(10)
>
> um. Das wären dann 10*16ms an Interval, geht dann alles ein bischen
> schneller vom Ablauf her ;)

sehe ich die LEDs leuchten, wenn auch die Waves mit einer irren 
Geschwindigkeit abgespielt werden.
Setzte ich (sonst alles gleich) das MEASURE_INTERVAL auf 1000, tut sich 
gar nichts, auch nicht nach einer 10x so langen Wartezeit.
An was könnte das liegen?

Randy

von Aike T. (biertrinker)


Lesenswert?

Hallo,

MEASURE_INTERVAL verändert nicht die Ausführungsgeschwindigkeit selbst, 
sonder nur die Abstände zwischen den Messungen. Die Glühwürmchen 
"blinken" schon recht schnell, das würde ich als normal ansehen. Ich 
denke es ist ok so und du solltest Akku und Solarzelle anschließen und 
dann weiter schauen.

von Randy (Gast)


Lesenswert?

> MEASURE_INTERVAL verändert nicht die Ausführungsgeschwindigkeit selbst,
> sonder nur die Abstände zwischen den Messungen. Die Glühwürmchen
> "blinken" schon recht schnell, das würde ich als normal ansehen. Ich

Oh, das sind dann aber sehr "nervöse" Glühwürmchen. Ich kenne nur die 
die ich hier in Deutschland sehe, die leuchten eher kontnuierlich, und 
brauchen ein paar Sekunden um von "nicht leuchten" auf "leuchten" 
umzuschalten.

> denke es ist ok so und du solltest Akku und Solarzelle anschließen und
> dann weiter schauen.

Ich will das Ding en an 2 oder 3 Zellen betreiben, ohne Step-Up, dazu 
muß ich die Mess-Routinen sowieso verändern. Aber wenn es z.Z. nicht mal 
so (d.h. am Netzteil) geht, brauche ich die restliche Hardware noch gar 
nicht aufbauen...
Ich will es eh endgültig auf einen Tiny44 umprogrammieren damit ich den 
ISP nicht deaktivieren muß (und die Lichtmesung mit einem LDR machen 
kann). Das Ding mit dem Tiny45 ist nur da um die Software erst mal so 
zum laufen zu kriegen wie sie ist, bevor ich zum umprogrammieren 
anfange.

Randy

von Randy (Gast)


Lesenswert?

>> MEASURE_INTERVAL verändert nicht die Ausführungsgeschwindigkeit selbst,
>> sonder nur die Abstände zwischen den Messungen. Die Glühwürmchen
>> "blinken" schon recht schnell, das würde ich als normal ansehen. Ich

> Oh, das sind dann aber sehr "nervöse" Glühwürmchen.

Das was ich als schnelles Blinken interpretiert habe ist wohl eher die 
Multiplex-Frequenz. Das flimmern sieht nach irgendwas in der Gegend von 
10Hz aus. Ist das normal für das Programm? Ich hoffe dass der uC-Takt 
passt, ich hab den Reset jetzt deaktiviert, komme also nicht mehr an die 
Fuses ran...

Randy

von Randy (Gast)


Lesenswert?

> Das was ich als schnelles Blinken interpretiert habe ist wohl eher die
> Multiplex-Frequenz.

ok, das nehme ich wieder zurück, die Multiplex-Frequenz ist ca. 100Hz. 
Das recht nervöse Blinken dem langsamere (aber immer noch im 
1-Sekubnden-Bereich) Helligkeitsänderungen überlagert sind ist 
anscheinend beabsichtigt.

Randy

von Aike T. (biertrinker)


Lesenswert?

Ja, das meinte ich ja schon, die Glühwürmchen blinken normal schneller 
als man erwarten würde.

viele Grüße

Biertrinker

von Randy (Gast)


Lesenswert?

Hallo,

jetzt funktioniert alles soweit, nur das mit dem MEASURE_INTERVAL macht 
noch Probleme:

>> #define MEASURE_INTERVAL  (uint16_t)(10)
>>
>> um. Das wären dann 10*16ms an Interval, geht dann alles ein bischen
>> schneller vom Ablauf her ;)

> so sehe ich die LEDs leuchten
> Setzte ich (sonst alles gleich) das MEASURE_INTERVAL auf 1000, tut sich
> gar nichts, auch nicht nach einer 10x so langen Wartezeit.
> An was könnte das liegen?

Ich hab jetzt herausgefunden: mit 127 gehts noch, die Wartezeit nach 
einem Reset bis die Glühwürmchen loslegen beträgt ca. 6 Sekunden, also 
in etwa so lang wie man erwarten würde. Aber bei Zahlen ab 128 geht gar 
nichts mehr...
Ich übersetze den Sourcecode mit der aktuellen Version von WinAVR (d.h. 
mit dem gcc), was benutzen die anderen Nachbauer? Evtl. alle das 
AStudio?
Oder woran könnte das noch liegen?

Vielen Dank, auch für die Tipps bisher.
Randy

von Ssss S. (sssssss)


Lesenswert?

Wenn du das original übersetzt, stimmt dann dein hex mit dem original 
überein ?
Oder evtl mal die asm listings nachm gcc vergleichen.

Meine Platine ist leider noch nicht fertig, teste das aber auch die Tage 
(kann noch dauern...)

Gruss

von Ssssss (Gast)


Lesenswert?

Hi!

So, hab auch getestet. Erstmal die korrekten FUSES:
lfuse: 0xE2
hfuse: 0xDF (mit reset noch reset, dann aber keine leds an resetpin!) 
bzw 0x5F mit reset disabled
efuse: 0xFF

-> Damit ist auch das blinken ok. Bei falschem CLKDIV8 ist die pwm freq 
~12 Hz !

Dann scheint es echt einen Bug im GCC bzw ein Problem im Zusammenhang 
mit der ASM/register definition (brrrr kann sowas echt gutgehen ?)
Wenn der Wert MEASURE_INTERVAL größer als 127 gesetzt wird dann geht es 
nicht mehr.
KA. wieso. Vermutlich irgendein Problem mit lo() hi() und dem setzen 
einer 1 in irgendein Register das schon per register def als Variable 
dient.
Keine Ahnung...

Achja, ich hab avrgcc 4.2.2

Leider funktioniert das HEX bei mir nicht da ich 2 Zellen nehme
(Erkennung für isnight muss geändert werden)
Für heute hab ich keinen Nerv mehr...

Gruss

von Randy (Gast)


Lesenswert?

> So, hab auch getestet. Erstmal die korrekten FUSES:
> lfuse: 0xE2
> hfuse: 0xDF (mit reset noch reset, dann aber keine leds an resetpin!)
> bzw 0x5F mit reset disabled
> efuse: 0xFF

Die Efuse musst du noch auf 0xFE setzten wenn du den Bootload benutzen 
willst (bzw. den musst du benutzen wenn du den Reset-Pin deaktivieren 
und danach noch ein Update einspielen willst)
Ich werde in absehbarer Zeit eine auf en Tiny44 angepasste Version hier 
reinstellen, bei dem hat man genügend Pins um den Reset-Pin nicht mit 
einer LED belegen zu müssen. d.h. man kann auf den Bootloader verzichten 
weil man den ISP nicht deaktivieren muß.



> Dann scheint es echt einen Bug im GCC bzw ein Problem im Zusammenhang
> mit der ASM/register definition (brrrr kann sowas echt gutgehen ?)
> Wenn der Wert MEASURE_INTERVAL größer als 127 gesetzt wird dann geht es
> nicht mehr.

Ich glaube inzwischen dass der Bug nicht am avr-gcc liegt. Ich hoffe der 
Orginal-Autor schaut nochmal rein um die Zeilen der wdt_setup-Funktion 
zu kommentieren (die Kommentare sind von mir, der Code vom 
Original-Programm):
1
  uint16_t res = 1;
2
    uint8_t  idx = 1;
3
    while ((res <= time) && (idx < 10)) {
4
      res += res;
5
      idx++;
6
    }
7
// wenn diese Schleife verlassen wird hat idx einen Wert
8
// von 1..9 (inklusive)
9
// Gerade bei einem Wert von time>=128 bekommt idx den Wert 9
10
    res /= 2;
11
    if (--idx > 7) idx = (idx & 0x0F) | (1 << WDP3);
12
// idx hat nach dem -- einen Wert zw. 0 und 8, d.h. der Wert 8 ist der
13
// einzige bei dem das if in den "then" Zweig läuft
14
// im then-Zweig wird idx durch das &0x0F nicht verändert(!),
15
// wenn man sich die Bits im Register WDTCR ansieht, würde ein
16
// idx & 0x07 logischer erscheinen
17
// Bit 3 ist naemlich "Watchdog Enable" (s.47/48 im Datenblatt)...
18
    idx |= (1 << WDIE);                                                 // enable WDT-ISR
19
// ...und das macht in Kombination mit "WDIE" keinen Sinn ("If WDE is set,
20
// WDIE is automatically cleared")
21
22
    wdt_reset();
23
    WDTCR |= (1 << WDE) | (1 << WDCE);
24
    WDTCR  = idx;

Ob die Änderung von 0x0f in 0x07 das Problem behebt probiere ich am 
WoEnde aus.

Randy

von Randy (Gast)


Lesenswert?

> // Bit 3 ist naemlich "Watchdog Enable" (s.47/48 im Datenblatt)...
>    idx |= (1 << WDIE);                                                 // > 
enable WDT-ISR
> // ...und das macht in Kombination mit "WDIE" keinen Sinn ("If WDE is set,
> // WDIE is automatically cleared")

Ich sehe gerade: Laut Tabelle 8-2 im Datenblatt S.48 sollte es nicht 
schaden wenn man zum WDIE auch zusätzlich das WDE setzt. Das sollte 
genau keine Veränderung bewirken, sondern beide male der Watchdog einen 
Interrupt auslösen...

Randy

von Ssssss (Gast)


Lesenswert?

Ok mit der efuse hast du recht, ich nutze den Bootloader nicht (da kein 
linux loader verfügbar).
Ich teste es einfach mit ohne Reset pin disable und dann wird am ende 
die fuse
so gesetzt dass er nicht mehr per isp programmierbar ist.

Ich werde morgen meine Platine umändern und doch eine zelle + stepup + 
originalcode (hex) verwenden. Langsam wird die Zeit knapp 
(Weihnachtsgeschenk g)

von Sssssssssss (Gast)


Lesenswert?

Hi!

Super, ich glaub du hast den Bug gefunden!

Wenn ich folgende Änderung mache:
//if (--idx > 7) idx = (idx & 0x0F) | (1 << WDP3);
if (--idx > 7) idx = (idx & 0x07) | (1 << WDP3);

dann gehts :) Zumindest leuchten die Glühwürmchen ab und an.
(MEASURE_INTERVAL=1300 getestet)

von Hagen R. (hagen)


Lesenswert?

if (--idx > 7) idx = (idx & 0x07) | (1 << WDP3);

ist natürlich richtig. Idx enthält die "Bitcodierung" des WDT Timeouts 
umgerechnet aus dem der Funktion übergebenen Timout Wert in WDT Ticks. 
Dazu dienen ja die WDP? Bits. Davon liegen 3 Bits im untersten Nibble 
aber das WDP3 Bit liegt eben pysikalisch woanders. Ergo Idx muß mit 0x07 
maskiert werden und dafür das WDP3 Bit rein-ge-odert werden.

Beim Setzen der verschiedenen WDT Betriebsmodis muß man aber aufpassen. 
Wir benötigen nur den periodischen WDT Interrupt. Dazu darf WDE nicht 
gesetzt werden und statt dessen nur WDIE. Setzt man WDIE und WDE dann 
wird nur einmalig ein WDT IRQ ausgelösst. Wird in dieser ISR nicht 
explizit erneut das WDIE Bit gesetzt, es wird bei der Kombination WDIE + 
WDE autom. per Hardware vor dem Einsprung in die WDT-ISR gelöscht, dann 
würde der nächste WDT Timeout einen echten WDT-Reset auslösen. Benutzt 
man nur WDIE, also ohne WDE, so wird das WDIE Bit nicht mehr per 
Hardware vor dem Einsprung in die WDT ISR gelöscht. Somit bleibt der 
WDIE permanent aktiviert ohne das man sich darum weiter kümmern müsste. 
Und exakt diesen Modus wollen wir benutzen, da der WDT nur als, zwar 
rel. ungenauer, Timer benutzt wird der aber eben auch im Power Down 
Sleep Modus noch arbeitet.

Wird also in wdt_setup() das WDE Bit ebenfalls gesetzt so verhält sich 
das Projekt garaniert nicht so wie es sein sollte. Nach dem ersten 
Auslösen der WDT-ISR, in Datei isrs.S -> WDT_vect, würde der AVR beim 
nächsten WDT Timout einen HW-Reset machen.

Danke für das Aufspüren dieses Bugs (es gibt keine Software ohne Fehler 
;)

Das Projekt basiert also darauf das es die minimale Zeitdauer bis zum 
nächsten Aufleuchten eines/mehrer Glühwürmchen, so effizient wie möglich 
in variable WDT Timouts umrechnet und somit im Power Down Sleep Modus 
verbringt. Diese Zeitspannen sind variabel und somit auch die WDT Phasen 
im Sleep Modus.
Bei WDT Timouts die gestaffelt als Potenz zur Basis 2 vorliegen ist 
zwangsläufig die binäre Codierung der effizienteste Pfad um mit wenigen 
WDT Timouts einen Gesamttimout zu zerstückeln. Pure Mathematik.

Gruß Hagen

von Hagen R. (hagen)


Lesenswert?

Allerdings muß man beim ersten Setzen des WTCRs die Kombination WDE + 
WDCE benutzen und beim zweiten Setzen des Registers darf dann das WDE 
Bit nicht mehr gesetzt sein. Das wäre aber bei der Maskierung mit 0x0F 
uU. aber der Fall.

Warum ich diesen Fehler bei meinem Projekt nicht sofort bemerkt habe ist 
mir aber selber ein Rätsel ;)

Gruß Hagen

von Sssssssssss (Gast)


Lesenswert?

Hi!

Hmm echt komisch. Evtl hat der gcc bei dir irgendwas anders optimiert 
und deshalb kam es bei dir nicht zum Bug ?
Ich hab jetzt mal die Platine auf stepup umgelötet.
Gar nicht so einfach wenn man sie per Tonermethode ätzt, nicht aufpasst 
und am Ende die Platine gespiegelt hat g (alle Bauteile haben jetzt 
umgebogene pins g)

Mal schaun ob das original HEX läuft. in 12minuten weiss ich mehr :)

Kann es evtl sein dass du den bug gefixt hattest aber im source der oben 
gepostet wurde nicht ?
Dann dürfte das original HEX ja auch nicht richtig laufen. Das sehe ich 
gleich :)

Gruss

von Randy (Gast)


Lesenswert?

> if (--idx > 7) idx = (idx & 0x07) | (1 << WDP3);
>
> ist natürlich richtig. Idx enthält die "Bitcodierung" des WDT Timeouts
> umgerechnet aus dem der Funktion übergebenen Timout Wert in WDT Ticks.

Danke für die Bestätigung. Wenn man in den Sourcen von anderen Leuten 
werkt besteht immer die Gefahr dass man Codestücke falsch interpretiert 
bzw. Zusatzeffekte übersieht.

Was mir noch aufgefallen ist: Ich habe meine Platine z.Z. noch fest auf 
"Nacht" geklemmt. Nach ein paar Stunden Aktivität stellen die LEDs das 
Leuchten ein, und zwar - so wie es aussieht - dauerhaft. Ist das so 
beabsichtigt? (evtl. als Schutz gegen in-den-Schrank-stellen)
Als ich in der (originalen) wdt_setup Funktion eine Zeile drin hatte die 
das Argument "time" auf Werte <=127 begrenzt hat war das nicht der Fall.

Randy

von Hagen R. (hagen)


Lesenswert?

@Randy:

Du hast also die komplette Auswertung vom Solarpanel und Akkuspannung 
deaktiviert und gibts immer das Flag FLAG_ISNIGHT.

Dann sollte das Teil eigentlich unendlich lange so weiterlaufen und 
nicht seinen Dienst irgendwann einstellen, es sei denn die 
Versorgungsspannung bricht ein, sprich deine Akkus wären leer.

Falls all dies nicht zutrifft dann muß noch ein Bug in der Software 
sein. Ich könnte mir nur einen Überlauffehler bei den Berechnungen 
vorstellen. Das könte dann dazu führen das eine Wartezeit berechnet wird 
die sehr groß ist. Bei zb. dem Wert 0xFFFF als Wartezeit wären das dann 
ca. 17 Stunden.

In Main() die Variable Timout enthält diesen Gesamttimeout in WDT Zyklen 
a 16ms. Gesetzt/berechnet wird sie aus dem Hungry Wert der Firefly 
Datenstruktur. Also in der Funktion update_fireflies() der Rückgabewert 
Food.
Du kannst dir das also so vorstellen das eine Zeitspanne von 16ms des 
WDT quasi 1 Energiepunkt als Futter für ein Glühwürmchen darstellt. Je 
höher der Wert Hungry eines Fireflys ist desto länger die Zeitspanne in 
16ms Schritten bis es genügend Energie gesammelt hat und erneut leuchten 
kann. Wenn es dann leuchtet oder seine Nachbarn wird der 
Energieverbrauch des Leuchtmusters (Dauer * Intensität) auf seine 
Energiebilanz addiert, also das Member .Hungry inkrementiert.
Das einzige Zufallselement ist also nur die Auswahl in welchem 
Leuchtmuster ein Glühwürmchen leuchten soll, alles Andere leitet sich 
davon deterministisch ab. Da aber jedes gerade leuchtende Glühwürmchen 
auch die Energiebilanz seiner Nachbarglühwürmchen beeinflusst -> Hälft 
von der Hälfte von der Hälfte usw. wird es trotz Zufall zu Phasen kommen 
müssen bei denen durchschnittlich 50% der LEDs quasi fast zu gleichen 
Zeitpunkt gleichzeitig leuchten. Also so als ob sie gegenseitig mit 
Leuchtmustern aufeinander antworten. Forciert wird dieses Verhalten nun 
auch noch durch das Hungry_Threshold. Diese Variable wird im Laufe der 
Zeit innerhalb eines Fensters hin und her schwanken und bestimmt wie 
häufig bzw. schnell sich diese Synchronisation der Leuchtmuster 
einstellen.
Es sollte also schon so sein das es längere Phasen gibt bei denen nichts 
leuchtet. Dann sollte sich das Einzelleuchten langsam aufschauckeln bis 
zu dem Punkt wo überdurchschnittlich viele und gleichzeitig leuchten. 
Dieser Prozess geht über Stunden.

Bei mir, mittlerweile 3 Nachbauten, geht das auch immer exakt so.

Allerdings habe ich ebenfalls bei einem der Nachbauten das Problem das 
sich  nach einiger Zeit garnichts mehr tut, so als ob es hängt. Nach 
Austausch der Akkus ist das aber beseitigt und so vermute ich eher das 
es an den Akkus/Stepup oder ADC Auswertung der Akkuspannung liegen wird.

Gruß Hagen

von Randy (Gast)


Lesenswert?

> Du hast also die komplette Auswertung vom Solarpanel und Akkuspannung
> deaktiviert und gibts immer das Flag FLAG_ISNIGHT.

Gerade haben sie wieder angefangen, aber seit heute Morgen ist das die 
erste Aktivität, das waren jetzt mind. 7 Stunden Pause. aber sehr 
zögerlich und nur mit einer LED. Und jetzt ist schon wieder seit >15min 
nix los.
Das Flag habe ich nicht per Software deaktiviert, sondern die 
ADC-Eingänge fest über einen Spannungsteiler an 1,2 und 1,3V gelegt so 
dass das Flag immer aktiviert sein sollte. Und nach einem Reset legt die 
Schaltung ja auch erst mal kräftig los.
Aber jetzt bau ich den Code erstmal auf den Tiny44 um, dann hab ich ein 
paar Pins übrig, das ist immer praktisch zum Debuggen. Z.B. kann ich mir 
die Wartezeit bis zur nächsten Aktivität per SPI raustakten und 
anzeigen...

Randy

von Ssssss (Gast)


Lesenswert?

Hi!

So richtig will es immer noch nicht. Ich hab ne frage zum source:
1
  // first dummy reading, VRef=2.56V
2
    PRR    = (1 << PRTIM1) | (1 << PRTIM0) | (1 << PRUSI);
3
    ADMUX  = (1 << REFS2) | (1 << REFS1) | (1 << MUX1) | (1 << MUX0);
4
    ADCSRA = (1 << ADEN) | (1 << ADIE) | (1 << ADPS2) | (1 << ADPS0);
5
    sleep_cpu();
6
  // read battery voltage
7
    sleep_cpu();
8
    uint16_t bat_volt = ADC;
9
 // read solar panel voltage
10
    ADMUX  = (1 << REFS2) | (1 << REFS1) | (1 << MUX1) | (0<<MUX0);
11
    sleep_cpu();
12
    uint16_t sol_volt = ADC;
13
    if ((sol_volt > bat_volt) && (sol_volt >= BATTERY_OK)) flags |= FLAG_ISNIGHT;

bat_volt wird zuerst gelesen, von ADC3 (=PB3 = pin2 = BAT+ beim tiny45)
sol_volt danach, von ADC2 (=PB4 = pin3 = SOL- beim tiny45)

Ok soweit.

Nun wird sol_volt > bat_volt getestet:
Das kapier ich irgendwie nicht. Sagen wir es ist Nacht, dann sei die 
Solarzelle wie ein Widerstand mit zb 5 Ohm.
Dann liegt an SOL- eben genau die Spannung BAT+ - eventuelle 
Spannungsabfall an.
Sprich sol_volt kann NIE größer als bat_volt werden ??!?

Hab ich da irgendeinen Denkfehler drin ?

Ich hab jetzt mal
uint16_t sol_volt = ADC + 100;
gemacht, dann erfolgt die Erkennung ob es Nacht ist und die Würmchen 
leuchten.
Ob sie auch irgendwann stoppen weiss ich noch nicht.

Gruss

von Ssssss (Gast)


Lesenswert?

Hi!

So, habe jetzt mal mit dem bootloader experimentiert.
Super, der Loader funzt sogar unter wine !!!

Wichtig sind die Fuses (efuse, selfprgen!)
hfuse: 0x5F (RESET disabled!!)
lfuse: 0xE2
efuse: 0xFE


Beim eigentlichen Glühwürmchen code habe ich immer noch Probleme.
- der Timeout 6*3750 scheint irgendwo probleme zu machen, bis 5*3750 
gehts...
- beim ADC messen hab ich beim sol_volt = ADC + 50

Irgendwann hören die Glühwürmchen auf zu leuchten...
Habe jetzt mal den resetpin disabled und auch würmchen dran. Mal sehn.
Ausserdem teste ich ISNIGHT fest auf 1...

von Ssssss (Gast)


Lesenswert?

hmmm mit deaktivierter nachtmessung leuchten die würmchen brav vor sich 
hin:

deaktiviert durch:
static void measure_isnight(void) {
...originalcode...
flags |= FLAG_ISNIGHT;
}

wenn ich das nicht mache hören sie nach einiger Zeit (einigen 30min bis 
stunden) auf zu leuchten
(volle AAA batterie mit 1.5V, dh spannung zu niedrig kanns nicht sein)

Ich forsche mal weiter...

von Sssssss (Gast)


Lesenswert?

Ok an der Messung lag es nur zum Teil...

Ich glaube die uint timeout wurde irgendwann mal "negativ".
Dh sie springt von z.B. 2 nach 0xFFFF -> sehr groß!
Folgender Code läuft bei mir jetzt wie er soll (bzw ich hab noch ein 
paar debugroutinen drin gehabt, ich hoffe es lag nicht an den 
debugroutinen. in dem diff hier hab ich die rausgenommen):
1
130c135
2
<     uint16_t sol_volt = ADC;
3
---
4
>     uint16_t sol_volt = ADC+50;
5
147c159,162
6
<     if (--idx > 7) idx = (idx & 0x0F) | (1 << WDP3);
7
---
8
>     if (--idx > 7) idx = (idx & 0x07) | (1 << WDP3);
9
160,161c176,177
10
<     uint16_t timeout = 0;   // remaining time in WDT cycles a 16ms upto next event
11
<     uint16_t measure = 0;   // remaining time upto next measurement^M
12
---
13
>     int16_t timeout = 0;   // remaining time in WDT cycles a 16ms upto next event
14
>     int16_t measure = 0;   // remaining time upto next measurement
15
167c183,186
16
<         if (timeout == 0) {
17
---
18
>       if (timeout < 0){
19
>         timeout = 0;
20
>       }
21
>         if (timeout==0){

Sie haben die ganze Nacht durchgeleuchtet und gerade im Licht brav 
aufgehört.
Ob sie wieder anfangen weiss ich noch nicht, sie stehen erst zu kurz im 
dunklen Schrank 8)

Gruss

von Hagen R. (hagen)


Lesenswert?

Danke für deine Mühen. Weiter oben sagte ich ja schon das dein 
beobachtetes Verhalten eigentlich nur auf einen Überlauf in den 
Berechnungen hindeutet. Ich selber hatte diese Probleme in der Form 
nicht, werde aber meine Aufbauten mit deinen Änderungen updaten. 
Technisch möglich wäre es nämlich das der PRNG bei dir so ungünstige 
Waves/Leuchtmuster auswählt das der Timeout überläuft. Auf Grund meines 
"Sparsamkeitskomplexes" habe ich aber die meisten Variablen als 16 Bit 
deklariert statt auf Nummer sicher zu gehen und sie int32 zu 
deklarieren.

Andererseits müsste bei einem Überlauf im uint16_t es zur Konsequenz 
haben das die Dunkelphasen künstlich verkürzt werden. Dh. wenn im 
Timeout ein Wert wie 0xFFFF errechnet wurde dann ist dies im Grunde auch 
korrekt so, da bis dahin ja noch kein Überlauf erfolgte. Entsteht nun 
ein Überlauf von zb. +2 so würde Timout den Wert +1 annehmen und somit 
der WDT noch 16ms warten und dann die Glühwürmchen durch den Aufruf 
update_fireflies() beginnen zu leuchten.

Das was du mit deiner Änderung also machst ist nichts anderes als einen 
Maximal-Timout von 0x7FFF einzubauen. Man könnte auch gleich so arbeiten
1
if (timout >= XYZ) timout = XYZ;

wobei XYZ eine nach belieben einstellbare Konstante wäre.

>Ob sie wieder anfangen weiss ich noch nicht, sie stehen erst zu kurz im
>dunklen Schrank 8)

Bei meinen vorgegebenen Intervalen sollten sie nach spätestens 12 
Minuten wieder beginnen zu leuchten.

Gruß Hagen

von Sssssss (Gast)


Angehängte Dateien:

Lesenswert?

Hi!

Sie haben auch wieder angefangen zu leuchten :)
Ok dann wars evtl doch nicht die Änderung...
Ich häng mal mein C File und das Hex an was bei mir momentan gut läuft.
Evtl liegt es auch irgendwie an meinen Debug werten/Code liegt oder so.
Evtl irgendein fieses Optimierungproblem oder so.

Hast du ne Ahnung warum deine Originalversion ohne das +50 beim ADC 
funktioniert ?
Das kann doch eigentlich gar nicht sein, oder ?
Oder evtl misst ein adc port bei dir immer minimal falsch oder so.


Das die Würmer aufhörten zu leuchten war sehr zufällig.
Mal war nach ein paar minuten Ende, mal dauerte es 3h.
Aber sobald sie aufhörten war auch ne h später nichts mehr zu sehen.
Jetzt scheint es zu gehen, die ganze nacht haben sie geleuchtet, heute 
morgen aufgehört und nach dem verdunklen auch wieder angefangen und 
leuchten immer noch.

Komisch :-\

Gruss

von Sssssss (Gast)


Lesenswert?

achja bzgl timeout:
Ne, ich meinte das genau anders rum:

timeout -= wdt_setup(timeout);

Da wird timeout verkleinert. Wenn jetzt timeout zb 2 ist und man zieht 3 
ab
käme ein sehr grosser wert raus 0xFFFE oder so.
D.h. nun wäre der Timeout riesig (oder ist 0xFFFE noch vertretbar lang ? 
k.a. hab nicht geguckt was da genau drinsteht).

Ausserdem prüfst ja nur timeout==0. Was wenn timeout (warum auch immer, 
buig in wdt_setup oder so) nie gleich null wird ?
Drauf gekommen bin ich als ich in wdt_setup immer nur einen festen
timeout gewartet habe, da lief das programm lange durch.
Keine Ahnung obs daran liegt. Meine Würmer leuchten rechtzeitig zum Fest 
8)

Gruss

von Hagen R. (hagen)


Lesenswert?

>Ne, ich meinte das genau anders rum:

>timeout -= wdt_setup(timeout);

Deine Vermutung eines Problemes dürfte aber nicht auftreten ;)

wdt_setup() bekommt den aktuellen Timeout als Paramater übergeben. Diese 
Funktion errechnet nun einen realen WDT Timout, und setzt den WDT auch, 
der immer kleiner oder gleich dem übergebenen Timout ist. Also wenn 
Timout den Wert +2 hätte dann gibt wdt_setup() einen Wert zwischen 1 bis 
gleich 2 zurück.

Also angenommen Timout ist 512+256+128 dann würde wdt_setup(Timout) im 
1. Aufruf 512 zurückgeben müssen. Im 2. Aufruf dann 256 und im 3. Aufruf 
dann 128. So zerstückelt wdt_setup() den Timeout Wert in Zeitabschnitte 
die man im WDT auch benutzen kann, es sind immer Potenzen zur Basis 2. 
Nimmt man also den aktuellen Wert in Timout und multipliziert diesen mit 
16 ms so hat man die Gesamtwartezeit die der WDT warten muß. Diese 
Wartezeit wird so zerstückelt das man den WDT auch entsprechend 
programmieren kann.

Wenn dann solltest du mal folgendes als Debug Code einbauen:
1
uint16_t t = wdt_setup(timeout);
2
3
if (t > timeout) printf("Error");
4
5
timout -= t;

Falls die Meldung "Error" erscheien sollte dann ist definitiv irgendwas 
in wdt_setup() noch falsch.

Gruß Hagen

von Sssssss (Gast)


Lesenswert?

printf ? ui sowas hätt ich gern g
Ich hab nur Variablen im globalen speicher gesetzt und per bootloader 
beobachtet :)
Ich hab leider keine Zeit genau zu debuggen was schiefging.
Jedenfalls funktioniert das hex aus dem archiv was ich vorhin gepostet 
habe. Warum ist mir erstmal egal solange die Würmchen leuchten wie sie 
sollen 8)

Danke übrigends für das chöne Projekt! Ich poste mal Fotos und ggf. ein 
Video :)

Gruss

von Hagen R. (hagen)


Lesenswert?

Jo Video wäre gut, ist mir nämlich nicht so gelungen wie man es mit 
eigenen Augen in real sieht.

von Sssssss (Gast)


Lesenswert?


von Hagen R. (hagen)


Lesenswert?

sieht doch gut aus. Besonders im ersten Video erkennt man wie die 
Glühwürmchen aufeinander antworten ;) Auch die unterschiedlichen Waves 
erkennt man gut. Bei mir ist es auf alle Fälle exakt genauso.

von Randy (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
jetzt muß ich doch noche meine Ankündigung wahr machen und eine Variante 
der Software für den tiny44 ins Forum stellen.

Meine Veränderungen:

- Der Reset-Pin bekommt keine weitere Aufgabe, d.h. man kann beim ISP 
Programmierer bleiben und braucht den Bootloader nicht.
- Die LEDs hängen an PA 2,4,5,6. Das bedeuted dass drei der Leitungen eh 
am ISP Stecker hängen. Ich hab dann PA2 auf einen 7.Pin des Steckers 
geführt, so dass ich für die LEDs und den ISP nur einen Stecker brauche. 
(Ich benutze immer die 6-polige ISP-Steckerbelegung von 
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Equipment#Selbstbau)
- Ich benutze keinen Step-up, sondern 2 oder 3 NiMH Zellen. Der 
Tiefentladeschutz ist darauf abgestimmt. Es wird immer Vcc als Ref-Spg 
für den ADC benutzt und die intere 1,1V-Ref-Spg gemessen (wie es weiter 
oben in dieser Diskussion beschrieben worden ist)
- Zur Nacht-Erkennung benutze ich einen LDR. Der Spannungsteiler (siehe 
Schaltplan) wird nur zur Messung mit Strom versorgt. Die Schwelle liegt 
bei der viertel Betriebsspannung.
Alternativ kann man auch ADC0 an den Minuspol der Solarzelle 
anschliessen (Diode am Minuspol, wie bei der urspr. Schaltung von 
Hagen). Bei Helligkeit ist die gemessene Spannung niedrig, bei 
dunkelheit liegt an der Solarzelle keine Spannung, der ADC misst also 
eine hohe Spannung. Evtl. hilft ein hochohmiger Widerstand über der 
Solarzelle, weil diese auch bei wenig Beleuchtung schon (fast) die volle 
Spannung erzeugt, aber hald nur wenig Strom. (nicht getestet! Ich habs 
nur mit dem LDR ausprobiert.)


Bei den LEDs die ich benutze ("LG L29K" bzw "LG P47K" von Reichelt) ist 
die Schwellspanung niedrig genug dass 2 Zellen durchaus reichen. Bei 
2,2V sind sie zwar schon recht dunkel, aber die Zellen haben ja bei >80% 
der Entladekurve 2,4V oder mehr, so dass das schon klappt.
Zwei statt drei Zellen auch deshalb weil bei den Solarzellen dieser 
Serie (z.B. Best-Nr. 110330) die für drei Zellen geeignete zu grpß ist 
für mein Einmachglas. Deshalb die Versuche die gezeigt haben dass es mit 
zwei Zellen auch geht, wenn auch knapp.

Hat jemand einen Tipp mit welchem Kleber man am besten die Solarzelle 
und die Platinen auf den Glasdeckel eines Einmachglases kleben kann? Am 
besten mit genauer Produktbezeichnung? Ich hab mit sowas überhaupt keine 
Erfahrung.

Randy

von Randy (Gast)


Angehängte Dateien:

Lesenswert?

und der Quellcode hinterher

von Randy (Gast)


Lesenswert?

Ach ja, die Fuses: Ckdiv8 deaktivieren, alle anderen auf der 
Fabrikeinstellung lassen.

von Randy (Gast)


Lesenswert?

> Zwei statt drei Zellen auch deshalb weil bei den Solarzellen dieser
> Serie (z.B. Best-Nr. 110330)

Gemeint ist die Conrad-Bestellnummer.

Randy

von Lothar M. (lme)


Lesenswert?

Damit nicht noch andere Nachbauer verzweifelt nach Fehlern suchen:

Mit der aktuellen Version des Winavr (Stand Mai 2009) läßt sich der 
Source meiner Erfahrung nach NICHT wunderfrei compilieren. Es kommt zu 
allerlei bunten Effekten.
Die von Hagen benutzte, ältere Version mit AVR-GCC 3.4.6 führt zu 
verlässlichen Ergebnissen. Z.B. von hier: 
http://sourceforge.net/project/showfiles.php?group_id=68108&package_id=66543&release_id=411822

Aber vielleicht weiss das ja auch schon jeder - außer mir. ;)

Nochmals Dank an Hagen für seine wertvollen Tipps!

In diesem Sinne
  Lothar

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Lothar Merl schrieb:
> Damit nicht noch andere Nachbauer verzweifelt nach Fehlern suchen:
>
> Mit der aktuellen Version des Winavr (Stand Mai 2009) läßt sich der
> Source meiner Erfahrung nach NICHT wunderfrei compilieren. Es kommt zu
> allerlei bunten Effekten.

Einen Bug bekommt man mit -fno-split-wide-types weg. Probleme machen 
aber u.U auch globale Register. GCC 4 optimiert die teilweise gnadenlos 
weg, auch wenn man sie per -ffixed- "reserviert". Ob das nun ein Bug 
oder ein Feature ist...?

> Die von Hagen benutzte, ältere Version mit AVR-GCC 3.4.6 führt zu
> verlässlichen Ergebnissen. Z.B. von hier:

Jo, nud der Code ist oft sogar dichter. Und Bugs hab ich bei dem noch 
keine gefunden. :-)

Johann

von Hagen R. (hagen)


Lesenswert?

das ist der Grund warum ich diese Version am häufigsten einsetze. Man 
muß halt dann die nötigen Libs/Includes manuell auf den neusten Stand 
halten.

Gruß Hagen

von Michael H. (kochloeffel)


Lesenswert?

Hallo,
ich bin noch blutiger Anfänger, und wollte Fragen ob mein Gedanke 
richtig ist?
Wenn ich die Glühwürmchen auf einen ATMEGA32 draufmache und den Code 
abändere, kann es sein das dann statt der 4 Ausgängen für LED's dann 32 
zur verfügung stehen würden?
LG
Michael

von Randy (Gast)


Lesenswert?

> Wenn ich die Glühwürmchen auf einen ATMEGA32 draufmache und den Code
> abändere, kann es sein das dann statt der 4 Ausgängen für LED's dann 32
> zur verfügung stehen würden?

Ich hab jetzt die I/O Pind des Mega32 nicht gezählt, aber kommt schon 
hin. Nur ist gerade die PWM-Ansteuerung der LEDs (IMHO) recht 
unübersichtlich geraten, ist also gar nicht so einfach da was zu ändern; 
man muß sich zumindest recht tief in die Details der Ansteuerung 
einarbeiten. Aber warum sollte es nicht gehen?
Ich habs mit der originalen Zahl von 12 LEDs nachgebaut und denke die 
Anzahl reicht. Man braucht gar nicht mehr um einen guten Effekt zu 
erreichen.

HTH
Randy

von Michael H. (kochloeffel)


Angehängte Dateien:

Lesenswert?

Ich hab keine Ahnung, aber wären die Änderungen etwa richtig so?
weil so wären es 29 * 2 LED's also insgesammt 58 LED's.
LG
Michael

von Hagen R. (hagen)


Lesenswert?

Das wird so einfach nicht funktioniern.
Mit dem aktuellen Code für die PWM können nur 12 LEDs gesteuert werden. 
Diese 12 LEDs werden pro PWM Durchlauf in 4 Gruppen unterteilt a 3 LEDs 
die leuchten. Somit leuchtet eine LED pro PWM Zyklus nur 25% der Zeit. 
Nun rechne es aus: 8MHz Takt  64 Prescaler  256 Schritte / 4 Gruppen = 
122Hz LED Refresh Rate. Die PWM Software befindet sich in Datei isrs.s 
und ist vollständig Assembler. Diese kann nur 4 Pins mit 12 LEDs 
ansteuern. Dh. du musst diese schon erweitern/ändern damit dein Plan 
funktioniert. Aber du musst auch das ganze Timing verändern damit deine 
LEDs nicht zu langsam refesht werden. Es dürfte zu einem Problem werden 
diese ISR Routinen noch weiter zu beschleunigen mit einem schnelleren 
CPU Takt.

Beispiele für's Charlieplexing:

12 LEDs = 4 Pins = 25% jeweils 3 LEDs pro Zyklus, 4 Zyklen
20 LEDs = 5 Pins = 20% jeweils 4 LEDs pro Zyklus, 5 Zyklen
30 LEDs = 6 Pins = 17% jeweils 5 LEDs pro Zyklus, 6 Zyklen
42 LEDs = 7 Pins = 14% jeweils 6 LEDs pro Zyklus, 7 Zyklen
56 LEDs = 8 Pins = 12% jeweils 7 LEDs pro Zyklus, 8 Zyklen

Dh. bei 56 LEDs ergibt sich folgedenes PWM Timing:

8 mal hintereinander leuchten jeweils 7 LEDs mit in dieser Zeitspanne 
einstellbarem Dutycycle in 256 Schritten. Deine LEDs müssen also mit 
8mal höherem Strom betrieben werden im Vergleich zu einer direkten PWM.

Möchtest du 100Hz Refreshrate so ergobt das einen Timer Takt von 
100Hz*256 Schritte pro LED * 8 Zyklen = 205kHz. Mit einem 16Mhz AVR / 
205kHz = 78 Takte hast du maximal zur Verfügung für deine ISRs. Bei 8MHz 
Takt nur noch 34 Takte.

Die PWM Software benutzt den Timer Overflow Interrupt und den Output 
Compare Match Interrupt. Die Timer Overflow benötig die meiste 
Rechenzeit. Jetzt im aktuellen Projekt sind es 192 Takte maximal. Damit 
ist dauert dieser ISR Handler schon länger als er dürfte. Denn er dauert 
länger als 1 PWM Takt der LEDs. Wir tricksen und nutzen nur eine maximal 
einstellbaren Dutycycle pro LED von 0 bis 252. Die Output Compare Match 
ISR ist dageben zeitlich unkritischer aus sich der notwenigen CPU Takte 
für die ISR Handler. In dieser werden ja nur die in der TOV ISR 
berechneten Werte aus dem SRAM gelesen und der PORTB/DDRB gesetzt. Diese 
ISR darf niemals länger dauern als der Prescaler Wert des Timers. Die 
jetzige ISR benötigt 18 Takte +4 Takte falls aus dem Idle Sleep 
aufgerufen. Der Prescaler ist jetzt 64 und damit geht das gut. Für deine 
56 LEDs am gleichen PORT ist diese ISR softwaremäßig 1zu1 identisch. Der 
einzige Unterschied wäre das sie bis zu 7 mal pro Zyklus aufgerufen 
werden kann statt nur bis zu 3 mal bei 12 LEDs.

Du hast also zwei Probleme:

1.) Der LED Strom muß 8 mal höher gewählt werden und die AVR Pins können 
aber nur 20mA treiben. Da aber bis zu 7 LEDs pro Zyklus gleichzeitig an 
ein 1 Pin Spaltenauswahl betrieben werden ist der maximal zulässige 
Strom also 20mA/7 = 2.9mA pro LED. Bei 2.9mA / 8 = 363µA Dauerstrom pro 
LED müssen deine LEDs noch ausreichend Helligkeit abgeben.

Im Gegensatz dazu 12 LEDs -> 3 LEDs in ein Pin -> 20mA/3 = 7mA/4 = 
1.75mA Dauerstrom und ausreichend Helligkeit ist mit Low Current LEDs 
ohne Problem möglich.

2.) den ISR-Handler für die TOV ISR musst du umschreiben damit diese 8 
Zyklen für 7 LEDs + 1 Spalte macht. Das heist statt wie jetzt 4 Zyklen 
somit 8 Zyklen und pro Zyklus nicht die Daten für 3 LEDs berechnen 
sondern für 7 LEDs. Grob gerechnet brauchen wir ca. 64 Takte pro LED * 7 
= 448 Takte für deine veänderte ISR. Da nun aber der PWM Takt auch noch 
wesentlich höher sein muß bei deiner Anordnung hast du weniger 
Rechenzeit zur Verfügung. Ich würde schätzen das du den Dutycycle der 
LED nur von 0 bis 240 einstellen kannst.

Ich denke nur bis zu 20 LEDs können so sinnvollerweise angesteuert 
werden. Das wäre aber keine Beschränkung aus Sicht der Rechenpower und 
PWM Zeiten da man ja mit einer einstellbaren Heeligkeit von 0 bis 240 
durchaus leben kann (also die hellen Helligkeiten wären weniger und da 
wir logarithmisch die Helligkeit wahrnehmen könnten wir eh keinen 
Unterschied feststellen). Zudem benötigt die jetzige Sofwtare auch nur 
maximal 1.64% der CPU Zeit was sich bei deinem 56 LEDs nicht wesentlich 
verschlechtern sollte. Problematisch ist nur die Reaktionszeit dieser 
ISRs.
Das Hauptproblem dürfte der maximale Strom den du über die Pins für die 
LED treiben kannst sein. Bei 56 LEDs ist nur ein Pin als Spaltentreiber 
geschaltet und er muß den Strom der anderen 7 Pins = LEDs sinken/sourcen 
können und das dann pro 7 LEDs nur 1/8'tel der gesammten PWM Zeit.

Wenn also eine LED mit 20mA Dauerstrom die hellste Helligkeit liefert, 
dann sind das ein notweniger Pulsstrom in einer PWM betriebenen LED von 
20*8 = 160mA. Diese 160mA pro LED muß 7'fach in den einen Spaltenpin, 
ergo müsste der AVR pro Pin 1120mA sourcen/sinken können.

Umgedreht gerechnet: 20mA max. Strom pro Spaltenpin,  7  8 = 360µA LED 
Konstantstrom. Die maximalste Helligkeit der PWM ist also vergleichbar 
mit einer LED die mit 360µA Dauerstrom betrieben wird.

Ich weiß Thema "gepulste LEDs und nicht proportionaler, vermuteter 
Zusammenhang zwischen Pulsstrom und Helligkeit", bitte keine Diskussion 
dazu hier anfangen.

Gruß Hagen

von Hagen R. (hagen)


Lesenswert?

Die TOV ISR ist so aufgebaut:
1
        push    _a_ocr
2
        push    _a_ddr
3
4
        push    _b_ocr
5
        push    _b_ddr
6
7
        push    _c_ocr
8
        push    _c_ddr

Hier temporäre Register für 3 LEDs sichern. Due bräuchtest 7 solcher 
Registerpaare.
1
// fly a
2
        ldd     _zl, y +FLY0 +WAVE_PTR_L                    // if FLY0->wave_ptr == 0 goto 11:  Fly don't ligthing
3
        ldd     _zh, y +FLY0 +WAVE_PTR_H
4
        sbiw    _zl, 0
5
        breq    11f
6
        ori     _flag, (1 << FLAG_WAVE)                     // any fly is ligthning
7
        lpm     _a_ocr, z+                                  // load next wave sample = FLY0->wavr_ptr*
8
        ldd     _a_ddr, y +FLY0 +WAVE_END_L                 // check iff FLY0.wave_ptr >= FLY0.wave_end, finished lightning ?
9
        cp      _zl, _a_ddr
10
        ldd     _a_ddr, y +FLY0 +WAVE_END_H
11
        cpc     _zh, _a_ddr
12
        brne    10f
13
        clr     _zl                                         // if finish setup FLY0.wave_ptr = nil
14
        clr     _zh
15
10:     std     y +FLY0 +WAVE_PTR_L, _zl
16
        std     y +FLY0 +WAVE_PTR_H, _zh
17
11:


Holt aus der WAVE Table den aktuellen PWM Wert für eine LED. Im 
aktuellen Source ist dies also 3 mal vorhanden du musst es 7 mal machen.
1
// load DDRB/PORTB values from ddr_data for current 3 flies
2
        ldi     _zl, lo8(ddr_data)
3
        ldi     _zh, hi8(ddr_data)
4
        add     _zl, _ddr_idx
5
        adc     _zh, _zero
6
        lpm     _a_ddr, z+
7
        out     _SFR_IO_ADDR(PORTB), _a_ddr
8
        lpm     _a_ddr, z+
9
        lpm     _b_ddr, z+
10
        lpm     _c_ddr, z+
11
        subi    _ddr_idx, -4
12
        andi    _ddr_idx, 0x0F
13
        brne    40f
14
        sbrs    _flag, FLAG_WAVE                            // any fly was lightning ?
15
        andi    _flag, ~(1 << FLAG_TIMER)                   // no, then reset FLAG_TIMER to signal nothing is playing
16
        andi    _flag, ~(1 << FLAG_WAVE)
17
        ldi     _yl, lo8(fireflies)                         // _fly_ptr = &fireflies[]
18
        ldi     _yh, hi8(fireflies)
19
40:     movw    _fly_ptr, _y

Holt aus dem FLASH das Mapping der LEDs. Statt für 3 LEDs musst du für 7 
LEDs diese Daten holen (lpm a_ddr, z+, Aufrufe also 7 mal).
1
// now sort each pair of DDRB/OCR0A values descending to OCR0A value == PWM dutycycle for each LED
2
        cp      _b_ocr, _c_ocr
3
        brsh    50f
4
        movw    _y, _b
5
        movw    _b, _c
6
        movw    _c, _y
7
50:     cp      _a_ocr, _b_ocr
8
        brsh    51f
9
        movw    _y, _a
10
        movw    _a, _b
11
        movw    _b, _y
12
        cp      _b_ocr, _c_ocr
13
        brsh    51f
14
        movw    _y, _b
15
        movw    _b, _c
16
        movw    _c, _y
17
51:

Sortiert nun die 3 OCR/DDR Paare, du musst 7 solcher Paare nach dem OCR 
Wert sortieren.
1
// OCR0A values must be negated
2
        neg     _a_ocr
3
        neg     _b_ocr
4
        neg     _c_ocr
5
// setup PINs
6
        or      _b_ddr, _a_ddr
7
        or      _c_ddr, _b_ddr

Negiert OCR Werte und verodert die DDR Pins für 3 LEDs, du 7 LEDs.
1
// store calculated OCR0A/DDRB pairs to ocr_data[] for Output Compare ISR
2
        ldi     _yl, lo8(ocr_data)
3
        ldi     _yh, hi8(ocr_data)
4
        movw    _ocr_ptr, _y
5
        cp      _a_ocr, _b_ocr
6
        breq    60f
7
        st      y+, _b_ocr
8
        st      y+, _a_ddr
9
60:     cp      _b_ocr, _c_ocr
10
        breq    61f
11
        st      y+, _c_ocr
12
        st      y+, _b_ddr
13
61:     st      y+, _zero
14
        st      y+, _c_ddr

Speichert die 3 -1 OCR/DDR Paare in den SRAM für die Output Compare ISR. 
Du für 7 -1 solcher Paare.

In deinem Falle musst du diese unrolled Loops wieder in Schleifen 
verbauen da dir die Register des AVRs ausgehen werden.

Gruß Hagen

von Michael H. (kochloeffel)


Lesenswert?

Danke für die sehr ausfürliche Antwort. Leider kann ich damit nichts 
anfangen, denn das Ganze überschreitet meinen derzeitigen Kenntnisstand 
bei Weitem.
Ich habe jetzt erst mal die "Originalschaltung" aufgebaut um erst mal zu 
sehen, wie es so aussieht. Leider bin ich schon an der Programmierung 
des uControllers gescheitert. Dieses mitgelieferte Progamm, mit dem man 
die firefly.hex brennen soll, kann keine Verbindung zum Chip aufbauen. 
Ich schätze mal, dass man dafür einen ISP oder JTag-Programmer braucht? 
(Ich verwendete bisher immer das Pollin Evaluationsboard mit Ponyprog)

von Hagen R. (hagen)


Lesenswert?

Du kannst das FoireFly.hex auch ohne den Bootloader flashen. Dann über 
ISP usw. Willst du den Bootloader benutzen dann musst du diesen 
natürlich als erstes drauf programmieren. Danach, also nach den Tests 
seiner Funktionen, kannst du das ISP vom AVR trennen.

Du musst aber die Bootloader Software neu kompilieren da du ja einen 
anderen AVR Prozessor benutzen möchtest. Ich würde dir dann empfehlen 
mit der aktuellesten Bootloader Version zu arbeiten, findest du hier: 
Beitrag "Re: AVR-Bootloader mit Verschlüsselung"

Gruß Hagen

von wtzm (Gast)


Lesenswert?

Hallo mitsammen,
danke für die Schaltung bzw. Idee Hagen. Ich hätte ein paar Fragen dazu:

Im Thread "umschalten zw. Solarezelle und Goldcap" gehst du genauer auf 
die Funktion der Dioden-Schaltung ein. Beim Wechsel von Dunkel auf Hell 
braucht der FET etwas Zeit um Umzuschalten, da seine Gatekapazität erst 
über den BAV70-Pullup geladen werden muss während im umgekehrten Fall T1 
das Entladen der Kapazität erledigt. Korrekt?
Wenn es nun sehr schnell hell wird zB aufgrund eines Blatts, das die 
Solar-Zelle verdeckt hat und vom Wind entfernt wird, würde die Spannung 
auf PB3 des AVR für die Zeit, die Q1 zum Öffnen braucht unter GND Niveau 
fallen. Ist das deswegen nicht weiter tragisch weil die Spannung an der 
Zelle in dieser Zeit einfach nicht so schnell fallen kann, dass es zu 
Schaden am AVR kommt? Mir ist natürlich klar, dass der AVR Schutzdioden 
(und Q1 seine Body-Diode) hat, aber ich hätte da halt ein ungutes 
Gefühl.

Dass Du statt Widerständen eine BAV70 genommen hast, liegt nicht 
irgendeiner Weise daran, dass sie eine Diode ist, sondern einfach nur am 
hohen Widerstand in Rückwärtsrichtung, oder? Andersgesagt - außer dass 
ich mit zusätzlichem Standbystrom im einstelligen µA Bereich rechnen 
muss, sollts beim Ersatz der Diode durch 2x 1M oder ähnliches kein 
anderes Verhalten geben.

Die Frage ist wahrscheinlich beim Ersatz von D1 durch 2x R eh hinfällig, 
aber sind für T1 und T3 jeweils die Versionen mit dem höchsten HEF 
nötig? BCW61 kann ich bei Farnell nicht finden, ein BCX71 wirds aber 
wohl auch tun. Ein Ersatz für T1 mit niedrigerem Leckstrom lässt sich 
zwar finden (wie im anderen Thread erwähnt), allerdings hab ich den 
Eindruck, dass die Alternativen dann auch wieder eine niedere HFE haben.

Meine Solarzelle schafft bei voller Sonneneinstrahlung einen Strom von 
~20mA durch einen ziemlich vollen Akku zu treiben was für eine 
Erhaltungsladung doch relativ heftig ist. Meine Anwendung wird im Sommer 
sicher nicht so viel Energie benötigen wie während des Tages gesammelt 
wird, daher war meine Überlegung entweder (a) an einem der AVR Pins 
einen Widerstand (oder Led etc.) den ich bei Bedarf einschalten kann zu 
setzen oder (b) einen baugleichen FET mit Drain und Source vertauscht in 
Serie zu schalten, damit ich per Software weiteres Laden unterbinden 
kann. Allerdings hätte ich bei Variante (b) dann wieder das Problem, 
dass negative Spannung an PB3 liegt.
Außerdem ist mir nicht so recht klar, welchen Schwellwert ich für 
"Akku-voll" annehmen soll. Was ich gelesen haben sehen die 
Ladealgorithmen für NiMH so aus, dass geladen wird bis es nach dem 
Spannungsscheitelwert zu einem leichten Rückgang kommt. Oder aber man 
führt (genau) Buch darüber wieviel Strom in den Akku hineingepumpt 
wurde. Beides kommt mir etwas sehr aufwendig vor; die simple Variante 
wird wohl sein U(voll) auf 1.25 oder 1.30 festzusetzen und es damit gut 
sein zu lassen. Natürlich mit etwas Hysterese. Wie seht Ihr das?


Danke fürs Lesen &
Beste Grüße

von Randy (Gast)


Lesenswert?

> Meine Solarzelle schafft bei voller Sonneneinstrahlung einen Strom von
> ~20mA durch einen ziemlich vollen Akku zu treiben was für eine
> Erhaltungsladung doch relativ heftig ist.

Ich hab kein Hersteller-Datenblatt, jedoch gibt es mehrere Quellen die 
besagen dass Dauerladen mit C/20 relativ problemlos sein sollte. Und 
ständig in der prallen Sonne steht das Ding ja nicht.
http://www.jens-seiler.de/bastelecke/akkus/
http://www.motelek.net/allgemein/akkus/nixx_akku.html
Da hab ich mir keinen Kopf drum gemacht, Akkus sind eh 
Verschleißteile...

Randy

von Randy (Gast)


Lesenswert?

> Außerdem ist mir nicht so recht klar, welchen Schwellwert ich für
> "Akku-voll" annehmen soll. Was ich gelesen haben sehen die
> Ladealgorithmen für NiMH so aus, dass geladen wird bis es nach dem
> Spannungsscheitelwert zu einem leichten Rückgang kommt.

Beim langsamen Laden ist es in der Tat unmöglich zu sagen wann der Akku 
voll ist. Das geht nur mit besagtem Delta-U was vorraussetzt dass mit 
mind. C/4 geladen wird.

Randy

von wtzm (Gast)


Lesenswert?

Danke für die Links, Randy.
Bei dem Akku der in der Leuchte drinnen waren (lt. Beschriftung 600mAh) 
kommt der Strom ziemlich genau auf die C/20 hin. Wahrscheinlich wird die 
original Elektronik der Leuchte den Stromfluss auch weiterlaufen lassen.

von Hagen R. (hagen)


Lesenswert?

>Im Thread "umschalten zw. Solarezelle und Goldcap" gehst du genauer auf
>die Funktion der Dioden-Schaltung ein. Beim Wechsel von Dunkel auf Hell
>braucht der FET etwas Zeit um Umzuschalten, da seine Gatekapazität erst
>über den BAV70-Pullup geladen werden muss während im umgekehrten Fall T1
>das Entladen der Kapazität erledigt. Korrekt?

Ja.

>Wenn es nun sehr schnell hell wird zB aufgrund eines Blatts, das die
>Solar-Zelle verdeckt hat und vom Wind entfernt wird, würde die Spannung
>auf PB3 des AVR für die Zeit, die Q1 zum Öffnen braucht unter GND Niveau
>fallen. Ist das deswegen nicht weiter tragisch weil die Spannung an der
>Zelle in dieser Zeit einfach nicht so schnell fallen kann, dass es zu
>Schaden am AVR kommt? Mir ist natürlich klar, dass der AVR Schutzdioden
>(und Q1 seine Body-Diode) hat, aber ich hätte da halt ein ungutes
>Gefühl.

Dann würde bei < -0.7 Volt aber die Bodydiode des MOSFETs zuschlagen.

>Dass Du statt Widerständen eine BAV70 genommen hast, liegt nicht
>irgendeiner Weise daran, dass sie eine Diode ist, sondern einfach nur am
>hohen Widerstand in Rückwärtsrichtung, oder? Andersgesagt - außer dass
>ich mit zusätzlichem Standbystrom im einstelligen µA Bereich rechnen
>muss, sollts beim Ersatz der Diode durch 2x 1M oder ähnliches kein
>anderes Verhalten geben.

Korrekt, ist eine Stromsparmaßnahme. Sinn der Schaltung ist es ja das 
diese "Diode" schon bei > 10µV aufmacht und so minimalsten Volrtagedrop 
hat und somit schon leichte Mehrspannungen des Solarpanels ausgenutzt 
werden zum Laden.

>Die Frage ist wahrscheinlich beim Ersatz von D1 durch 2x R eh hinfällig,
>aber sind für T1 und T3 jeweils die Versionen mit dem höchsten HEF
>nötig?

Besser wäre es da dadurch der minimale Volrtagedrop dieser "Diode" 
beeinflusst wird.

>Meine Solarzelle schafft bei voller Sonneneinstrahlung einen Strom von
>~20mA durch einen ziemlich vollen Akku zu treiben was für eine
>Erhaltungsladung doch relativ heftig ist.

20mA halte ich für viel für kleine Solarpanels. Messe die Impedanz des 
Solarpanels, sie sollte bei 1k liegen, bzw. in jedem Falle höher als der 
Innenwiderstand des Akkus. Wenn dem so ist kann das Solarpanel den Akku 
nie überladen.

In deinem Falle kannst du dann aber auch die "ideale Diode" ersetzen 
durch eine Shottky Diode.

>Außerdem ist mir nicht so recht klar, welchen Schwellwert ich für
>"Akku-voll" annehmen soll. Was ich gelesen haben sehen die
>Ladealgorithmen für NiMH so aus, dass geladen wird bis es nach dem
>Spannungsscheitelwert zu einem leichten Rückgang kommt. Oder aber man
>führt (genau) Buch darüber wieviel Strom in den Akku hineingepumpt
>wurde. Beides kommt mir etwas sehr aufwendig vor; die simple Variante
>wird wohl sein U(voll) auf 1.25 oder 1.30 festzusetzen und es damit gut
>sein zu lassen. Natürlich mit etwas Hysterese. Wie seht Ihr das?

Voll geladene NiMH Akkus haben bei mir 1.4V, professionelles Ladegerät.

Wie gesagt, mit entsprechendem Solarpanel kannst du NiMH Akkus nicht 
überladen.

Bei mir ist eher das Problem das die Gesamtpower des Solarpanels auf 
Dauer eben nicht ausreichend ist. Ich muß so alle halbe Jahre extern den 
Akku laden.

In deinem Falle kannst du im AVR die Software erweitern und einen 
Counter hoch/runterzählen der das Ratio zwischen Akku-Voll-Zeiten zu 
Glühwürmchen-Leucht-Zeiten mitführt. Wenn dieser Counter dann zb. einen 
Threshold übersteigt so dürfen die Glühwürmchen Nachts häufiger und 
heller leuchten. Sie verbrauchen also die überschüssige Energie in Ratio 
zur gesammelten Energie.

Gruß Hagen

von Randy (Gast)


Lesenswert?

> Messe die Impedanz des
> Solarpanels, sie sollte bei 1k liegen, bzw. in jedem Falle höher als der
> Innenwiderstand des Akkus. Wenn dem so ist kann das Solarpanel den Akku
> nie überladen.

Wie soll die "Impedanz des Solarpanels" definiert sein? Mit dem 
Ohm-Messbereich des Multimeters wird man nichts aussagekräftiges messen 
können. Der Innenwiderstand eines typischen AAA-Akkus liegt bei <1 Ohm.

> Bei mir ist eher das Problem das die Gesamtpower des Solarpanels auf
> Dauer eben nicht ausreichend ist. Ich muß so alle halbe Jahre extern den
> Akku laden.

Ich denke das kommt stark auf den Standort an. Bekommt das Glas bei dir 
auch ab und zu mal direkte Sonne?

Randy

von wtzm (Gast)


Lesenswert?

> 20mA halte ich für viel für kleine Solarpanels. Messe die Impedanz des
> Solarpanels, sie sollte bei 1k liegen

Eine U/I Testreihe habe ich nur bis zu einem kleinsten Widerstand von 
1.5 Ohm gemacht, in dieser Region (bzw. bei etwas höheren Widerständen) 
würde ich auf einen differentiellen Widerstand des Panels von ca. 1100 
Ohm kommen.

von Randy (Gast)


Lesenswert?

> Eine U/I Testreihe habe ich nur bis zu einem kleinsten Widerstand von
> 1.5 Ohm gemacht, in dieser Region (bzw. bei etwas höheren Widerständen)
> würde ich auf einen differentiellen Widerstand des Panels von ca. 1100
> Ohm kommen.

Klar, in der Region sehr kleiner Lastwiderstände, d.h. bei Spannungen an 
der Solarzelle sehr viel kleiner als die Leerlaufspannung, liefert die 
Zelle im wesentlichen einen konstanten Strom, ihren Kurzschlussstrom.
http://www.physik.uni-augsburg.de/~ferdi/umweltpraktikum/solar/node9.html
Damit berechnet man natürlich einen hohen differenziellen Widerstand. 
Ich sehe aber nicht inwieweit dieser Widerstnad eine Bedeutung für das 
Akku-Überlade Thema hat. Solang die Akkuspannung nicht nahe an die 
Leerlaufspannung der Solarzelle steigt(*) , pumpt die Solarzelle immer 
den Strom in den Akku der der aktuellen Beleuchtung entspricht.

Randy

(*) und das kommt sie nicht: Normale Ladespannung mind. 1,4V, das muß 
die Solarzelle auch liefern können. Spannung bei Überladung mit 
moderatem Strom, z.B. C/10, auch nicht mehr als höchstens 1,5-1,55V.

von wtzm (Gast)


Lesenswert?

> ... liefert die Zelle im wesentlichen einen konstanten Strom, ihren
> Kurzschlussstrom
Womit wir also eine Konstantstromquelle mit C/20 haben, also alles in 
Ordnung. Ich glaube eh nicht mehr, dass die Gefahr einer Überladung 
besteht.

Eine Frage hätte ich noch an Hagen: Der FET wird in der Schaltung mit 
sehr niedriger Vgs betrieben - im besten Fall 1.3V wenn der Akku 
komplett voll ist. Falls jetzt der Akku leer ist (0.9V) würde ich 
meinen, dass durch die noch niedrigere Vgs der Ladestrom auf derart 
niedrige Wert begrenzt wird, dass eine Wiederaufladung des Akkus sehr 
lange dauern würde.
Im Infineon Datenblatt zum BSS138 ist eine typische Gate Threshold 
Voltage von 1.0V angegeben. Bei einem Drainstrom von 26µA allerding. 
Fairchild gibt typische 1.3V für 1mA an.

von Hagen R. (hagen)


Lesenswert?

Korrekt, und ab einer gewissen Unterschreitung muß die interne Bodydiode 
leiten. Aber es geht ja garnicht um den Fall wenn die Akkuspannung zu 
klein zum Öffnen des MOSFETs ist, sondern um den Fall darüber. 
Normalerweise sollte der Akku Nachts über also nicht unter die Gate 
Threshold Spannung des MOSFETs entladen werden. Tags über soll möglichst 
alle Eneregie in den Akku fließen ohne den Voltagedop von min. 200mV 
wenn man eine Shottkydiode benutzen würde. Sogesehen sollte der Akku 
nicht unter 0.7 Volt entladen werden. Ein Grund der Vorltagedrop der 
interen Bodydiode des MOSFETs falls dieser bei 0.7V am Gate nicht mehr 
ordentlich leitet. Der andere Punkt ist der Stepup Wandler der nur bis 
>0.7V runter anschwingt und nur wenn er schon läuft auch unter 0.7V 
arbeitet.

Gruß Hagen

von Robert (Gast)


Lesenswert?

Kann statt dem BSS138 auch ein BSS123 verwendet werden??

In welchem Gehäuse sind die beiden Kondensatoren C1 und C2??

Danke im Voraus
lg Robert

von Hagen R. (hagen)


Lesenswert?

1206'er SMD, sind übrigens nur 4.7µ verbaut worden.

BSS123 hat mit 1V höhere VGS(th), der BSS138 hat laut Datenblatt 0.5V.
Ansonsten sind bei diesen kleinen MOSFETs nur 2 Dinge wichtig: Gate 
Threshold Spannung und das es N-Kanal MOSFETs sind.

Du kannst auch ganz auf diese Schaltung verzichten und mit einer 
besseren Schottky Diode arbeiten. Bei dieser Schaltung geht es nur um 
die 200mV Spannungsabfall an der Schottky Diode der entstehen würde und 
der mit dieser Schaltung auf ~10µV reduziert wird.

Gruß Hagen

von wtzm (Gast)


Lesenswert?

Danke auf jeden Fall mal an alle, meine Fragen sind fürs erste 
beantwortet. Was mir noch beim durchschauen der Datenblätter aufgefallen 
ist, dass es anscheinend beim BSS138 je nach Hersteller doch heftig 
verschiedene Drain-Source Widerstände im durchgeschalteten Zustand gibt. 
Wobei wahrscheinlich auch die Frage ist welcher Prozentsatz der 
Exemplare bei der Berechnung der "Typical Characteristics" einbezogen 
wird.

von Hagen R. (hagen)


Lesenswert?

Der RDS(on) ist relativ unwichtig solange er nicht im kOhm Bereich liegt 
und das Solarpanel nicht ganze Ampere an Strom liefert. Beides bei 
diesem Projekt nicht der Fall. Die VGS(th) ist der wichtigste Parameter 
und sollte so niedrig wie möglich sein, mindestens < 0.7V. Die per ADC 
ermittelte Abschaltspannung sollte demnach > VGS(th) und > 0.7V Startup 
Voltage des Stepups sein. Der normale Arbeitsbereich der "iealen Diode" 
liegt also bei > 0.7V bis maximale Akkuspannung. In diesem Bereich 
wünschen wir uns das der Voltagedrop über diese Diode möglichst 0V ist 
da somit die volle Energie des Solarpanels benutzt wird. Wie gesagt, wer 
mit 200mV Verlust in diesem Bereich leben kann nimmt eine Schottky 
Diode.

Gruß Hagen

von Michael H. (kochloeffel)


Angehängte Dateien:

Lesenswert?

Hallo und Sorry,
also irgendwie tue ich mich mit dem Schaltbind Schwehr, also wenn ich 
mit Zwei Akkus direkt reinfahre ohne den Max??? und der schaltung dazu, 
dann sollte doch die Schaltung wenn ich es richtig gelesen habe etwa so 
aussehen, zumindest die LED Anschlüsse?

Im Anhang habe ich das Schaltbild mitgeschickt.

Und hier noch die Erklärung zu den Anschlüssen:

LED Paar:
-->|--
--|<--

1A und 1B = LED Paar 1    PB0-PB1
2A und 2B = LED Paar 2    PB0-PB2
3A und 3B = LED Paar 3    PB0-PB5
4A und 4B = LED Paar 4    PB1-PB2
5A und 5B = LED Paar 5    PB1-PB5
6A und 6B = LED Paar 6    PB2-PB5

und an + und GND 2x 1,2 V = 2,4 V

Habe ich das richtig verstanden weil wenn ja dann kommt man auch mit nur 
Drei Wiederständen aus?
In der Schaltung steht Tiny13 einen 45er hatte das Programm nicht in 
seiner Bibliothek.

Im vorraus schon einmal vielen Dank.
LG
Michael

von Michael H. (kochloeffel)


Angehängte Dateien:

Lesenswert?

Hatte mich vertahn war wohl zu früh hier das verbesserte Schaltbild, 
sind doch Vier Wiederstände.

1A und 1B = LED Paar 1    PB0-PB1
2A und 2B = LED Paar 2    PB0-PB2
3A und 3B = LED Paar 3    PB0-PB5
4A und 4B = LED Paar 4    PB1-PB2
5A und 5B = LED Paar 5    PB1-PB5
6A und 6B = LED Paar 6    PB2-PB5

LG
Michael

von Randy (Gast)


Lesenswert?

Warum hast du die LED-Vorwiderstände so seltsam angeordnet? Die 
Widerstände müssen dirkt an den entspr. Portpin. Die drei Strippen zu 
den LEDs kommen auf den anderen Anschluss des Widerstandes. So dass der 
Strom immer über zwei Widerstände fließen muß, egal welche Kombination 
von Pins eingeschaltet ist. Nur so sind alle LEDs gleich hell.

HTH
Randy

von Michael H. (kochloeffel)


Angehängte Dateien:

Lesenswert?

Hallo Randy,
Meinst Du etwa So?
LG
Michael

von Randy (Gast)


Lesenswert?

> firefly1a.pdf

Ja, genau so.

von Roland S. (rolandsz)


Lesenswert?

Hallo zusammen,

ich habe mir mal die Idee der "Glühwürmchen im Rotkohlglas" 
aufgegriffen,
etwas vereinfacht und als Programmpunkt des diesjährigen Ferienprogramms
für Kinder angeboten ;-)

Bilder dazu im Anhang...

Viele Grüße aus Kraichtal, Roland

von Roland S. (rolandsz)


Angehängte Dateien:

Lesenswert?

Bild_1

von Roland S. (rolandsz)


Angehängte Dateien:

Lesenswert?

Bild_2

von Roland S. (rolandsz)


Angehängte Dateien:

Lesenswert?

Bild_3

von Roland S. (rolandsz)


Angehängte Dateien:

Lesenswert?

Bild_4

von Roland S. (rolandsz)


Angehängte Dateien:

Lesenswert?

und Bild_5

von Randy (Gast)


Angehängte Dateien:

Lesenswert?

Zur diesjährigen Bastelsaison habe ich ein Layout für meine Version der 
Glühwürmchen-Schaltung erstellt. Diese unterscheidet sich vom Original 
in den Punkten:

- es werden 2 Mikro-Zellen verwendet; ohne Step-Up
- Der Code ist auf einen Tiny44 umgeschrieben, damit braucht man
  keinen Bootloader weil der Reset-Pin keine weitere Aufgabe bekommt.
- Die Lichtmessung erfolgt über einen LDR, nicht über die Solarzelle
- Es gibt einen Watchdog

Zum letztem Punkt: Bei mir hat immer nach spätestens ein paar Tagen der 
Controller seinen Dienst eingestellt. Das liegt möglicherweise an der 
gcc V3 vs. V4 Problematik die im Juni angesprochen wurde. Das hab ich 
allerdings nicht verifiziert, denn die Lösung mit dem Watchdog war schon 
seit Januar fertig und hat funktioniert. Der Watchdog ist ein Programm 
im Tiny45 das den Glühwürmchen-uC resettet wenn der 30 Minuten keine 
Aktivität zeigt. Das kann er dadurch detektieren dass der Tiny44 zum 
messen der Helligkeit den Pin 6 (PA7) kurz auf High legt um den 
Spannungsteiler R6/LDR mit Strom zu versorgen. Misst der Tiny44 mehr als 
30 Minuten die Helligkeit nicht (=keine Aktivität), bekommt er einen 
Reset.
Der ISP-Stecker (aus 
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Equipment#Selbstbau) 
hat einen 7.Pin bekommen, so dass er nach dem Programmieren als Stecker 
für die LED-Ketten dienen kann.
Das Layout habe ich nur in der Version 1.0 gebaut, die 1.1 ist das 
Ergebnis der Inbetriebnahme ;-) Hoffe dass ich alle Fehler korrekt 
berichtigt habe. Falls es jemand nachbaut freue ich mich über ein 
Feedback.

Randy

von Randy (Gast)


Lesenswert?

Nachtrag:
Im Layout sind zwei Luftlinien verblieben, das ist der Preis für das 
einseitige Layout. Die Verbindungen muß man mit zwei Drähten manuell 
einfügen.

von Thomaso (Gast)


Lesenswert?

@Randy

Hab deine Schaltung mit den beiden Tinys (44V und 45V) geätzt und 
gelötet, die Luftleitungen sind drin.
Hab jetzt einfach mal deine beiden Hex-Files aufgespielt und es tut 
sich...mmmmh...naja, ein bißchen was.
Hab im Moment 3 Test-LEDs dran (zwischen 2-5, 2-7, 4-5 gemäß deiner 
Steckerleiste), doch irgendwie scheint immer nur das gleiche Muster im 
gleichen zeitlichen abstand bei genau einer LED (4-5) abzulaufen?!?!

Kann ich überhaupt einfach deine Hex-Files aufspielen, ohne das es 
irgendwelche Probleme gibt? Muss ich irgendwas aufs EEProm spielen?

Zweites Problem: Ich kann die Files für den Tiny44 nicht kompilieren 
(tiny45=watchdog funktioniert): folgende Fehlermeldung tritt auf:
1
> "make.exe" all
2
3
-------- begin --------
4
avr-gcc (GCC) 4.2.2 (WinAVR 20071221)
5
Copyright (C) 2007 Free Software Foundation, Inc.
6
This is free software; see the source for copying conditions.  There is NO
7
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
8
9
10
Compiling C: firefly.c
11
avr-gcc -c -mmcu=attiny44 -I. -gdwarf-2 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./firefly.lst  -std=gnu99 -Wundef -MMD -MP -MF .dep/firefly.o.d firefly.c -o firefly.o 
12
13
Linking: firefly.elf
14
avr-gcc -mmcu=attiny44 -I. -gdwarf-2 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=firefly.o  -std=gnu99 -Wundef -MMD -MP -MF .dep/firefly.elf.d firefly.o --output firefly.elf -Wl,-Map=firefly.map,--cref     -lm
15
firefly.o: In function `eeprom_read_block':
16
c:/winavr/bin/../avr/include/avr/eeprom.h:268: undefined reference to `seed'
17
c:/winavr/bin/../avr/include/avr/eeprom.h:268: undefined reference to `seed'
18
firefly.o: In function `init':
19
C:\Dokumente und Einstellungen\tw\Desktop\glühtest/firefly.c:64: undefined reference to `lfsr_poly'
20
firefly.o: In function `update_fireflies':
21
C:\Dokumente und Einstellungen\tw\Desktop\glühtest/firefly.c:75: undefined reference to `lfsr'
22
make.exe: *** [firefly.elf] Error 1
23
24
> Process Exit Code: 2
25
> Time Taken: 00:02

Weiß jemand Rat? Was muss ich ändern, damit ich die Files kompilieren 
kann?

Man, das Microcontrollerzeugs kann echt deprimierend sein =(

Grüße,

Thomaso

von Randy (Gast)


Lesenswert?

Hallo Thomaso,

> Hab im Moment 3 Test-LEDs dran (zwischen 2-5, 2-7, 4-5 gemäß deiner
> Steckerleiste), doch irgendwie scheint immer nur das gleiche Muster im
> gleichen zeitlichen abstand bei genau einer LED (4-5) abzulaufen?!?!

Wie lang hast du es laufen lassen? Manchmal kommen über mehrere Minuten 
nur recht eintönige Muster mit nur wenigen LEDs.

> Kann ich überhaupt einfach deine Hex-Files aufspielen, ohne das es
> irgendwelche Probleme gibt? Muss ich irgendwas aufs EEProm spielen?

Das sollte so passen, ich hab auch nie was ins EEPROM geschrieben.

> C:\Dokumente und Einstellungen\tw\Desktop\glühtest/firefly.c:64:
> undefined reference to `lfsr_poly'

Ich hab die orig. Software nicht geschrieben, nur für den Tiny44 
angepasst, deshalb durchblicke ich auch nicht alle Funktionen. Und auch 
mit dem WinAVR kämpfe ich manchmal, wenn sich ein Programm auf einem 
Rechner kompilieren lässt, und ein anderer Rechner mit einer anderen 
Version von WinAVR seinen Dienst verweigert.
Deshalb kann ich keine fundierten Tipps geben. Als einziges ist mir 
aufgefallen dass dein Pfad Leerzeichen und Umlaute enthält, würde mal 
Prüfen ob nicht das die Quelle des Ungemachs ist. Und auch mal im 
makefile schauen, da stehen manchmal absolute Pfade drin, die können bei 
deinem Rechner anders sein.

Randy

von Randy (Gast)


Lesenswert?

Noch ein Hinweis:

Beim ISP/LED-Stecker liegt auf Pin 1 die Betriebsspannung. Die ist für 
den Programmer notwendig, führt aber dazu dass eine LED durchbrennt wenn 
man man den Stecker mit den LED-Ketten um einen Pin versetzt aufsteckt. 
Deshalb hab ich nach dem Programmieren Pin 1 abgezwickt, damit ein 
Fehler beim Zusammenbauen nicht die Hardware zerstört. Falls man doch 
noch mal programmieren muß kann man die Spannung für den Programmer ja 
manuell zuführen.

Randy

von Randy (Gast)


Lesenswert?

> Kann ich überhaupt einfach deine Hex-Files aufspielen, ohne das es

Nur eins noch: Die Fuse für 8MHz RC-Clock setzen, d.h. die Clock_Div_8 
setzen/löschen, ich weiß jetzt nicht. Auf jeden Fall ggü. dem 
Default-Wert negieren.

Randy

von Thomaso (Gast)


Lesenswert?

Danke für die schnelle Antwort, Randy!

Die Fuses sind auf 8Mhz interner Takt und der interen Div8-Teiler is 
ausgeschaltet... Müsste also mit 8Mhz laufen.

Mit dem Stecker selbst dürfte es keine Probleme geben, da ich die 
Drähtchen direkt anlöte (also ohne Stecker =)

Das kompilieren klappt immernoch nicht, aber solangs auch mit deinen 
Hex-Files geht, sollte es ja irgendwie klappen =)

Werd jetzt die kommenden Tage mal die restlichen LEDs dranbaun und 
schaun, was passiert. Meld mich dann wieder!

Vielen Dank schönmal

Thomaso

von tripledot (Gast)


Lesenswert?

N'Abend...


könnte jemand, der sich mit dem Thema hier eingehend befasst hat (mir 
fehlt die Zeit mich mit dem Bug/ Neucompilieren auseinander zu setzen), 
bitte eine fertige .hex Version des Projektes posten, die auf Hagens 
ursprünglichen Schaltplan passt?

Zu meiner Motivation....ich möchte nur ein hübsches Geschenk basteln, 
das nach Möglichkeit keinen Bug hat. Für das Hineindenken bleibt mir 
leider keine Zeit, um die hier aufgeführten Gedanken in den 
ursprünglichen Code einzuflechten.

Mit der Bitte um Nachsicht....
Hannes



PS: Vielen Dank!

von DiscoStu (Gast)


Lesenswert?

Fänd ich auch klasse,wenn sich mal jemand die Mühe machen würde und eine 
aktuelle Version für das Programm und die Schaltung von Hagen zu posten. 
Hier sind so viele Änderungen was Software und Bauteile und Pinbelegung 
angeht, das es echt unübersichtlich geworden ist.Thx Olli

von Randy (Gast)


Lesenswert?

> könnte jemand, der sich mit dem Thema hier eingehend befasst hat (mir
> fehlt die Zeit mich mit dem Bug/ Neucompilieren auseinander zu setzen),
> bitte eine fertige .hex Version des Projektes posten, die auf Hagens
> ursprünglichen Schaltplan passt?

Das habe ich nicht, ich kann nur sagen dass meine Variante im Beitrag 
vom 23.11.2009 schon seit Monaten funktioniert.

Randy

von Stefan G. (dreamer83)


Lesenswert?

Guten Abend,

hatte das Projekt vor ner Zeit nachgebaut aber dann in die Ecke gelegt, 
da nach etwa 2-3 Stunden die LED's in der Nacht aufgehört haben zu 
leuchten, trotz vollem Akku.

Nun hab ich das ganze malhervorgeholt und das Programm etwas 
durchgesehen. dabei bin ich auf 2-3 Kleinigkeiten gestoßen die mir nicht 
so ganz einleuchten.

Ich verwende eine Mignon-Zelle und nen Tiny85.

Die Watchdog Routine hab ich nach dem Post von Randy am 18.12.2008 18:35 
entsprechend auf
1
    if (--idx > 7) idx = ((idx & 0x07) | (1 << WDP3));  
2
    idx |= (1 << WDIE);                  // enable WDT-ISR
3
    wdt_reset();
4
    WDTCR |= (1 << WDE) | (1 << WDCE);
5
    WDTCR  = idx;
 angepasst.

Wieso wird wenige Zeilen weiter unten erst WDE und WDCE gesetzt, wenn 
anschließend das ganze Register mit "idx" überschrieben?

Des weiteren hab ich ne Frage zum Auslesen der Batterie-/Solarspannung.
Gehe ich richtig in der Annahme, dass die beiden Byte Werte im RAM 
vertauscht, gehören? Müsste ja so sein, durch LittleEndian,...

So habe die Software zum testen so umgebaut das ständig Nacht ist. 
Weiter hab ich
1
MEASURE_INTERVAL    (uint16_t)(625)
 gesetzt. Die LED'S beginnen nach 1 Minute zu blinken. Jedoch ist es nun 
nach etwa 70 Minuten dunkel und auch nach 3 Stunden hat nichts mehr 
angefangen. Die Spannung liegt bei etwa 1.2, also vollkommen im grünen 
Bereich.

Wer hätte nen Tip?

Gruß Stefan

von Stefan G. (dreamer83)


Lesenswert?

Desweiteren ist mir im Datenblatt auf Seite 49 aufgefallen, das WDP 
maximal auf 1001 stehen darf, alle höheren Bit-Kobinationen sind 
reserviert. Allso müsste die Zeile doch folgendermaßen lauten ?
1
    if (--idx > 7) idx = ((idx & 0x01) | (1 << WDP3));  // neue Idee ??
2
//    if (--idx > 7) idx = ((idx & 0x07) | (1 << WDP3));  // max timeout setzen

Gruß Stefan

von Stefan G. (dreamer83)


Lesenswert?

So, nachdem das Projekt eine Zeit gelegen hatte hab ich mich die Tage 
mal wieder dran gemacht den Fehler zu finden, wieso die Schaltung nur 
die erste Nacht funktionierte und dies auch nur, wenn sie bei Dunkelheit 
eingeschaltet wurde. Da es beim Vorgaukeln ständiger Nacht funktionierte 
erwartete ich den Fehler in der Software bei der AD-Messung. Naja 
inzwischen bin ich mal wieder belehrt worden, immer alle Teile der 
Schaltung in betracht zu ziehen,...

Der Übeltäter ist die linke der beiden Doppeldioden. Nach dem ersten 
Nacht-Tag wechsel fingen die kleinen nicht mehr an. Nach einer Berührung 
der Platine bei den Transistoren lief sie plötzlich wieder an.
Der finale Grund ist, dass der Leckstrom der Diode einen zu geringen 
Spannungsabfall erzeugt, das die Transistoren wieder schließen.

Ein Wiederstand von 10M Ohm, der noch in meiner Bastellkiste war, über 
die linke Diode nach Bat+ reichen vollkommen aus.

Sollte es bei euch nicht laufen, könnte es an dieser Kleinigkeit liegen.

Gruß Stefan

PS:
Ist da nicht noch ein gedanklicher Fehler in der wave.h ?
Es wird die wavetable definiert mit
1
prog_uint8_t wave[827] = {...
somit hat sie ja 827 Stellen, adressiert wird aber von 0... 827
1
wave_data_t wave_data[32] = {
2
  {&wave[   0], &wave[  26],  832},
3
  {&wave[   0], &wave[  99],  865},
4
...
5
  {&wave[ 534], &wave[ 827],  987},
6
  {&wave[ 693], &wave[ 827],  927}
Das ganze sollte evtl. in den Umsetzungen bedacht werden.

Stefan

von Hagen R. (hagen)


Lesenswert?

@Stefan:

Tja, Unterschied zwischen Simulation und Realität. In der Simulation mit 
LTSpice zeigte sich das mit den Dioden der geringste Stromverbrauch (µA 
Bereich) zu erreichen ist. In der Realität ist das Ganze viel zu 
hochohmig und deshalb erwähnte ich irgendwo hier das man besser 
Widerstände dafür nehmen sollte. Bei mir geht es aus irgendeinem Grund 
bei mehreren Aufbauten, ich schätze das mein selbstgeätztes Layout daran 
"Schuld" ist.

Danke für den Tipp.

Ansonsten kann man ja auch diese "ideale Diode" auch einfach komplett 
durch eine Shottky ersetzen.

Gruß Hagen

von Hagen R. (hagen)


Lesenswert?

>somit hat sie ja 827 Stellen, adressiert wird aber von 0... 827

>wave_data_t wave_data[32] = {
>  {&wave[   0], &wave[  26],  832},
>  {&wave[   0], &wave[  99],  865},
>...
>  {&wave[ 534], &wave[ 827],  987},
>  {&wave[ 693], &wave[ 827],  927}

>Das ganze sollte evtl. in den Umsetzungen bedacht werden.

Nein ist richtig so, musste aber auch erstmal drüber nachdenken da du 
mich im ersten Moment überrumpelt hast ;)

Das sind Zeiger in die Wave-Tabelle. Der Zeiger &Wave[827] zeigt damit 
hinter das letzte Byte der Wave Tabelle und somit an das Ende. 
wave_data[] enthält also einen Zeiger mit dem Start der Wave und einen 
Zeiger auf das Ende der Wave +1 Sample. Der Start wird geladen und 
solange inkrementiert bis er auf Ende steht.

Nur der erste Zeiger (Start) wird zum Zugriff auf die Waves[] benutzt. 
Der zweite zeiger dient als Vergleichwert mit dem internen Zeiger der 
mit Start initialisiert wird und immer +1 inkrementiert wird bis er eben 
auf Ende steht.

Man hätte nun statt einen Ende-Zeiger einen Samples-Zähler benutzen 
können. Das führt aber dazu das man entweder

1.) eine Endevariable auf Start + Sample_Count initialisieren muß oder
2.) in der Zählschleife sowohl den aktuellen Samplezeiger +1 wie auch 
Sample_Counter -1 rechnen muß

Somit ist das eine Optimierung durch Vorausberechnung und man lädt 
einfach Start in den Samplezeiger und vergleicht diesen mit dem Ende 
Zeiger und inkremeniert nur eine Variable den Samplezeiger.

Das dient der Codeoptimierung letzendlich. Denn ich lade die Wave Sample 
mit LPM r,Z+ also mit implizitem Postinkrement. Nach dem Laden steht der 
Zeiger Z also, wenn er das Ende erreicht hat, auf +1 Samples hinter der 
Wave. Danach wird er mit Ende verglichen.

Ein Marker in den Samples geht nicht. Dh. man definiert einen speziellen 
Samplewert der als Endemarke in den Waves[] drinnen steht. Das geht 
nicht weil die verschiedenen Leuchtmuster alle in Waves[] gespeichert 
sind und sich überschneiden, also Teile des einen Leuchtmusters werden 
durch ein anderes Leuchtmuster mit benutzt.

Gruß Hagen

von Joachim R. (bastelbaer)


Lesenswert?

Hi Leute, ich habe ein kleines Problem mit der Schaltung von Randy. Ich 
habe die Version nachgebaut. Nur läuft sie nicht richtig. Nach dem 
Einschalten (LDR abgeklemmt) fangen verschiedene LEDs nach ca.20 
Sekunden an zu flackern und gehen teilweise in Dauerleuchten über. Also 
keine 6 Minuten bis es losgeht. Dann irgendwann gehen sie aus und das 
Spiel beginnt von vorne.

Ich habe den Code auch schon selbst kompiliert, ohne Erfolg. Die Fuses 
habe ich kontrolliert und glaube sie stimmen (L=E2, H=DF, E=FF).

Geflasht hab ich versuchsweise mit BASCOM und avrdude, beidesmal ohne 
Fehler. Verify gegeneinander war auch ok.

Irgendjemand ne Ahnung wo ich suchen könnte.

von Stefan G. (dreamer83)


Lesenswert?

Hallo,

es hat den Anschein das etwas mit det Taktfrequenz oder dem Measure 
intervll nicht passt.
1
#define MEASURE_INTERVAL    (uint16_t)(5 *  3750)       // each 6 minutes measure interval
Der Controller sollte mit 8MHz laufen. CLKDIV müsste rausgenommen 
werden.

Viel Erfolg beim weiteren Testen.

Stefan

von Randy (Gast)


Lesenswert?

> Nach dem
> Einschalten (LDR abgeklemmt) fangen verschiedene LEDs nach ca.20
> Sekunden an zu flackern

Das mit den 20 Sekunden ist ok, ich hab bei meiner Variante des Codes 
die Wartezeit reduziert um den Vorführeffekt zu verbessern - wer will 
schon 6 Minuten im dunklen Zimmer warten um den Effekt zu sehen. 20 
Sekunden waren der Kompromiss zwischen Stromverbrauch und erträglicher 
Wartezeit.
Zum Rest kann ich nicht viel sagen - vielleicht stimmt das so. Manchmal 
leuchten einzelne LEDs wirklich ein paar Sekunden am Stück. Und ab und 
zu ist auch mal alles aus.

HTH
Randy

von Joachim R. (bastelbaer)


Lesenswert?

Also ich bin weiter. Das Hex-File scheint mit 15 Sekunden 
MEASURE_INTERVAL kompiliert zu sein. So steht es auch im Quelltext.

Ich habe jetzt mal die Sourcen neu kompiliert bei der ich die 
measure_isnight Routine fest auf flags |= FLAG_ISNIGHT; gesetzt habe. 
Damit klappt es schonmal so weit, dass die Würmchen aufleuchten und 
nicht mehr flackern. Ein Problem hatte ich noch beim Kompilieren mit 
einer ignoring Warnung in der wave.h.
(gcc version 4.3.3, WinAVR 20100110)

Das stand:

typedef struct {
....
} wave_data_t PROGMEM;

muss aber jetzt

typedef struct PROGMEM {
....
} wave_data_t ;

sein.

Jetzt werd ich das mit der ADC-Geschichte in der insnight-Routine mal 
durchsehen und auch mal schauen ob ich ein wenig mehr "Action" bekomme. 
Bei mir ist nur selten mehr als ein Glühwürmchen aktiv. Und das Ganze 
mit langen Pausen ohne Aktivität dazwischen.

von Bernhard M. (boregard)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe die Glühwürmchen etwas verändert / vereinfacht nachgebaut:
- 2 * AAA Eneloop Akkus,

- Solarzelle mit Shottky Diode abgekoppelt

- Messung der Batteriespannung über interne Bandgap, dadurch bleibt der 
Reset Pin frei

- Doppelt lange Wave, damit sie nicht so nervös blinken....

- verschiedene Varianten der Helligkeitsmessung,
  a) über Solarzelle, geht bei manchen Solarzellen anscheinend schlecht 
(infrarot?), deshalb
  b) Messung über LDR mit (Reset-Pin) geschaltetem Pull-up
  c) Messung über LDR mit Kondensator

Deshalb gibt es drei Schaltbilder, im Code wird über #ifdef 
umgeschaltet.

Gruß,
Bernhard

von Tom (Gast)


Lesenswert?

Hallo Bernhard

bin hier absoluter Neuling.
Kannst Du mir mal das Layout der Platine und die genaue Anleitung ins 
Board stellen?
Wäre Dir sehr dankbar.

LG
Tom

von Bernhard M. (boregard)


Lesenswert?

Tom schrieb:
> Hallo Bernhard
>
> bin hier absoluter Neuling.
> Kannst Du mir mal das Layout der Platine und die genaue Anleitung ins
> Board stellen?
> Wäre Dir sehr dankbar.
>
> LG
> Tom

Hi Tom,

ich habe kein Layout, weil ich die auf Lochraster aufgebaut habe.

Was brauchst du noch als Anleitung?

Gruß,
Bernhard

von Tom (Gast)


Lesenswert?

Hi Bernhard,

danke für die schnelle Antwort !!!!!
Hatte gedacht das Du die Schaltung auf einer Platine aufgebaut hast.
Aber mit Lochraster komm ich klar.

Der Rest steht ja in firefly.h firefly.c und wave.h.

Welche Variante hast Du denn im Moment am laufen?

a) über Solarzelle
b) Messung über LDR mit (Reset-Pin) geschaltetem Pull-up
c) Messung über LDR mit Kondensator

Danke nochmal für die schnelle Antwort.

LG
Tom

von Bernhard M. (boregard)


Lesenswert?

Hi,

am laufen habe ich a) und c), b) hatte ich kurzzeitig.

Ursprünglich habe ich eines mit a) gebaut, das geht ganz gut.
Ein weiteres mit einer anderen Solarzelle hat "Nacht" unzuverlässig 
erkannt, deshalb der Umstieg zu c).

c) deshalb, damit man den Reset noch für ISP behalten  kann.

Gruß,
Bernhard

von René (Gast)


Lesenswert?

Hallo Bernhard/boregard,

kannst Du bitte Dein komplettes Projekt posten (Beitrag vom 21.10.2011 
13:24)?
Bei der Variante mit LDR ohne Reset PIN hört es irgendwann auf zu 
leuchten. die Software ist aber nicht abgestürzt, habe zu debugzwecken 
an PB4 eine LED im main loop immer blinken lassen, und check auf 
dunkelheit deaktiviert.
Welche WinAVR Version nutzt Du?

Vielen Dank,
René

von Stefan G. (dreamer83)


Lesenswert?

Hallo René,

iah hatte mir die Version mit Solarzelle als Sensor nachgebaut.
Hatte das Problem das es immer gut anlief und nach einer unbestimmten 
Zeit nocht mehr reagiert hat, so zumindest der anschein. Mit dem Loader 
kam ich aber immer ohne Probleme drauf.

Wenn du ne recht aktuelle Version von WinAVR verwendest solltest du 
einmal beim kompletten neukompilieren kontrolieren ob von der "wave.h" 
ein warning kommt bezüglich Definition/Reihenfolge von "Progmem".

Sieh dir dazu mal den Beitrag von Joachim am 19.07.2011 13:25 an. 
Beitrag "Re: Glühwürmchen in Rotkohlglas gefangen"

Bei mir war nur dies der Fehler das es als "ausgestiegen" ist.

Viel Erfolg
Stefan

von Bernhard M. (boregard)


Angehängte Dateien:

Lesenswert?

Hi,

angehängt noch mal alle sourcen.
Ich programmiere unter Linux. Da es dafür kein bootloader Programm für 
Hagens bootloader gibt verwende ich Peters bootloader, das hat aber 
keinen Einfluss.
Kompiliert habe ich mit gcc 3.4.6, ziemlich alt aber relativ 
"fehlerfrei" (andere Projekte kompilere ich z.Zt. mit 4.4.2, der könnte 
hier auch gehen).
Ansonsten laufen beide Varianten (Solarzelle als Lichtsensor und LDR mit 
Kondensator) seit Juli / August dauerhaft und leuchten immer noch...

Gruß,
Bernhard

von René (Gast)


Lesenswert?

Hallo Bernhard,

Ich habe Deinen Code mit der gleichen tool chain übersetzt trotzdem 
stoppen die Tierchen ihre Arbeit nach ca. 4 Tagen. Da man den 8 Beiner 
so schlecht debuggen kann überlege ich einen externen Reset Mechanimus 
einzubauen (Supervisor Watchdog IC). Es soll möglichst alles autonom 
laufen da es ein Geschenk wird.
Könntest Du bitte Deine Hexfiles für einen letzten Dauertest posten, 
bevor ich diese Variante wähle.

Danke im voraus,
rené

von Bernhard M. (boregard)


Lesenswert?

Hi,

entschuldige die späte Antwort, ich habe es erst jetzt gelesen....

Es kann durchaus sein, daß die Glühwürmchen mal lange Pause machen, das 
kommt ab und zu mal vor.

Ich kann heute Abend die HEX files posten, bestimmte oder alle drei?

Gruß,
Bernhard

von Randy (Gast)


Lesenswert?

> Da man den 8 Beiner
> so schlecht debuggen kann überlege ich einen externen Reset Mechanimus
> einzubauen (Supervisor Watchdog IC).

Der Tiny45 im Beitrag
Beitrag "Re: Glühwürmchen in Rotkohlglas gefangen"
macht genau das. Wenn 30 Minuten lang an Pin 5 nicht gewackelt wurde 
gibt es auf Pin 6 einen Reset-Impuls. Das musst das vielleicht noch mit 
der Dunkel-Erkennung kombinieren damit es nicht tagsüber dauernd 
Reset-Impule gibt. Obwohl, stören würden die vermutlich auch nicht?

HTH

von Bernhard M. (boregard)


Angehängte Dateien:

Lesenswert?

Hi,

so, hier mal das Hex für Solarzelle und LDR (ohne Verwendung des Reset 
Pins). Beide laufen bei mir monatelang ohne Probleme.

Gruß,
Bernhard

von René (Gast)


Lesenswert?

Hallo Bernhard,

Vielen Dank für Deine Hilfe. ich mache gerade einen Test bis nach Ostern 
mit zwei Varianten einem HEX von Dir und parallel meine HEX Datei.
Eine Frage noch zum LDR, bei denen gibt es starke Schwankungen,
wie sollte die folgende Variable gesetzt werden, wenn der LDR einen 
höheren Widerstand bei Dämmerung als ein anderes Exemplar?
#define LIGHT_THRESHOLD 100
Ich habe mal zum Test 200 und 50 getestet aber bei einem LDR keinen 
Unterschied feststellen können. Also müsste doch bei hochohmigen 
Exemplaren der Schwellwert niedriger sein oder?

Gruß,
René

von Bernhard M. (boregard)


Lesenswert?

Guten Morgen,

also den LDR Wert habe ich dann auch ausprobiert, im abgedunkeltem 
Raum.Die Zykluszeit stark heruntergesetzt, dann immer Wert verändert, 
programmiert, schauen, ob die LEDs blinken. So habe ich mich 
herangetastet...
Im Endeffekt ist es jetzt so, daß die LEDs im noch relativ hellen Raum 
schon anfangen, meinen Sohn stört das aber nicht.

Gruß,
Bernhard

von Tom (Gast)


Lesenswert?

Tolles Projekt!

Ich suche noch ein last-minute Geschenk für Ostern. Hat jemand evtl. ein 
paar Platinen gefertigt/fertigen lassen?

Würde diese gerne gegen großzügige (;-))Aufwandspauschale erwerben, da 
ich selbst leider nicht ätzen kann und bis Ostern die Zeit für ne 
Bestellung knapp wird bzw. der Preis dann ein bisschen hoch wird.

Grüße,
Tom

von René (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Mitstreiter,

ich habe heute mein erstes Glas mit den Tierchen fertig bekommen. Ich 
nutze eine modizierte Schaltung von Bernhardt mit LDR, ohne Bootloader, 
den brauche ich nicht. Im Anhang findet Ihr den Code, Eagle 6.1 Projekt 
und ein paar Bildchen. Danke nochmal an alle die zu diesem schönen 
Projekt beigetragen haben. Ich nutze Eclipse CDT mit AVR Plugin 2.3.4 
unter Linux und AVR GCC 3.6.4.

Platine ist 4,5x5cm groß und hat Platz für 2xAAA Eneloop Akkus und 
Solarzelle.
Solarzelle 4,1V ist von Conrad Best.-Nr.: 191308 - 62.
LEDs habe ich von Reichelt G L29K :: OSRAM Smart LED, Low C., 0603, 5,6 
mcd, grün sind nicht die hellsten reicht aber für mich aus, Farbe ist 
gelbgrün.
Die LED Stränge und die Solarzelle habe ich mit 
Präzisionsbuchsen/Stiftleisten verbunden.
Die Solarzelle sitzt auf der Leiterbahn. Ok das Layout ist 
verbesserungswürdig aber es funktioniert. Leider hatte ich keinen grünen 
lötbaren Draht. Das werde ich im 2. Aufbau machen. Das schwerste war die 
LED Stränge löten ich habe 3 LED dabei verloren ein Windhauch und sie 
sind unaufindbar, habe dann mit Tesa die Drähte beim löten fixiert und 
Spezial Flußmittel genommen und mit 300 Grad unter starker 
Kaltlichtlampe gelötet.

Gruß,
René

von René (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

anbei noch der Code ohne Bootloader Logik.
Der LDR Schwellwert ist noch experimentell.

Gruß,
René

von Frank P. (mauz)


Lesenswert?

Es lebt!
Danke für das schöne Projekt.
Eine Frage habe ich noch. Ich wollte mal mit den Waves etwas spielen, 
nur der WaveEditor meckert beim Export nach .h, er könne "wave.template" 
nicht finden. Habe ich da was übersehen?
frank

von Hagen R. (hagen)


Angehängte Dateien:

Lesenswert?

im Anhang alle Dateien.

Gruß hagen

von Frank P. (mauz)


Lesenswert?

Vielen Dank, nun geht es!
Mal schauen, ob ich für meine Käfer besser geeignete Waves hinkriege. 
Meine LEDs sind nämlich insgesamt doch recht dunkel.
frank

von Björn B. (elmo)


Angehängte Dateien:

Lesenswert?

Hallo,

erstmal vielen Dank für dieses tolle Projekt! Inzwischen läuft mein 
erster Aufbau und einige weitere werden gerade zum Verschenken 
vorbereitet :-)

Da ich mir ein paar Platinen hab fertigen lassen, sind noch 5 Stück 
übrig. Bei Interesse bitte PN. Ich hätte gerne 3,- das Stück inkl. 
Versand.

Viele Grüße
Björn

von Konrad S. (maybee)


Lesenswert?

@Björn B.
Die Platine ist angekommen, vielen Dank!

von Björn B. (elmo)


Lesenswert?

GCC 4.7.2 unter Linux produziert übrigens kein brauchbares Hexfile. 
Woran es liegt, konnte ich leider bisher nicht herausfinden.
Mit dem in FireFly_patched_231208.tgz enthaltenen Hexfile hingegen 
funktionieren  die original Hardware sowie mein Nachbau.

von Björn B. (elmo)


Lesenswert?

Zwei Platinen wären noch zu haben. Diese jetzt inklusive MAX1724 für 
weiterhin 3,- Euro.

Gruß
Björn

von Hans .. (Firma: Private) (erty21)


Lesenswert?

Hallo Björn
ich nehm Dir gerne zwei Stück ab .

melde dich doch mal bitte per Pm
Dank und Gruß Hans

von Andy S. (Gast)


Lesenswert?

Obwohl der Beitrag jetzt schon einige Zeit auf dem Buckel hat, möchte 
ich jetzt doch meine Erfahrungen mitteilen um etwaigen Nachbauern nicht 
vor die gleichen Probleme zu stellen.

Die von Hagen angehängte Source ist soweit in Ordnung, nur ist immer 
wieder von komischem Verhalten der Schaltung berichtet worden, welche 
auch im Zusammenhang mit der Compiler-Version zu stehen scheinen.

Es wrid berichtet:

Lothar Merl schrieb:
> Damit nicht noch andere Nachbauer verzweifelt nach Fehlern suchen:
>
> Mit der aktuellen Version des Winavr (Stand Mai 2009) läßt sich der
> Source meiner Erfahrung nach NICHT wunderfrei compilieren. Es kommt zu
> allerlei bunten Effekten.
> Die von Hagen benutzte, ältere Version mit AVR-GCC 3.4.6 führt zu
> verlässlichen Ergebnissen. Z.B. von hier:
> 
http://sourceforge.net/project/showfiles.php?group_id=68108&package_id=66543&release_id=411822

Da ich AVR Studio 5.1 mit AVRGCC 3.3.1.27 verwende, hat die Schaltung 
sämtliches mir bekanntes komisches Verhalten an den Tag gelegt.

z.b. dauerhaft leuchtetende Würmchen
zu hoher Stromverbrauch, bis sich der avr letzendlich "gefressen" hat 
und nur ein Hardware Reset abhilfe schaffen konnte.

Das Problem ist auf einen Fehlerhaften Pointerzugriff zurückzuführen. 
Der von mir verwendete Compiler kann mit der Struct definition in der 
wave.h nichts anfangen und lagert den code nicht in den progmem aus
die folge ist ein fehlerhafter speicherzugriff

ORGINAL:

typedef struct {
    const prog_uint8_t* start;
    const prog_uint8_t* stop;
    const uint16_t energy;
} wave_data_t PROGMEM;

FUNKTIONSFÄHIG:

typedef struct PROGMEM{
    const prog_uint8_t* start;
    const prog_uint8_t* stop;
    const uint16_t energy;
} wave_data_t ;

Das hat alle Fehler vollständig beseitigt!

Danke noch mal an Hagen für das Projekt !!

- Andy

von chris_ (Gast)


Lesenswert?

Mich interessiert zum Thema Glühwürmchen die Synchronisation. Kann das 
Gartenglühwürmchen das auch?

Hier gibt es eine Beispielimplementierung:
http://www.instructables.com/id/Synchronizing-Fireflies/

Und hier die Low-Power-Version:
http://www.seanet.com/~karllunt/fireflyLED.html

von Hagen R. (hagen)


Lesenswert?

chris_ schrieb:
> Mich interessiert zum Thema Glühwürmchen die Synchronisation. Kann das
> Gartenglühwürmchen das auch?
>
> Hier gibt es eine Beispielimplementierung:
> http://www.instructables.com/id/Synchronizing-Fireflies/
>
> Und hier die Low-Power-Version:
> http://www.seanet.com/~karllunt/fireflyLED.html

Ja und Nein. Nein wenn du das Verhaltzen auf individuelle Ebene 
simulieren möchtest, dh. schon HW-mäßig besteht jedes einzelene 
Glühwürmchen aus einer eigenen Elektronik und eigener SW.

Ja aus Sicht der Verhaltenssimulation, das war ja auch einer der Gründe 
warum ich mich mit dem Thema beschäftigt habe, die Nichte zu beglücken 
kann ja nicht alles an so einem Projekt darstellen.

Schon im allereesten Posting mein Source implementiert alle wichtigen 
Strukturen und Variablen um eben das Behavior von Fireflys zu 
simulieren. Das umfasst also:

- die Datenstruktur FireFly_t
- die Member Energy, Hungry die für ein Grlühwürmchen berechnet werden 
und auch die Werte der anderen Glühwürmchen modifizieren kann.
- die Leuchtmuster = Waves in denen die LED leuchten. Diese Leuchtmuster 
enthalten einen Datenwert der die RMS-Energie-Abgabe beschreibt.
- somit kann man wenn ein Firefly leuchtet dessen Energiewert und 
Hungrywert entsprechen der nötigen Energie des Leuchtmusters updaten.

Das Behavior ist also ziemlich einfach definiert:
1 Glühwümchen leuchtet in einer zufällig ausgewählten Sequenz. Dabei 
verbraucht es entsprechend Enegie und wird hungrig. Gleichzeitig regt es 
das Energiepotential zum Leuchten, eg. die Schwelle ab dem die 
benachbartem Fireflys an indem die UpdateFireFlies() Funktion die 
verbrauchten Energiepunkte zum aktuelle FireFly anteilmäßig auch auf die 
benachbarten Glühwürmchen aufrechnet.
Die Zeitphasen in denen die Glühwürmchen nicht leuchten, sich die SW 
also im Power Down Modus befindet wird in Sücken a 16ms als 
Energie-Aufnahme wieder auf das Energiekonto des Glühwürmchen drauf 
gerechnet.
Desweiteren leuchten die Glühwümchens nur Nachts über was ebenfalls dem 
natürlichen Verhalten entspricht.

Sogesehen: in der ersten Version des Projektes sind alle Eigenschaften 
vorhanden die nötig sind um eine relatische Simulation durchführen zu 
können.

Würde man nun jedes FireFly separat mit eigner HW aufbauen dann käme man 
denoch zu ähnlichen Ergebnisen. Währen die HW-Variante die Solarzelle 
oder sowas wie physikalische Augen einbauen muß benötigst du dies bei 
meiner Variante nicht. Dort wird diese "Sensorik" wie auch die "örtliche 
Positionierung" der Fireflys zueinander in Software simuliert.
Mit einer HW-Lösung würde man dies natürlich in HW aufbauen wollen.
An den Simulationsergebnissen änderte dies aber nichts.

Meine inoffizielle Version, mein Experiment, geht aber noch einen 
Schritt weiter. Es wird der Gesamtenergieverbrauch und die Gesamtenergie 
die durch das Solarpanel aquiriert wurde berücksichtigt. Bekommmen die 
Glühwürmchen also tagsüber zu wenig Licht = Nahrung dann ändern sie ganz 
logisch ihr Verhalten indem sie nachts entsprechend weniger leuchten.

Das jetzt angestrebte Verhalten sollte folgendes Blinkmuster ergeben:
1. die Firefly leuchten nachts in unterschiedlichen Mustern
2. die Fireflys scheinen angeregt durch das Blinken eines Fireflys 
selber mit Leuchten auf diese Leuchten zu reagieren und entsprechend von 
der Komplexität dieses Reitmuster (Engergiebedarf) selbst darauf zu 
reagieren indem sie schneller antworten.
3. je nach Verdrahtung der LEDs sollte man erkennen können das diese 
Gegenreaktion durch LEDs in der Nähe der auslösenden LED erfolgt.
4. es sollten also längere Phasen geben in denen sich nur wenige 
FireFlys zu "Wort" melden und dann wieder Phasen in den sprunghaft aber 
zeitverzögert mehrere bis viele Fireflys leuchten. Diese regen 
ihrerseits dann wieder andere Fireflys zum leuchten an aber die "große 
Welle" an leuchten muß abnehmen dabei. Man kann also sowas wie ein 
gepulstes Nachleuchten wie eine Welle die durch den Schwarm läuft 
beobachten.

Gruß Hagen

von Roland E. (roland0815)


Lesenswert?

Lustiges Projekt.

Blöd nur, dass es keine LEDs gibt, die das typische Glühwürmchen 
GelbGrün ordentlich repoduzieren. Jeder, der schon mal ein echtes 
Glühwürmchen gesehen hat wird den Unterschied sehen.

von chris_ (Gast)


Lesenswert?

>4. es sollten also längere Phasen geben in denen sich nur wenige
>FireFlys zu "Wort" melden und dann wieder Phasen in den sprunghaft aber
>zeitverzögert mehrere bis viele Fireflys leuchten.
Das scheint in dem Video mit echten Glühwürmchen der Fall zu sein:
http://phys.org/news197815725.html
Leider ist es etwas undeutlich. Ich meine mich an eine Reportage im 
Fernsehen zu erinnern, bei der ein ganzer Baum gleichmässig geblinkt 
hat.

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.