Ich habe eine Projekt, was extrem klein werden muss. Daher habe ich den Attiny10 genommen (wichtig ist hierbei der ADC, 500 Byte-Version hätten auch gereicht). Wenn ein Logicwechsel eines Pins erkannt wird, soll der ADC-Wert ermittelt und abgespeichert werden. Da das Programm VIEL kleiner als 1kb ist, wollte ich das letzte Byte des Flash missbrauchen, um dort den Wert abzulegen, da die Chips kein EEPROM haben. Jetzt kommt das Problem: Auslesen des Flashs geht (avr/pgmspace.h und dann pgm_read_byte(adresseof)). ABER (!) kein schreiben. Mache ich hier was falsch, oder kann der das echt nicht?
Hallo, im Datenblatt findest Du diesen Hinweis: 17.5. Self programming The ATtiny4/5/9/10 don't support internal programming.
Look in the Book: Datenblatt S. 159: 17.5. Self programming The ATtiny4/5/9/10 don't support internal programming.
Karl M. schrieb: > Hallo, > > im Datenblatt findest Du diesen Hinweis: > > 17.5. Self programming > The ATtiny4/5/9/10 don't support internal programming. Mist, übersehen. Das ist doof. Gibt es eine Möglichkeit, eine Variable (global) im Wert zu ändern? Wenn ich global erstelle: uint8_t adc_hyst = 180; dann kann ich diese mit dem vordefiniertem Wert direkt im Programm nutzen. Lässt sich dieser Wert ändern, sodass er nach Stromausfall nun den neuen Wert hat?
Nein, denn EEPROM hat der Chip auch nicht. Du musst dann wohl ein externes EEPROM anschließen, dafür hast du aber vermutlich nicht genügend I/O Pins frei.
Marius D. schrieb: > Lässt sich dieser Wert ändern, sodass er nach Stromausfall nun den neuen > Wert hat? Nein, Self Programming funktioniert ja nicht und EEPROM hat's auch nicht. Wie wär's mit nem tiny13 als Alternative? Der kann beides.
Wäre denn ein 8-pinniges SOIC auch noch OK? Dann ginge ATTiny25/45/85, der ATTiny45/V gibts gar im TSSOP.
Für Masochisten gibt es den neuen ATtiny102. Das ist im Prinzip ein ATtiny10 mit zwei Pins mehr und Self-Programming. Alternativ könntest Du auch einen voll ausgerüsteten Controller für weniger Geld im kleinen Package nutzen.
bork schrieb: > Für Masochisten gibt es den neuen ATtiny102. Das ist im Prinzip ein > ATtiny10 mit zwei Pins mehr und Self-Programming. > > Alternativ könntest Du auch einen voll ausgerüsteten Controller für > weniger Geld im kleinen Package nutzen. Was mich jetzt nur mal echt interessieren würde, wäre die Sache, wo denn der Wert einer globalen Variable abgelegt wird? Der lässt sich 0 ändern?! Dazu braucht man doch kein EEProm und auch kein Flash-Programming, oder? SOIC-8 ist gigantisch. Das ist so groß wie die halbe Platine. Ich habe viele Geräte mit Attiny13 in dem Gehäuse, kein Problem. Bei dem Gerät MUSS es aber winzig sein. Das ist wichtig. Das 20M1 Gehäuse ist so grad an der Grenze. Das wäre eine Option, aber schwer zum löten. Die Sache mit dem Attiny102 ist gut, aber ich konnte keine finden zum Kaufen. Aliexpress hat die nicht.
> Aliexpress hat die nicht.
Was soll das? Zu faul zum Suchen?
Marius D. schrieb: > Was mich jetzt nur mal echt interessieren würde, wäre die Sache, wo denn > der Wert einer globalen Variable abgelegt wird? der Wert ist teil von ausführbaren Programm, liegt also im Flash und wird beim starten in den Ram kopiert.
Hallo Marius, deine Frage zur einer Globalenvariable, Wenn diese als
1 | const uint8_t anton = 123; |
kodiert worden ist, dann wird sie als Konstante verwendet und anton ist im Programmablauf nicht änderbar. Eine Anweisung
1 | uint8_t anton = 123; |
führt in der Initialisierung Phase zur Wertzuweisung von 123.
1 | ldi R16,123 |
Mehr findest Du im Assemblerlisting deines Codes.
Vokalebene schrieb: >> Aliexpress hat die nicht. > > Was soll das? Zu faul zum Suchen? Nein, auf eBay und Aliexpress gibt es den nicht. Bei allen anderen Distributoren lohnt es sich für mich nicht, da viel zu teuer!
Marius D. schrieb: > Dazu braucht man doch kein EEProm und auch kein Flash-Programming, oder? Dann überleg bitte noch einmal, woher der Wert denn kommen sollte, wenn nicht aus dem Flash. Aus der Luft? Über die Betriebsspannung? > Die Sache mit dem Attiny102 ist gut, aber ich konnte keine finden zum > Kaufen. Aliexpress hat die nicht. Aliexpress ist ja nun auch nicht gerade die erste Referenz als Distributor für Atmel, nicht wahr? Mouser und Digikey haben welche, aber bislang wohl leider auch nur als SOIC, 8-UFDFN gibt's davon offensichtlich noch nicht. Kannst ja mal bei Microchip anfragen, ob du von diesem Gehäuse denn schon Muster bekommen kannst.
Karl M. schrieb: > Hallo Marius, > > deine Frage zur einer Globalenvariable, > > Wenn diese als
1 | const uint8_t anton = 123; |
kodiert worden ist, > dann wird sie als Konstante verwendet und anton ist im Programmablauf > nicht änderbar. > > Eine Anweisung
1 | uint8_t anton = 123; |
führt in der Initialisierung > Phase zur Wertzuweisung von 123. > >
1 | ldi R16,123 |
> > Mehr findest Du im Assemblerlisting deines Codes. Ach stimmt, ja gut, das ist klar, aber davon habe ich nichts. Schade.
Marius D. schrieb: > da viel zu teuer! Wenn du ein Geschäft auf Dumpingpreise irgendwelcher China-Höker aufbaust, dann ist dir allerdings wohl nicht groß zu helfen.
Marius D. schrieb: > Was mich jetzt nur mal echt interessieren würde, wäre die Sache, wo denn > der Wert einer globalen Variable abgelegt wird? Der lässt sich 0 > ändern?! Der Wert einer globalen Variable wird natürlich in dieser Variable abgelegt. Die Variable selber befindet sich typischerweise im RAM. Und natürlich läßt sich der Wert (in) einer Variable ändern. Deswegen heißt es Variable und nicht Konstante. Was war nochmal die Frage? Geht es vielleicht um den initialen Wert der Variable? Der wird vom Startup-Code in den RAM kopiert, bevor die main() Funktion angesprungen wird. Üblicherweise liegt dazu im Flash eine Kopie aller initialisierten Variablen.
Marius D. schrieb: > Was mich jetzt nur mal echt interessieren würde, wäre die Sache, wo denn > der Wert einer globalen Variable abgelegt wird? Der lässt sich 0 > ändern?! Variablen liegen im RAM! Man kann auch IMMER sagen. Siehe: Variablen liegen IMMER im RAM! (auch die Register zählen dazu) Wenn es auch Ausnahmen geben mag, ist doch keine dabei, die den ATTiny10 betrifft. Du hast nur eine Chance! Eine einzige... Der Tiny unter Strom halten. Backupbatterie und Dauerschlaf
Arduino F. schrieb: > Siehe: Variablen liegen IMMER im RAM! Nein, muss nicht sein. Sie können auch gut und gern in einem Register liegen, oder im Falle einer als "const" deklarierten Variablen gar nur als Direktoperand eines Befehls vorhanden sein. Edit, da du deinen Beitrag editiert hast: Nein, Register sind kein RAM, auch wenn man sie beim klassischen AVR im RAM-Adressraum zugreifen kann (was aber eh' kaum jemand macht). Trotzdem unterscheidet man zwischen beiden. (Der Z8 war in der Hinsicht allerdings ein Zwitter, da er nur Register hatte, die man wiederum teils wie RAM benutzen konnte, bspw. als Stack. Ist aber eine ziemliche Sonderlösung.)
:
Bearbeitet durch Moderator
Bin gerade zu faul zum streiten.... Und dem TE würde es auch nicht helfen. Denn er träumt Wolkenkuckucksheime. Und der Zahn will gezogen werden.
Jörg W. schrieb: > Marius D. schrieb: >> da viel zu teuer! > > Wenn du ein Geschäft auf Dumpingpreise irgendwelcher China-Höker > aufbaust, dann ist dir allerdings wohl nicht groß zu helfen. Das ist ja auch meine Sache, und warum für ein privates Projekt mehr zahlen als nötig?
Axel S. schrieb: > Marius D. schrieb: >> Was mich jetzt nur mal echt interessieren würde, wäre die Sache, wo denn >> der Wert einer globalen Variable abgelegt wird? Der lässt sich 0 >> ändern?! > > Der Wert einer globalen Variable wird natürlich in dieser Variable > abgelegt. Die Variable selber befindet sich typischerweise im RAM. > Und natürlich läßt sich der Wert (in) einer Variable ändern. > Deswegen heißt es Variable und nicht Konstante. > > Was war nochmal die Frage? > > Geht es vielleicht um den initialen Wert der Variable? Der wird vom > Startup-Code in den RAM kopiert, bevor die main() Funktion angesprungen > wird. Üblicherweise liegt dazu im Flash eine Kopie aller initialisierten > Variablen. Bekannt. Frage war dazu ob so eine "Kopie" existiert, oder nicht. Macht für mich keinen sinn, denn man könnte den Wert auch einfach direkt über einen Assemblerbefehl initialisieren, wozu also eine Kopie? Aber, selbst wenn eine existieren solle, ich kann den FLash nicht ändern von dem Programm aus.
Arduino F. schrieb: > Und dem TE würde es auch nicht helfen. Zustimmung. Woran man beim ATtiny10 auch noch denken muss ist, dass man sie nur bei Vcc = 5 V (±Toleranz) programmieren kann. Da's die ATtiny102 im DFN offenbar noch nicht gibt, bliebe nur die Variante, dafür bei Atmel/MCHP nach Mustern zu betteln, oder ATtiny13 im 3x3 10-DFN zu nehmen.
:
Bearbeitet durch Moderator
Marius D. schrieb: > Das ist ja auch meine Sache, Ja. > und warum für ein privates Projekt mehr > zahlen als nötig? Weil gerade bei Einzelstücken oder ganz kleinen Serien die Bauteilkosten im Vergleich zum restlichen Aufwand eine völlig untergeordnete Rolle spielen. Ein Euro mehr oder weniger, denkst du bei jedem Druck auf das Bremspedal des Autos drüber nach, wieviel Cent an Kraftstoff du jetzt gerade in Wärme nutzlos in die Umwelt verheizt?
Jörg W. schrieb: > Arduino F. schrieb: >> Und dem TE würde es auch nicht helfen. > > Zustimmung. > > Woran man beim ATtiny10 auch noch denken muss ist, dass man sie nur > bei Vcc = 5 V (±Toleranz) programmieren kann. > > Da's die ATtiny102 im DFN offenbar noch nicht gibt, bliebe nur die > Variante, dafür bei Atmel/MCHP nach Mustern zu betteln, oder ATtiny13 > im 3x3 10-DFN zu nehmen. Ja das DFN-Gehäuse kann ich nicht gescheit löten und schon gar dann programmieren. Die Platine hat keine TPI/ISP-Verbindung. Die werden vorher geflashed und dann eingelötet. Egal, ich checke das ab mit dem Tiny102, das ist der beste Vorschlag gewesen, die sollten passen - hoffentlich.
Marius D. schrieb: > Frage war dazu ob so eine "Kopie" existiert, oder nicht. > Macht für mich keinen sinn, denn man könnte den Wert auch einfach direkt > über einen Assemblerbefehl initialisieren, wozu also eine Kopie? > Aber, selbst wenn eine existieren solle, ich kann den FLash nicht ändern > von dem Programm aus. Du bist verwirrt! Vor dem Start des Hauptprogramms wird der Variablenbereich initialisiert. Und wenn da nicht Null reinkommt, sondern deine Vorbesetzung, dann wird die natürlich aus dem Flash geholt. Woher sonst? Du kannst Variablen dazu bringen, dass sie einen Reset überleben, aber keinen Stromausfall.
Marius D. schrieb: > Egal, ich checke das ab mit dem Tiny102, das ist der beste Vorschlag > gewesen, die sollten passen - hoffentlich. Verstehe ich nicht: die baumäßig kleinsten davon sind doch auch DFN, die anderen sind doch wieder vergleichsweise riesige SOICs. Aber gut, die SOICs bekommst du zumindest bei Digikey oder Mouser ab Lager, für letzteres gibt's ja hier im Markt-Forum die regelmäßigen Sammelbestellungen.
:
Bearbeitet durch Moderator
Jörg W. schrieb: > Marius D. schrieb: >> Das ist ja auch meine Sache, > > Ja. > >> und warum für ein privates Projekt mehr >> zahlen als nötig? > > Weil gerade bei Einzelstücken oder ganz kleinen Serien die Bauteilkosten > im Vergleich zum restlichen Aufwand eine völlig untergeordnete Rolle > spielen. Ein Euro mehr oder weniger, denkst du bei jedem Druck auf > das Bremspedal des Autos drüber nach, wieviel Cent an Kraftstoff du > jetzt gerade in Wärme nutzlos in die Umwelt verheizt? Ich brauche, für den Anfang, grob 20 dieser Platinen. Als bspw. für den Tiny10: Bei Ali kosten mich 20 Chips inkl. Porto á Chip 40cents. Bei Apotheken wie Conrad oder eBay zahle ich JE Chip 1,50€ + 5€ Porto. Als Privatmann fallen einige Distributoren (die immer noch teurer sind, alle schon durch den Versand) raus. Da sagt kein normaler Mensch, ich kaufe jetzt bei den teuren um irgendjemanden zu unterstützen und der Aufwand/Materialkosten spielt hier eine krasse Rolle. Btw: Bei jedem Druck auf die Bremse denke ich nicht darüber nach, aber vorausschauend fahren (rollen lassen, etc...) tue ich trotzdem, sonst verschwende ich das Benzin. Und gerade im Stadtverkehr ist das krass. Da muss man sowieso alle 3m neu anfahren.
Arduino F. schrieb: > Marius D. schrieb: >> Frage war dazu ob so eine "Kopie" existiert, oder nicht. >> Macht für mich keinen sinn, denn man könnte den Wert auch einfach direkt >> über einen Assemblerbefehl initialisieren, wozu also eine Kopie? >> Aber, selbst wenn eine existieren solle, ich kann den FLash nicht ändern >> von dem Programm aus. > Du bist verwirrt! > > Vor dem Start des Hauptprogramms wird der Variablenbereich > initialisiert. > Und wenn da nicht Null reinkommt, sondern deine Vorbesetzung, dann wird > die natürlich aus dem Flash geholt. Woher sonst? > > > Du kannst Variablen dazu bringen, dass sie einen Reset überleben, aber > keinen Stromausfall. Das bin ich gerade in der Tat. Wenn ich einen Befehl mache wie: sw $t3, $t3, 120 liegt die 120 dann im Flash, woher soll sonst der Wert kommen. Stimmt. Ist aber auch jetzt egal, ich kann das sowieso nicht ändern.
Jörg W. schrieb: > Marius D. schrieb: >> Egal, ich checke das ab mit dem Tiny102, das ist der beste Vorschlag >> gewesen, die sollten passen - hoffentlich. > > Verstehe ich nicht: die baumäßig kleinsten davon sind doch auch DFN, > die anderen sind doch wieder vergleichsweise riesige SOICs. > > Aber gut, die SOICs bekommst du zumindest bei Digikey oder Mouser > ab Lager, für letzteres gibt's ja hier im Markt-Forum die regelmäßigen > Sammelbestellungen. Jop, da hast du Recht. Die sind nicht größer als die SOT23-6, ich habe aber bedenken beim löten und beim vorher flashen, Adapter wird es aber bestimmt geben.
Marius D. schrieb: > Wenn ich einen Befehl mache wie: sw $t3, $t3, 120 Assembler? Meine Aussage zur Initialisierung bezieht sich auf c/C++.
Arduino F. schrieb: > Marius D. schrieb: >> Wenn ich einen Befehl mache wie: sw $t3, $t3, 120 > Assembler? > Meine Aussage zur Initialisierung bezieht sich auf c/C++. Ich weiß jetzt nicht ob wir aneinander vorbeireden, aber das ist doch egal ob C/C++ oder Assembler. Die Initialisierung geschieht vorher nach obigen Prinzip.
Marius D. schrieb: > Die Initialisierung geschieht vorher nach obigen Prinzip. Je nachdem. Für globale Variablen in C nicht, diese werden beim Start des Programms initialisiert, indem deren Initalwerte in einer Schleife aus einem Stück Flash in den RAM kopiert werden. Im Flash liegen diese Werte dabei typisch hinter dem eigentlichen Programmcode. Für lokale ("auto") Variablen in C hast du Recht, diese werden als Direktoperanden reingeholt.
Marius D. schrieb: > Axel S. schrieb: >> Marius D. schrieb: >>> Was mich jetzt nur mal echt interessieren würde, wäre die Sache, wo denn >>> der Wert einer globalen Variable abgelegt wird? Der lässt sich 0 >>> ändern?! >> >> Der Wert einer globalen Variable wird natürlich in dieser Variable >> abgelegt. Die Variable selber befindet sich typischerweise im RAM. >> Und natürlich läßt sich der Wert (in) einer Variable ändern. >> Deswegen heißt es Variable und nicht Konstante. >> >> Was war nochmal die Frage? >> >> Geht es vielleicht um den initialen Wert der Variable? Der wird vom >> Startup-Code in den RAM kopiert, bevor die main() Funktion angesprungen >> wird. Üblicherweise liegt dazu im Flash eine Kopie aller initialisierten >> Variablen. > > Bekannt. Dann verstehe ich die Frage erst recht nicht. > Frage war dazu ob so eine "Kopie" existiert, oder nicht. Offensichtlich müssen die initialen Werte aller Variablen irgendwo im nichtflüchtigen Speicher sein. Wie sonst sollten die Variablen intitialisiert werden? > Macht für mich keinen sinn, denn man könnte den Wert auch einfach direkt > über einen Assemblerbefehl initialisieren, wozu also eine Kopie? Weil Variablen für gewöhnlich im RAM liegen. In diesen RAM muß der Initialwert geschrieben werden. Und zwar genau einmal, bevor das Programm startet. Da der Compiler nicht weiß (oft auch nicht wissen kann) wann du auf eine Variable zum ersten Mal zugreifst, kann er das nicht in den Programmcode legen. Nun könnte der Compiler dafür einen Sack Maschinencode erzeugen a'la
1 | Lade Register mit Startwert von Variable1 |
2 | Schreibe Register im RAM an die Adresse der Variable1 |
3 | Lade Register mit Startwert von Variable2 |
4 | Schreibe Register im RAM an die Adresse der Variable2 |
5 | ... |
Einfacher und kürzer ist es aber i.d.R. wenn der Compiler die initialisierten Variablen einfach hintereinander im RAM anlegt und die Startwerte in einem Rutsch in einer Schleife da rein kopiert.
Jetzt mal ne ganz blöde Frage: Wie und wohin speicherst du denn deine ADC-Wert nach dem sie gelesen wurden?! Lese und speichere doch dahin deinen Schwellwert!
Marius D. schrieb: > Karl M. schrieb: >> Hallo, >> >> im Datenblatt findest Du diesen Hinweis: >> >> 17.5. Self programming >> The ATtiny4/5/9/10 don't support internal programming. > > Mist, übersehen. Das ist doof. Du kannst einen PIC10F320 oder 322 nehmen. Der kann es. fchk
Jörg W. schrieb: > Wenn du ein Geschäft auf Dumpingpreise irgendwelcher China-Höker > aufbaust, dann ist dir allerdings wohl nicht groß zu helfen. Huch?! Machen das inzwischen nicht fast alle? Ich meine: Bis hin zu den Ganz Großen. Und da werden nicht zum "Dumpingpreis" Parts eingekauft, da wird heute meist gleich die ganze Platine oder gar das ganze Gerät in China gefertigt. Ergo: nö, das sind keine Dumpingpreise. Vielmehr sind die der großen Bauteiledistributoren Wucherpreise. Denn gerade die kaufen ja auch alle nur in China zu den angeblichen "Dumpingpreisen" ein... So sieht's aus und nicht anders. Alles andere verkennt die objektiven Tatsachen.
c-hater schrieb: > Huch?! Machen das inzwischen nicht fast alle? Ich meine: Bis hin zu den > Ganz Großen. > > Und da werden nicht zum "Dumpingpreis" Parts eingekauft, da wird heute > meist gleich die ganze Platine oder gar das ganze Gerät in China > gefertigt. > > Ergo: nö, das sind keine Dumpingpreise. Vielmehr sind die der großen > Bauteiledistributoren Wucherpreise. Denn gerade die kaufen ja auch > alle nur in China zu den angeblichen "Dumpingpreisen" ein... > > So sieht's aus und nicht anders. Alles andere verkennt die objektiven > Tatsachen. Genau so sehe ich das auch, deswegen brauche ich nicht in einer Apotheke einkaufen gehen.
Draco schrieb: > Jetzt mal ne ganz blöde Frage: Wie und wohin speicherst du denn deine > ADC-Wert nach dem sie gelesen wurden?! Lese und speichere doch dahin > deinen Schwellwert! Ja das Problem ist aber sobald der Chip stromlos ist, ist alles weg. Die ADC-Werte werden nur für Berechnungen während des Betriebs gebraucht, die Schaltschwelle kann variieren und muss gesichert werden.
c-hater schrieb: > Und da werden nicht zum "Dumpingpreis" Parts eingekauft, da wird heute > meist gleich die ganze Platine oder gar das ganze Gerät in China > gefertigt. > > Ergo: nö, das sind keine Dumpingpreise. Vielmehr sind die der großen > Bauteiledistributoren Wucherpreise. Denn gerade die kaufen ja auch > alle nur in China zu den angeblichen "Dumpingpreisen" ein... Wenn ich sehe, was die Frau vom Chef (der Hauptsitz meines aktuellen Arbytegebers ist in Shenzhen) auf dem lokalen Elektronikmarkt dort einkaufen lässt, dann komme ich manchmal mit dem Kopfschütteln nicht hinterher. Vielschichtkondensatoren mit Leckströmen im Zehntel mA-Bereich (und dann wundern, dass die Knopfzellen so schnell leer sind). TL431 Spannungsreferenzen, in denen kein Silizium ist, oder das falsche Datenblätter, die nicht das Papier wert sind, auf dem sie gedruckt sind (deswegen gibts die auch als PDF). Technische Spezifikationen, die nur Marketinggewäsch sind und keine verbindlichen Aussagen. Aber billig ist es, das stimmt. fchk
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.