www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATTINY 2313 - Passt da überhaupt ein Programm drauf?


Autor: Borislav Bertoldi (boris_b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen!
Ich wollte hier grad eine kleine Uhr für einen Tiny2313 programmieren. 
Das Programm hat ca. 30 einfache Zeilen Code. Beim kompilieren musste 
ich dann leider feststellen, das das Ding damit schon zu 200% gefüllt 
ist. Das hat mich dann schon etwas verwundert...

Sind die 2k Speicher tatsächlich so wenig, dass da nur 2-Zeiler 
Programme draufpassen?

PS: Als Optimierung habe ich Os gewählt, das sollte ja eigentlich 
kleinen Code produzieren, oder?

Autor: Magnus M. (magnetus) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Boris B. schrieb:
> PS: Als Optimierung habe ich Os gewählt, das sollte ja eigentlich
> kleinen Code produzieren, oder?

"0" ist gänzlich ohne Optimierung
"s" sollte gute Ergebnisse liefern

Gruß,
Magnetus

Autor: Borislav Bertoldi (boris_b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, das habe ich ja eingestellt ;-)

Autor: Sauger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nabend,

Dann zeig deinen 30 Zeiler mal her.

MfG

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lass mir raten: Du hast die Gleitkommabibliotheken dazugelinkt.

Autor: Magnus M. (magnetus) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Boris B. schrieb:
> Ja, das habe ich ja eingestellt ;-)

Boris B. schrieb:
> PS: Als Optimierung habe ich Os gewählt, das sollte ja eigentlich
                               ^^

Wat denn nun?

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und Ausgabe mit sprintf ;)

avr

Autor: Verwirrter Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zeig doch mal den Code, ich könnte mir vorstellen, dass du z.B. printf 
oder sprintf benutzt, die verbrauchen ziemlich viel Speicher. Floats 
könnten das ganze auch größer machen.

Grundsätzlich liegts wahrscheinlich an irgendwelchen Libraries, die 
direkt oder indirekt eingebunden werden.

Ich hab auf jeden Fall auf den verschiedenen tinys schon ein paar 
nützliche Programme hingekriegt, meistens mach ich mir mehr Sorgen ums 
RAM als ums Flash.

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau: Hört sich an wie die Verwunderung desjenigen, der zwischen den 
Sätzen: "Eine Currywurstbude aufbauen und führen" und "Eine Hotelkette 
aufbauen und führen" intuitiv keinen Unterschied sieht und dem die Wort- 
und Satzzählung sagt, das beides im Grunde das selbe ist.

Autor: Verwirrter Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Magnus Müller
das ist ein O keine 0
-Os benutzt er, also Optimierung s, nicht
-0s bzw. -O0s

Autor: Surbier (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schau mal, was da an Uhr alles drauf passt....

Beitrag "NIXIE Uhr mit vielen Funktionen in C mit ATTiny2313"

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn man in ASM Programiert, sind die 2 KBytes schon relativ viel. Auch 
in C kreigt man da auch schon einiges rein. Nur mit Fließkomma und 
Befehlen wie Printf wird es knapp. So ungewöhnlich ist es aber auch 
nicht, dass 2 kBytes nicht mehr reichen. Der Tiny2313 ist wegen der 
Position der Vcc7GND Pins ohnehin keine so gute Wahl. Von vielen anderen 
Typen gibt es Versionen mit verschieden viel Speicher, z.B. 2  4  8 
kBytes.

Wenn einem die 2 kB zu viel sind, gibt es auch noch den Tiny4 mit nur 
512 Bytes Flash.  Auch da kann einem noch die Hälfte frei bleiben.

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Von vielen anderen Typen gibt es Versionen mit verschieden viel Speicher,
>z.B. 2  4  8 kBytes.

Wie wäre es mit dem ATTiny4313?

MfG Spess

Autor: Borislav Bertoldi (boris_b)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
Danke für das viele Feedback. Ein printf oder Fließkommazahlen habe ich 
eigentlich nicht verwendet... Der Code ist im Anhang.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Möööööp!!!

Großer Fehler.
// Wait micro (10^-6) seconds
void Timing_wait_us( uint us )
{
  _delay_us(us);
}

http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

"Die Bibliotheksfunktionen funktionieren allerdings nur dann korrekt, 
wenn sie mit zur Übersetzungszeit (beim Compilieren) bekannten 
konstanten Werten aufgerufen werden. Der Quellcode muss mit 
eingeschalteter Optimierung übersetzt werden, sonst wird sehr viel 
Maschinencode erzeugt und die Wartezeiten stimmen nicht mehr mit dem 
Parameter überein. "

MFG
Falk

Autor: Verwirrter Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Yepp wenn das delay nicht fest vorgegeben wird, wird Fließkomma benötigt 
und das führt zu einem ziemlich erhöhten Speicherverbrauch.
Englische beschreibung der verschiedenen avr header:

http://www.nongnu.org/avr-libc/user-manual/group__...

"In order for these functions to work as intended, compiler 
optimizations must be enabled, and the delay time must  be an expression 
that is a known constant at compile-time. If these requirements are not 
met, the resulting delay will be much longer (and basically 
unpredictable), and applications that otherwise do not use 
floating-point calculations will experience severe code bloat by the 
floating-point library routines linked into the application."

Autor: Sauger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nabend,

Timing.c
#include <avr/io.h>
#include <util/delay.h>
#include "Types.h"
#include "Timing.h"


// Wait micro (10^-6) seconds
void Timing_wait_us( uint us )
{
  _delay_us(us);
}

hier wird die Gleitkommabibliothek dazugelinkt.

MfG

Autor: Verwirrter Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein möglicher, sehr ekliger Hack währe zum Beispiel:
// Wait micro (10^-6) seconds
void Timing_wait_us( uint us )
{
  for(;us > 0; us--) {
    _delay_us(1);
  }
}

allerdings wird das gerade bei hohen Wartezeiten länger dauern als 
geplant, da die For Schleife auch noch Zeit braucht.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal der Verbrauch meiner DCF77-Uhr:
4.3.3
AVR Memory Usage
----------------
Device: attiny26

Program:    1056 bytes (51.6% Full)
(.text + .data + .bootloader)

Data:         31 bytes (24.2% Full)
(.data + .bss + .noinit)


Und der Code:
Beitrag "DCF77 Uhr in C mit ATtiny26"


Peter

Autor: AVRnewbie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Spess53

> Wie wäre es mit dem ATTiny4313?

sehr gerne - wo gibt's den zu kaufen?

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: AVRnewbie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ avr
Spaßvogel... :-)
Lagerbestand = 0
Die hatten noch nie ein Exemplar am Lager.

Autor: AVRnewbie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Spess53

Interessant und irgendwie doch wieder uninteressant.
Ich habe es zur Kenntnis genommen.
Es gibt sie also doch! :-)
Hätte ich um 1999 gut gebrauchen können.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn man nicht alle 18 IOs braucht, kann man die ATtiny261/461/861-er 
nehmen.
Sind aber leider nicht pinkompatibel.


Peter

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab mir eben mal das Assembly File angeschaut.
Geschätzte 70 % Code sind alleine Funktionen aus der 
Gleitkommabibliothek, die in einer Uhr wohl problemlos zu vermeiden ist.

Weiter ist mir an der Vektortabelle aufgefallen, dass es keinen einzigen 
Interrupt gibt. Daraufhin hab ich mir den Quellcode angesehen, denn das 
hab ich für eine Uhr schon merkwürdig gefunden. Im Quellcode hab ich 
dann die ganzen Delayfunktionen gefunden...
So wird das mit einer genauen Uhr nichts. Man muss Hardwaretimer 
verwenden statt den Delayfunktionen. Dann wird auch die 
Gleitkommabibliothek nicht mehr gebraucht und der Code passt mühelos in 
den Speicher.

Grüße,

Peter

Autor: Borislav Bertoldi (boris_b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieder was dazu gelernt :-)
Jetzt ist der Code tatsächlich DEUTLICH geschrumpft.

Danke!

Autor: off (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mhh, also ein Wecker mit DCF, Encoder, Entprellung, RC5 Sender und 
HD4..- LCD sowie einer nicht einstellbaren Weckzeit im EEPROM ist in C 
bei 1950 bytes.

Ich kann Anfängern nur empfehlen mit nicht zu "kleiner" Hardware 
anzufangen..

Autor: Kluchscheißernder Nixwisser (kluchscheisser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
off schrieb:

> Ich kann Anfängern nur empfehlen mit nicht zu "kleiner" Hardware
> anzufangen..

Warum nicht? Mit überdimensionierter Hardware lernen sie es doch nie, 
ressourcenschonend zu programmieren bzw. effizient arbeitende 
MC-Programme zu schreiben.

MfG

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Kluchscheißender Consulter (kluchscheisser)

>Warum nicht?

Weil man zum lernen und testen Freiräume braucht.

> Mit überdimensionierter Hardware lernen sie es doch nie,
>ressourcenschonend zu programmieren bzw. effizient arbeitende
>MC-Programme zu schreiben.

Bla. Frühzeitige Optimierung ist die Wurzel vielen Übels.

MFG
Falk

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner schrieb:
> Bla. Frühzeitige Optimierung ist die Wurzel vielen Übels.

Spaghetticode schreiben ist aber noch viel schlimmer.

Man optimiert ja nicht einzelne Instruktionen.
Man programmiert modular, d.h. man überlegt sich erstmal, was das 
Programm machen soll und welche Funktionen man dazu braucht.
Dadurch sieht man, welche Funktionen sich ähneln und durch eine Funktion 
ersetzt werden können, die man dann mehrfach aufruft.
Dann fällt das Optimieren, d.h. kleinen Source/Code zu schreiben ganz 
von alleine mit ab.

Die oben genannte DCF-77 Uhr ist ja auch nicht aufs letzte Quentchen 
optimiert (Dezimalwandlung verschwenderisch mit /10, %10).
Optimiert ist dagegen die Auswertung der 59 DCF-Code Bits. Es gibt nicht 
59 Funktionen, sondern nur eine einzige. Und die holt sich einfach aus 
ner Tabelle, wo das Bit zu speichern ist und welche Wertigkeit es hat.

Optimiert ist auch die Unterteilung in einzelne Aufgaben. Eine Funktion 
mißt nur die Pulszeiten, eine andere prüft die Zeitfenster und die 
nächste macht dann die Bitauswertung. Dadurch bleibt der Code 
übersichtlich, d.h. wartbar und änderbar.


Peter

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.