Show Posts
Pages: [1] 2 3 ... 28
1  International / Deutsch / Re: switch case "umgehen" on: September 14, 2014, 06:58:20 am
Also:
Code:
const byte TempByte[] PROGMEM = {Temp16, Temp17, Temp18, Temp19, Temp20, Temp21, Temp22, Temp23, Temp24, Temp25, Temp26, Temp27, Temp28, Temp29, Temp30};   
setBitPattern (irString[6], TempMask, pgm_read_byte(&TempByte[SollTemp-16]));   
gegenüber:
Code:
const byte TempByte[] = {Temp16, Temp17, Temp18, Temp19, Temp20, Temp21, Temp22, Temp23, Temp24, Temp25, Temp26, Temp27, Temp28, Temp29, Temp30};   
setBitPattern (irString[6], TempMask, TempByte[SollTemp-16]);
Ergebnis:
Flashbedarf: identisch
SRAM: mit Progmem 16Byte weniger. Was zu erwarten war.

Aber was mir am besten gefällt: Ich hab ohne die Case-Anweisung über 40 Zeilen weniger Code  smiley smiley smiley
2  International / Deutsch / Re: switch case "umgehen" on: September 14, 2014, 02:18:33 am
deine idee ist dazu ganz gut zu gebrauchen.
benutze einfach sowas wie ein offset.

Code:
TempByte[deinindex + 16]  //deinindex = -16

somit ist der erste wert bei 0.

Oh man, wie doof von mir. Da hab ich den Wald vor lauter Bäumen wieder nicht gesehen  smiley-yell
Müsste aber dann [Index -16] sein!?


Quote
Die Arraylösung ist nicht schlecht belastet aber das SRAM unnötig.
Ja, ich wollte das eh noch ins Flash packen. Muss dazu noch etwas in meinen alten Threads etwa nachlesen, wo mir Serenifly geantwortet hat.
Ich glaub der programmiert immer so, dass er mit 100Byte SRAM auskommt. LOL
Aber ist das nicht wieder kontraproduktiv zu meinem Vorhaben? Durch das Verlagern ins flash muss ich wieder mehr Code schreiben, der mir die Daten aus dem Flash liest. -> pgm_read_byte_near usw...


Noch ne Frage:
Wenn ich die Bitkombination mit define für mich lesbarer mache, kann ich dann auch die defines im Array verwenden?
Code:
byte TempByte[] = { Temp16, Temp17, Temp18...}
Sollte doch der Präprozessor dann umsetzen. Oder?
3  International / Deutsch / switch case "umgehen" on: September 13, 2014, 05:18:56 pm
Hi,
da mir bei meinem aktuellen Projekt langsam der Flash knapp wird, bin ich gerade am grübeln wo ich einsparen kann.
Ich hab da eine ewig lange switch case Anweisung, die mir gar nicht so gefällt, weil das bestimmt besser programmiert werden kann. Aber nur wie?

Hier mal ein Auszug aus meinem Code:
Code:
#define TempMask B10000011
#define Temp16 B00000100
#define Temp17 B01000100
#define Temp18 B00100100
.......
int SollTemp

      switch (SollTemp) {
         case 16:
            setBitPattern (irString[6], TempMask, Temp16);           
         break;
         case 17:
            setBitPattern (irString[6], TempMask, Temp17);           
         break;
         case 18:
         ....

Also abhängig von Solltemp soll das Unterprogramm setBitPattern mit anderen Parametern aufgerufen werden.
Ich könnte jetzt schon einen C-string aus 'Temp' und der Integer zusammenbauen, damit er so heisst, wie der dritte Übergabeparameter, aber das wird wohl kaum funktionieren, dass dann in dem Unterprogramm der zugehörige Bitcode verwendet wird.

Evtl. könnte ich die Bitcodes in ein Array packen.
Etwa so:
Code:
byte TempByte[] = { B00000100, B01000100, B00100100...}
Und das dann über TempByte[Temp] abrufen. Für Temp = 16....30
Aber kann ich ein Array so definieren, dass der erste Wert des arrays mit index-16 abgerufen werden kann?

Hmm da bin ich wieder an meine Grenzen angekommen  smiley-confuse
4  International / Deutsch / Re: Ausgabe mittels sprintf im Binärformat nicht möglich? on: September 08, 2014, 05:56:46 pm
Ich mal etwas rumgespielt. Du kannst auf das aufwendige printf() komplett verzichten (die Funktion braucht sehr viel Flash):

Yep, haste recht. Sind ~1,6k
Morgen bau ich um. Jetzt fallen mir schon die Deckel runter.

Danke und gute N8
5  International / Deutsch / Re: Ausgabe mittels sprintf im Binärformat nicht möglich? on: September 08, 2014, 05:39:55 pm
Hi Serenifly, mein persönlicher Forumsjoker  smiley-razz

So variabel brauch ichs gar nicht. Will ja nur immer ein Byte ausgeben.
Hab daher nur das wesentliche aus deinem Beispiel gezogen.
Aber irgendwie bringt der neue Code den UNO zum abkacken:
Code:
  void printIrString () {
     char tmp[10];
     for (int s = 0; s < 19; s++) {
         sprintf(tmp, "Byte %02d: %02X " , s , irString[s]);
         Serial.print (tmp);
         utoa(irString[s], tmp, 2);
         int length = strlen(tmp);
for(int i = length; i < 8; i++)
Serial.print('0');
         Serial.println (irString[s], BIN);
      }
     Serial.println ();
   }

EDIT:

Aaaaahhhh:
Code:
    char tmp[10];
Was hat mich da geritten...... dachte für die Binärzahl ist das array groß genug. Aber für den sprintf hats dann nicht mehr gereicht.
Schäm


BTW: Danke dass du gleich immer ein Codebeispiel hinterherschickst. Das machts für mich dann doch leichter.  smiley-cool
6  International / Deutsch / Ausgabe mittels sprintf im Binärformat nicht möglich? on: September 08, 2014, 05:05:55 pm
Hi,

kann man in C keine sprintf-Formatierung im Binärformat machen?
Also so:
Code:
   void printIrString () {
     char tmp[20];
     for (int s = 0; s < 19; s++) {
         sprintf(tmp, "Byte %02d:  %02X  %08b" , s , irString[s], irString[s]);
         Serial.println (tmp);
     }
     Serial.println ();
   }

Soll ein Bytearray sowohl als Hexzahl, und neben dran als Binärzahl darstellen. Hexzahl geht, Binärzahl nicht.
Ja ich weiss, es ginge auch mit:     
Code:
Serial.println (irString[s], BIN);
Aber da fehlen halt die führenden Nullen.
7  International / Deutsch / Re: 1000Byte RAM durch #include einer Bibliothek verlieren? on: September 08, 2014, 11:13:57 am
Hi,

hab lange rumgesucht. Bin dann letztlich zu der (weisen) Entscheidung gekommen, die lib nochmal runter zu laden.
Jetzt passt es. Ich seh nur noch das "Verschwinden" von 200 Byte beim Aufruf der lib. Und das ist aus dem Grund, den Serenifly genannt hat: der RawBuffer.

Wieso die 200 Byte trotzdem verbraten werden, obwohl nur ein include der lib, und kein aktives Anprechen eines Unterprogramms erfolgt, kann ich mit meinen sprälichen C-Kenntnissen nicht beantworten.
8  International / Deutsch / Re: 1000Byte RAM durch #include einer Bibliothek verlieren? on: September 07, 2014, 05:49:50 pm
1000 Byte scheint mir etwas viel,

Ja, wundert mich auch etwas. Konnte den Wert aber immer nachvollziehen,
Vllt. ist auch meine RAM-Berechnung fehlerhaft.
9  International / Deutsch / 1000Byte RAM durch #include einer Bibliothek verlieren? on: September 07, 2014, 05:01:02 pm
Hi,

Da mir das RAM meines UNOs etwas knapp wurde, habe ich etwas reverse engineered.

Und da ist mir aufgefallen, dass alleine das Einfügen der IRremote-Bibliothek 1000Byte Arbeitsspeicher kostet.
Code:
#include <IRremote.h>
Zuerst habe ich alle Aufrufe zu dieser lib im Sketch ausmaskiert. Das brachte keine Änderung am freien Arbeitsspeicher.
Erst durch Löschen des includes wurden 1006Byte frei.

Das versteh ich ganz und gar nicht  smiley-confuse

Meine freien RAM berechne ich so: Das hab ich mal irgendwo im Inet gefunden. Hoffe die Berechnung ist auch verlässlich.
Code:
int freeRam () {
  extern int __heap_start, *__brkval;
  int v;
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}

Hat dazu jemand eine Idee?
10  International / Deutsch / Re: QWERTZ-Tastatur an Mega 2560 - einfach und billig on: September 06, 2014, 10:45:43 am
Mal Off-topic:

Was meinst du mit "ntl"??? Das frag ich mich schon seit deinem gestrigen Post in meinem Thread.
11  International / Deutsch / Re: Variablendeklaration auslagern on: September 05, 2014, 06:48:08 pm
OK,

danke. Wieder was gelernt.  smiley

Na hoffentlich erinnere ich mich wieder, wenn ich es nochmal brauche ... LOL
12  International / Deutsch / Re: Variablendeklaration auslagern on: September 05, 2014, 06:38:35 pm
Kommando zurück:

Also hast du zwei Optionen:
1.) Def.h und #include "Def.h"
<> ist übrigens eigentlich für System-Header. "" für Header im Sketch Ordner

#include "Def.h" damit gehts. Auch mit der Def.h-Datei im Sketch-Ordner

Def.h (mit Semikolon hinten dran oder auch nicht)  geht aber nicht :-(
--> error: expected constructor, destructor, or type conversion before '.' token
13  International / Deutsch / Re: Variablendeklaration auslagern on: September 05, 2014, 06:29:45 pm
Uiiiii
Jetzt kapier ich gar nichts mehr  smiley-eek
Quote
#defines sind keine Variablen, sondern lediglich Textersetzungen

Ich machs momentan so:
Code:
#define Temp20 B00010100
      Serial.println (Temp20 >>2, BIN);
Die define-Anweisung am Sketchanfang. Das geht.
Die define-Anweisung in die Definitions.h im Sketch-Ordner geht nicht -> Temp20 was not declared in this scope.....
Die define-Anweisung in die Definitions.h im lib-Ordner geht wieder.

Ich hab nur eine Ino als Sketch.
Und frag mich, ob define das Richtige ist, oder gegen const getauscht werden sollte.


14  International / Deutsch / Re: Variablendeklaration auslagern on: September 05, 2014, 06:02:34 pm
Also, ich habe in der Def.h nur "#defines "
Da war ich vorhin etwas schlampig und hab öfters von Variablen gesprochen.

Wie soll ich das #include weglassen?
Nur <Definition.h> oder <Definition.ino> bringt den Compiler gleich zum "Heulen" --> error: expected unqualified-id before '<' token

Das mit der Alphabetischen Reihenfolge stimmt schon, allerdings nur für die "Neben-Inos" Die "Haupt-Ino" steht immer links im Tabfenster und wird wohl auch immer als erste betrachtet.


Edit:
Irgendwie hab ich das Gefühl, dass er den include-Befehl gar nicht ernst nimmt. Wenn ich eine "Fantasie-Datei" angebe, dann bringt er auch keinen Fehler.
Seltsam.....

Nochmal Edit:
Hab mal die ausführliche Ausgabe beim Compilen zugeschaltet. Kommt ne Warnung: "No such file or dierectory"
Die Definitions.h in den lib-ordner kopiert. Auch nicht besser.
Einen Unterordner mit lib/Definitions erstellt, die Datei da rein...et voila .... die Sch... geht.

Aber das war nicht mein Ziel. Das ganze Programm zerissen. Wollte es eigentlich übersichtlich gestalten. Der Schuss ging nach hinten los.

@Serenifly:
 
Quote
Also mit Konstanten und Makros funktioniert es auf jeden Fall. Ich mache das die ganze Zeit schon mit const, #define und enums
Wo legst du die Datei dann ab.
15  International / Deutsch / Re: Bitmanipulation in Byte on: September 05, 2014, 05:44:32 pm
Hi,

ich habs jetzt so gemacht:
Code:
    #define T1 B00010100
      ...
      byte test = 0xff;
      setBitPattern(test, B10000011, T1);  
      ...

    byte setBitPattern(byte &destination, byte mask, byte pattern)
    {
      destination &= mask;
      destination |= pattern;
      return destination;
    }

Da bin ich jetzt universell. Habe nämlich unterschiedliche Anwendungsfälle. Mal mit 5, oder auch weniger Bits.

Danke für die Hilfe.
Pages: [1] 2 3 ... 28