Go Down

Topic: Hilfe beim Sketch verkleinern (Read 4696 times) previous topic - next topic

Tommy56

Einige der Arrays scheinen mir konstante Werte zu beinhalten. Dann sollte man die auch als solche deklarieren. Dann könnten die ins Flash, wo wohl noch Platz ist.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Serenifly

Einige der Arrays scheinen mir konstante Werte zu beinhalten. Dann sollte man die auch als solche deklarieren. Dann könnten die ins Flash, wo wohl noch Platz ist.
const "Variablen" (z.B. const int var = 5) landen i.d.R. automatisch im Flash. Bei Arrays ist das allerdings nicht der Fall. Da muss man etwas weiter ausholen

Tommy56

Über PROGMEM. Es wäre aber evtl. ein Weg, um RAM zu sparen.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

michael_x

Quote from: Rudi
Globale Variablen verwenden 95 Bytes (74%) des dynamischen Speichers.
Ok, ok, Asche auf mein Haupt, der eine extreme Wert 55000 ist maximal auf 25400 gesetzt. Sieht aber dennoch gut aus.
Glückwunsch. Wenns passt, erübrigt sich weiteres Feilen. Blinkdauern im 100 ms Raster und bis max 25,5 sec. sind vermutlich eine problemlose Vereinfachung.

Der nächste Wunsch ist wohl eher:  unterschiedliche ein- und aus-Dauern ;)

RudiDL5

Quote
unterschiedliche ein- und aus-Dauern
Interessanter Gedanke  ;) Aber dann macht der 2313 wirklich schlapp. Ich dachte eher an ein einfaches "verschieben / rotieren" der Zeitwerte, das geht aber nur bis 15 LEDs. Ab 16 fangen Instabilitäten an. Aber auch ohne "Extras" ist das schon ein netter Weihnachts-Blinker, der kaum "langweilig" aussieht. :D

combie

#20
Nov 03, 2017, 10:23 am Last Edit: Nov 03, 2017, 10:24 am by combie
Quote
Ab 16 fangen Instabilitäten an.
Vorschlag:
setup() und loop() weg.
Stattdessen main()
Verringert die Schachtelungstiefe.
Dann ist auch die Timer ISR weg.
Also weniger Stackbedarf.
Und ein paar Byte an globalen Variablen sparts auch noch.

Für die Zeitsteuerung muss man sich dann was anderes einfallen lassen...
z.B. util/delay.h
Oder Hardware Timer pollen
Alle sagen: Das geht nicht!
Einer wusste das nicht und probierte es aus.
Und: Es ging nicht.

RudiDL5

@combie

Mit dieser Variante "main" statt "setup/loop" habe ich in diesem Fall schon jongliert. Wenn man wegen dem dadurch fehlenden Timer die notwendige "init" hinzufügt bleibt das alles gleich und man gewinnt nichts. In der Tat müsste man den Timer in abgespeckter Version manuell einrichten, weil "init" intern noch die zusätzlichen Variablen für "micros" bedient. Oder das ganze direkt in Assembler schreiben - würde noch einiges mehr an Platz schaffen.

Aber ich denke, das würde hier im Moment ein wenig zu weit führen. Wenn man wie oben die 17 LEDs mit der "normalen" Variante bedient sieht es schon recht gut und wenig langweilig aus. Ein zyklisches Verschieben der Zeitwerte kann man gar nicht wirklich erkennen. Ich bin mir recht unsicher, ob der zusätzliche Aufwand an dieser Stelle nötig ist.

LG, Rudi

Floetzinger

Hilfe!
Wenn ich geahnt hätte, dass ihr alle so viel Hirnschmalz für mein Problem verbraucht, hätte ich niemals nach Lösungsvorsachläge gefragt. Ihr seid ja famos.
Danke euch allen!

Ich will ja nicht mutwillig was in den 2313 reinstopfen, war halt noch da, 4313 eben nicht mehr.
Aber gelernt habe ich trotzdem, glaube ich.

Der Preis für den 4313 liegt grad bei 1,60 Euro/ Stück. Durchaus noch leistbar für mich.

Wünsche euch ein schönes Wochenende.


Flötzinger

Floetzinger

@RudiDL5 (oder falls jemand schneller als RudiDL5 ist):
doch noch eine Frage:

  DDRD = 0b01111111;
  DDRA = 0b00000011;
  DDRB = 0b11111111;
bedeutet was?
Kann ich da für zukünftige Projekte etwas mit anfangen?
Scheint mir ja wichtig zu sein.
schon jetzt Danke für die Auskunft.

Tommy56

Für eine Wiederverwendung musst Du es verstehen. Schaue Dir mal diese Doku dazu an.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Floetzinger

Ok, Danke.
links höherwertig, rechts niederwertiges Bit/Port (7->0), richtig?

Tommy56

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Floetzinger

so, Ports ein/ ausschalten über DDRD (A/B) klappt, verstanden wie es geht (grün).
nächste Frage:
Wo macht denn den RudiDl5 sein Sketch den Zufall?

Code: [Select]

byte          ledtakt[17] = {60,25,40,75,33,90,57,24,100,68,73,80,37,75,254,97,105};
unsigned long ledtime[17] = {0};

void setup()
{
 [color=green] DDRD = 0b01111111;
  DDRA = 0b00000011;
  DDRB = 0b11111111;[/color]
}

void loop()
{
  for( byte LED = 0; LED < 17; LED++ )
     {
       if( millis() - ledtime[LED] < (ledtakt[LED]*100) ) continue;
       while( millis() - ledtime[LED] >= (ledtakt[LED]*100) ) ledtime[LED] += (ledtakt[LED]*100);       
       digitalWrite( LED, !digitalRead(LED) );       
     }
}
 

combie

Quote
Wo macht denn den RudiDl5 sein Sketch den Zufall?
Nirgendwo.
Alle sagen: Das geht nicht!
Einer wusste das nicht und probierte es aus.
Und: Es ging nicht.

Floetzinger

 :)
ich guck schon die ganze Zeit, wie die LEDs an und aus gehen, lustig durcheinander und frage mich ernsthaft: wieso? und such im Sketch, finde aber kein Zufallgedöns.
Also frage ich.
ist hier Magie im Spiel?

Ihr verwirrt mich. :smiley-eek:

Go Up