- Labornetzteil AliExpress         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 24

Thema: ATtiny85 Speicher knapp, was tun?

  1. #1
    Benutzer Stammmitglied Avatar von spunky9003
    Registriert seit
    14.09.2014
    Beiträge
    36

    Frage ATtiny85 Speicher knapp, was tun?

    Anzeige

    Powerstation Test
    Hallo, ich mache grad mit dem ATtiny85 rum, der hat ja nur 6.012 Byte freien Programmspeicher, ich habe jetzt schon 5.938 Byte belegt. Was passiert, wenn ich während der Laufzeit einen String aufbaue der 100 Byte lang ist? Wird der immer irgendwo abgeschnitten? Haben Variablen einen extra Speicherbereich oder geht das auf Kosten des Programmspeichers? Hängt sich das Programm auf? Darum besser auf den nächst größeren ATtiny167 umsteigen?


    ATtiny85: https://www.ebay.de/itm/292349477939

    ATtiny167: http://www.ebay.de/itm/192209426699


    Wie viel Zeichen kann man mit Serial.read bzw. Serial.println in einem String senden bzw. empfangen, ist das begrenz oder kann man das irgendwo deklarieren? Ist ein String von 150 Zeichen ein Problem bei 9600 Baud?

    MfG.

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    ist der flash voll, meckert dein flash tool
    ist der ram schon reichlich voll wirds dramatisch

    variablen die du in methoden verwendest werden vom linker meist hochgradig optimiert (z.b. doppelnutzung bei code pfaden die nie gleichzeitig ausgeführt werden) und an den anfang des RAM gelegt
    globale variablen werden dahinter angelegt
    methodenaufrufe und deren parameter und die register die zum rechnen verwendet werden werden auf den sog. stack gelegt
    der stack wird vom ende des ram nach vorne geschrieben (rückwärts) und wenn er groß genug ist überschreibt er ohne vorwarnung deine globalen variablen (sog. stackobverflow) aber der tiny is dumm und merkt das nicht!

    wenn also deine globalen variablen rum spinnen oder der controller nach dem beenden einer methode plötzlich ins nirvana springt und mist ausführt wird dir wohl der ram ausgegenagen sein

    konstanten die du definierst kannst du zwar mit PROGMEM (PROGMEM uint8_t someTextConstant="Hello" in den flasch schreiben um RAM zu sparen aber der zugriff auf sog. progmem variablen ist tückisch, du kannst sie als einzelne variablen kopieren aber wenn du ein array kopieren willst must du memcpy_P benutzen statt memcpy ... es gibt diverse methoden die mit _P enden extra für ROM konstanten

    kontanten in den RAM zu laden bringt rein garnichts für mehr ROM, der inhalt der variablen steht trotzdem im flash, denn die variablen müssen erstmal erzeugt werden, das bringt dir ausschließlich geschwindigkeitsvorteile weil ROM konstanten mehrere takte brauchen um sie für die operation zu laden

    versuch mal deine optimierungsstufe zu ändern, mit dem aktuellen AVR GCC der mit atmel studio 7 kommt habe ich BESTE erfahreungen mit "-oS" gemacht (es gibt noch -o1 für standard optimierung, -o2 für kompakteren code und kleinen RAM, -o3 für maximal schnellen code und -oS für minimale flash größe)
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  3. #3
    Benutzer Stammmitglied Avatar von spunky9003
    Registriert seit
    14.09.2014
    Beiträge
    36
    kann ich mit atmel studio 7 auch die oben genannten USB-Board benutzen oder brauch ich einen bestimmten Programmer?

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    du kannst die hex files compilieren udn dann mit einem tool deiner wahl flashen (arduino bietet sowas auch soweit ich mich entsinne)

    aber versuch doch die optionen bei deinem compiler erstmal, müsste die gleiche wirkung haben, effekt kann cih nicht vorhersagen
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  5. #5
    HaWe
    Gast
    Zitat Zitat von spunky9003 Beitrag anzeigen
    Hallo, ich mache grad mit dem ATtiny85 rum, der hat ja nur 6.012 Byte freien Programmspeicher, ich habe jetzt schon 5.938 Byte belegt. Was passiert, wenn ich während der Laufzeit einen String aufbaue der 100 Byte lang ist? Wird der immer irgendwo abgeschnitten? Haben Variablen einen extra Speicherbereich oder geht das auf Kosten des Programmspeichers? Hängt sich das Programm auf? Darum besser auf den nächst größeren ATtiny167 umsteigen?


    ATtiny85: https://www.ebay.de/itm/292349477939

    ATtiny167: http://www.ebay.de/itm/192209426699


    Wie viel Zeichen kann man mit Serial.read bzw. Serial.println in einem String senden bzw. empfangen, ist das begrenz oder kann man das irgendwo deklarieren? Ist ein String von 150 Zeichen ein Problem bei 9600 Baud?

    MfG.
    du kannst auf einen zeitgemäßen Prozessor (z.B. Arduinos mit ARM Cortex M0, M3, ESP oder STM) umsteigen, die haben mindestes 32 KB RAM aufwärts - und es gibt sie auch mit Breadboard-kompatiblen Pin-outs.

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    das mit arduino war nur vermutet, aber vielleicht bruacht er den chip wegen pinout und größe oder gar stromverbrauch
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  7. #7
    Benutzer Stammmitglied Avatar von spunky9003
    Registriert seit
    14.09.2014
    Beiträge
    36
    ja, das Board wurde auf Grund der Größe gewählt, ich brauche auch nur wenige Pins. Auch der Preis spielte hier eine Rolle, es sollen 48 Stück seriell miteinander verbunden werden, jeder soll einen Sensor überwachen.

    Aber ich werde meinen Code überarbeiten, bisher gibt jedes Board seine Sensordaten an das nächste Board weiter, das wiederum hängt seine Daten dran usw. bis am Ende eine sehr lange Datenkette ausgewertet wird.

    Ich werde es jetzt so versuchen, das jedes Board nur fehlerhafte Sensordaten weiterleitet.

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    mach es doch einfacher, statt die daten entgegen zu nehmen, zwischen zu speichern und dann verändert weiter zu senden

    nimm das daisy chain verfahren, dafür brauchst du aber noch eine zusätzliche leitung!

    wenn der erste sensor senden möchte, zieht er eine signalleitung auf LOW (am empfänger hat die leitung einen pull up widerstand) und sendet seine daten, solange die leitung am nächsten sensor low ist, plaudert er die daten munter zum nächsten sensor weiter und zieht auch seine eigene leitung auf LOW

    wenn die leitung von LOW auf HIGH wechselt (also der erste sensor seine daten fertig gesendet hat) fängt der zweite sensor an zu senden und lässt anschließend die signalleitung zum dritten sensor los, der hat inzwischen die daten vom ersten udn zweiten sensor weitererzählt während er seine signalleitung zu nr. 4 auf low hält und hängt dann seine daten mit an .... usw. usw. usw.

    als empfänger bekommst du dann also nach dem stille post prinzip (daisy chain kommt von daisy duck die alles weiterschnattert) mehrere datenpäckchen aneinander gereiht auf die dann eine längere pause kommt

    wenn du jetzt die signalleitung vom letzten sensor an den ersten hängst hast du sogar eine endlosreihe von paketen oder deni empfänger toggelt einfach de signalleitung des ersten sensor kurz HIGH LOW HIGH und er fängt an zu senden
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  9. #9
    Benutzer Stammmitglied Avatar von spunky9003
    Registriert seit
    14.09.2014
    Beiträge
    36

    Reden

    ok, ich konnte den Code optimieren, er macht jetzt was er soll.

    Danke.

  10. #10
    Benutzer Stammmitglied Avatar von spunky9003
    Registriert seit
    14.09.2014
    Beiträge
    36

    Frage

    so, noch mal...

    ich habe hier zwei Code Schnipsel:

    wird der erste Code compiliert, brauche ich 5.900 byte (Program size: 5.900 bytes (used 98% of a 6.012 byte maximum) (0,62 secs)):
    Code:
    		.
    		.
    		.
    //		wenn eingang <> "!" und fehler = 1, dann ausgang = (eingang(!*) + 1) & "!" & (eingang(!*) + 1)
    		else if (inString.indexOf("!") == 0 && analogRead(1) > 1000) {
    			mySerial.println(inp + "!" + out);
    		}
    //		wenn eingang <> "!" und fehler = 0, dann ausgang = (eingang(!*) + 1)
    //		else if (inString.indexOf("!") == 0 && analogRead(1) < 1000) {
    //			mySerial.println(out);
    //		}
    wird der zweite Code compiliert, brauche ich 6.400 byte (Program too big. The size is 6400 bytes (of a 6012 byte maximum).):
    Code:
    		.
    		.
    		.
    //		wenn eingang <> "!" und fehler = 1, dann ausgang = (eingang(!*) + 1) & "!" & (eingang(!*) + 1)
    //		else if (inString.indexOf("!") == 0 && analogRead(1) > 1000) {
    //			mySerial.println(inp + "!" + out);
    //		}
    //		wenn eingang <> "!" und fehler = 0, dann ausgang = (eingang(!*) + 1)
    		else if (inString.indexOf("!") == 0 && analogRead(1) < 1000) {
    			mySerial.println(out);
    		}
    Im 2. Abschnitt wird weniger Code benutzt, doch ich brauch 500 byte mehr! Kann mir das mal jemand erklären? Ich benutze Visual Micro (Arduino), bei Atmel Studio 7 blick ich leider nicht durch und habe es wieder deinstalliert.
    Geändert von spunky9003 (12.12.2017 um 21:45 Uhr)

Seite 1 von 3 123 LetzteLetzte

Ähnliche Themen

  1. Weltrekord: Kleiner Quadrocopter steigt in knapp 4 Sekunden um 100 Meter
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 25.02.2016, 08:10
  2. BMW: Neuer i3 soll knapp 240 km elektrisch fahren
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 19.01.2016, 11:50
  3. Antworten: 8
    Letzter Beitrag: 21.10.2014, 10:18
  4. Suche Attiny85 im DIP-Gehäuse
    Von RAM im Forum Kaufen, Verkaufen, Tauschen, Suchen
    Antworten: 2
    Letzter Beitrag: 16.10.2011, 15:43
  5. Suche einen OPV der bis knapp unter die Versorgungsspannung ausgesteuern kann
    Von alex91 im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 4
    Letzter Beitrag: 20.05.2011, 20:04

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen