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?
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.
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.
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.
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.
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.)
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.
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.
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.
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