Go Down

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

combie

#30
Nov 06, 2017, 04:33 pm Last Edit: Nov 06, 2017, 04:36 pm by combie
Dann frage dich, welchen Sinn und Zweck ledtakt haben könnte....

Tipp 1:
Nicht alles, was wie ein Zufall aussieht, ist auch einer.

Tipp 2:
Magie ist, wenn man die Technik dahinter nicht verstanden hat.
Alle sagen: Das geht nicht!
Einer wusste das nicht und probierte es aus.
Und: Es ging nicht.

Doc_Arduino

Manchmal ist es auch andersrum.   :)

"Der Laie staunt der Fachmann wundert sich."
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Floetzinger

@Combie:
jetzt mal mit dem weiter untenstehenden Multiplikator gespielt, da ging mir doch ein Lichtlein auf.
nicht wirklich Zufall. Tipp angekommen.
aber magisch ist es trotzdem ( O-Ton Neu-Flötzinger).

combie

Damit es nicht langweilig wird, möchte ich mal eben an die Maximalströme erinnern.
Da gibts auch Grenzen.
Nicht nur für jeden Pin, sondern auch für jeden Port und auch für den gesamten Chip.


Bei 20mA pro LED läuft das schon reichlich aus dem Ruder, nehme ich mal an.
Alle sagen: Das geht nicht!
Einer wusste das nicht und probierte es aus.
Und: Es ging nicht.

RudiDL5

... mal eben im Umzugs-Stress zwischen den Kartons hervorschaue ... ;)

Bei 20 mA je LED würde sich der 2313 im Extremfall wahrscheinlich in Rauch auflösen - aber genau aus diesem Grund habe ich jeder LED (siehe oben) einen 1 kOhm Widerstand gegönnt. Somit schwankt der Stromverbrauch zwischen minimal 5 mA und maximal 85 mA für 17 Leuchtdioden. Als LEDs habe ich die kleinen 3mm-Dinger Rot/Gelb/Grün eingesetzt, die bei 5 mA noch ausreichend gut leuchten. Sollte man aber mehr Lichausbeute wünschen (brauchen) wäre jeder Kanal separat zu verstärken.

Floetzinger

keine Sorge Combie, der Breadboard Aufbau hat schon die auch später auf der Platine verwendenen ULN 28xx am Start.
Läuft konstant, quasi ohne Störung über externes Netzteil.

combie

#36
Nov 06, 2017, 05:17 pm Last Edit: Nov 06, 2017, 05:56 pm by combie
Schön, dann ist ja wenigstens bei euch beiden alles in trocknen Tüchern.
Alle sagen: Das geht nicht!
Einer wusste das nicht und probierte es aus.
Und: Es ging nicht.

Floetzinger

si.
wie wir Franzosen sagen....

RudiDL5

Hochinteressant ... und gleichzeitig ärgerlich wenn man feststellt, was für faule Eier man sich bei gedankenlosem Copy&Paste ins Nest holen kann! Die ganze Zeit über brodelte es im Hinterkopf, was diese übernommene While-Schleife eigentlich bewirken soll?! Als ich mir gerade meine alten Sketches ansah, bin ich über diesen Bock gestolpert: Die ganze Konstruktion aus dem Ursprungs-Sketch ist m.E. "falsch herum" und die loop() kann noch weiter vereinfacht werden:
Code: [Select]

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

Test-Ergebnis: Die LEDs blinken genau so lustig wie in der ersten Version, identische Muster, man spart noch mal knapp 60 Byte Flash, die loop() wird übersichtlicher, ungeprüftes Copy&Paste macht einem das Leben schwerer als notwendig...

Beste Grüße, nächste Tage ist auf jeden Fall Umzug auf dem Programm
Rudi

combie

#39
Nov 07, 2017, 12:08 am Last Edit: Nov 07, 2017, 12:19 am by combie
Ja, sieht viel aufgeräumter aus!

-----------

Wo du gerade so fein am optimieren bist....

Code: [Select]

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

inline void toggle(const uint8_t pin) // nicht alle AVR koennen PinToggle
{
  uint8_t bit  = digitalPinToBitMask(pin);
  uint8_t port = digitalPinToPort(pin);
  *portInputRegister(port) = bit;
}



void setup()
{
  DDRD = 0b01111111;
  DDRA = 0b00000011;
  DDRB = 0b11111111;
}

void loop()
{
     for( byte LED = 0; LED < 17; LED++ )
     {
         if( millis() - ledtime[LED] >= (pgm_read_byte(&ledtakt[LED]) * 100))
         {
            ledtime[LED] = millis();
            toggle(LED);
            //digitalWrite( LED, !digitalRead(LED) );       
         }
     }     
}
Alle sagen: Das geht nicht!
Einer wusste das nicht und probierte es aus.
Und: Es ging nicht.

RudiDL5

Is ja cool! Das spart ja noch mehr und macht weiteren Raum für Spielerei.
Man(n) lernt halt nie aus. Aber das werde ich mir nach meinem Umzug
in Ruhe und genau ansehen.
Besten Dank

combie

Schön, wenn es gefällt!



Noch mehr Raum, geht auch noch.
Aber auf Kosten der Taktgenauigkeit.

Code: [Select]

const byte ledtakt[] PROGMEM = {60,25,40,75,33,90,57,24,100,68,73,80,37,75,254,97,105};
byte ledtime[sizeof(ledtakt)];

inline void toggle(const uint8_t pin)
{
  uint8_t bit  = digitalPinToBitMask(pin);
  uint8_t port = digitalPinToPort(pin);
  *portInputRegister(port) = bit;
}

byte zeitMerker = 0; // millis() ErsatzStoff


void setup()
{
  DDRD = 0b01111111;
  DDRA = 0b00000011;
  DDRB = 0b11111111;
}

void loop()
{
     for( byte LED = 0; LED < 17; LED++ )
     {
         if(zeitMerker - ledtime[LED] >= pgm_read_byte(&ledtakt[LED]))
         {
            ledtime[LED] = zeitMerker;
            toggle(LED);
            //digitalWrite( LED, !digitalRead(LED) );       
         }
     }
     _delay_ms(99); // 1 ms für die Verarbeitung
     zeitMerker++;   
}

*ungetestet*

Alle sagen: Das geht nicht!
Einer wusste das nicht und probierte es aus.
Und: Es ging nicht.

combie

#42
Nov 07, 2017, 01:09 am Last Edit: Nov 07, 2017, 01:37 am by combie
Ich schätze mal, hier ist dann so ziemlich Ende der Fahnenstange:
Code: [Select]

const byte ledtakt[] PROGMEM = {60,25,40,75,33,90,57,24,100,68,73,80,37,75,254,97,105};
byte ledtime[sizeof(ledtakt)];

inline void toggle(const uint8_t pin)
{
  uint8_t bit  = digitalPinToBitMask(pin);
  uint8_t port = digitalPinToPort(pin);
  *portInputRegister(port) = bit;
}

byte zeitMerker = 0; // millis() ErsatzStoff

int main()
{
  DDRD = 0b01111111;
  DDRA = 0b00000011;
  DDRB = 0b11111111;
  for(;;)
  {
       for( byte LED = 0; LED < 17; LED++ )
       {
           if(zeitMerker - ledtime[LED] >= pgm_read_byte(&ledtakt[LED]))
           {
              ledtime[LED] = zeitMerker;
              toggle(LED);
              //digitalWrite( LED, !digitalRead(LED) );       
           }
       }
       _delay_ms(99); // 1 ms für die Verarbeitung
       zeitMerker++;   
  }
}

*ungetestet*

Kompiliert für einen Mega
Quote
Der Sketch verwendet 580 Bytes (0%) des Programmspeicherplatzes
Globale Variablen verwenden 18 Bytes (0%) des dynamischen Speichers
Alle sagen: Das geht nicht!
Einer wusste das nicht und probierte es aus.
Und: Es ging nicht.

RudiDL5

Ausgabe der letzten Fassung:

Der Sketch verwendet 260 Bytes (12%) des Programmspeicherplatzes. Das Maximum sind 2048 Bytes.
Globale Variablen verwenden 18 Bytes (14%) des dynamischen Speichers, 110 Bytes für lokale Variablen verbleiben. Das Maximum sind 128 Bytes.


Hmmm, in beiden *ungetestet*-Versionen fehlte oben jeweils #include <util/delay.h> Nachdem ich das eingebunden hatte übersetzte er es anstandslos. Doch irgendein Problem ist in beiden Fassungen: Er startet und blinkt anfangs nett wie eh und je ... nach einigen Umdrehungen hängt sich der 2313 auf und macht nix mehr. Alles via UNO R3 auf einen 2313 mit 17 LEDs übertragen.

Das reizt mich aber ungemein, die Philosophie dahinter zu verstehen. Muß jedoch (leider) erst den Umzug abwarten...

RudiDL5

Wenn ich "zeitmerker" auf unsigned long setze ... hängt er sich zwar nicht mehr auf, aber nach einer gewissen Anzahl Umdrehungen fängt alles an wild zu flackern. Da muss ich mal bei Gelegenheit auf die Suche gehen... interessiert mich nämlch ungemein!

Go Up