Show Posts
Pages: 1 ... 73 74 [75] 76 77 ... 94
1111  International / Deutsch / Re: array verbesserung on: April 09, 2012, 09:59:48 am
row ist eine Variable die ich in der Schleife definiert habe, um die einzelnen "Zeilen" des Arrays zu zählen. Das Array kannst Du im Prinzip wie eine Tabelle betrachten. Der erste Wert steht für die Zeile und der zweite Wert für die Spalte. Arrays können auch mehr als 2 Dimensionen haben, wenn es notwendig ist. z.b. für Koordinaten mit x,y und z Wert.
1112  International / Deutsch / Re: array verbesserung on: April 09, 2012, 09:16:47 am
Wie wäre es mit einem mehrdimensionalen Array?
Code:
const int values[5][24] = {   { 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 3500, 1500,    0,    0,    0,    0,    0,    0,    0,    0,    0, 1500, 3500, 4095,    0,    0} ,
                                    { 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 3500, 1500,    0,    0,    0,    0,    0,    0,    0,    0,    0, 1500, 3500, 4095,    0,    0} ,
                                    { 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 3500, 1500,    0,    0,    0,    0,    0,    0,    0,    0,    0, 1500, 3500, 4095,    0,    0} ,
                                    { 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 3500, 1500,    0,    0,    0,    0,    0,    0,    0,    0,    0, 1500, 3500, 4095,    0,    0} ,
                                    { 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 3500, 1500,    0,    0,    0,    0,    0,    0,    0,    0,    0, 1500, 3500, 4095,    0,    0} };

Der Zugriff erfolgt dann z.b. über values[1][12]

Code:
void fadeLight() {
    if (hour<23) {
      for(row=0;row<5;row++)
          i[row] =values[row][hour] + ((3600000 - (3600000 - ((mins * 60000) + (sec * 1000)))) / (3600000 / (Blau1[hour+1] - Blau1[hour])));
1113  International / Deutsch / Re: Programierung für RBG Led´s on: April 09, 2012, 04:42:26 am
Poste doch mal den Code, den Du schon hast. Dann schauen wir was fehlt und wie Du Dein Problem lösen kannst. Bite verwende beim Code posten die "#" Tags oben in der Editorleiste. Das macht das Lesen für alle einfacher.
Mario.
1114  International / Deutsch / Re: Linux auf ATMega 1284p laufen lassen on: April 08, 2012, 11:43:28 am
Eben genau das meinte ich damit. "Lösung" sollte in diesem Zusammenhang auf die Lösung des Problems "Kann da Linux drauf laufen?" bezogen sein.
Mario.
1115  International / Deutsch / Re: Interrupt Service Routine: Verzögerungen und Entprellung? on: April 08, 2012, 09:13:19 am
Innerhalb einer ISR sollte immer so wenig Code wie möglich ausgeführt werden. Da Du ja innerhalb der ISR Interrupts verhinderst, werden auch alle anderen Intteruptgetriebenen Dinge (z.B. Serielle Kommunikation, Timer etc.) auch nicht ausgeführt. Es reicht doch, innerhalb der ISR ein Flag zu setzen, das dann in der "normalen" Loop ausgewertet wird.
Auf was reagiert denn Deine ISR? genereller Flankenwechsel, oder wechsel von HIGH auf LOW, bzw. umgekehrt? Das würde sicher das doppelte Ausführen erklären.
Mario.
1116  International / Deutsch / Re: Linux auf ATMega 1284p laufen lassen on: April 08, 2012, 07:46:23 am
Ok. Dann Hut ab! :-)
Aber wenn das Dingens mehrere Stunden zum booten braucht, hat diese Lösung eher esotherischen Character.
1117  International / Deutsch / Re: String in Char ohne Bufferoverflow on: April 08, 2012, 07:45:28 am
Für diesen Fall mag das richtig sein. Allerdings gibt es keine Angaben zu den Längen der Strings, daher sollte man gut überlegen wieviel "wertvollen" RAM man fix an ein Array bindet. Zum anderen wollte ich nur eine alternative Lösungsmöglichkeit aufzeigen, die sicher in andreren Situationen hilfreich sein kann. Wir sind ja schliesslich alle daran interessiert zu lernen.
Mario.
1118  International / Deutsch / Re: Projektvorstellung Holzvergaser on: April 08, 2012, 06:21:05 am
Für ein
Code:
if(tempSpeicher_oben == tempSpeicher_unten)
geht auch ein
Code:
if (abs(tempSpeicher_oben - tempSpeicher_unten) <= 0.5)
Wobei die "0.5" nur ein Beispiel ist. Hier legst Du quasi die "Genauigkeit" der Vergleichs fest. Also wie weit dürfen beide Werte voneinander abweichen, um als "Gleich" betrachtet zu werden.
Das hat zusätzlich den Vorteil, das Du hier auch die zwangsläufig vorhandenen Messfehler mit ausgleichst. Denn selbst wenn beide "realen" Temperaturen gleich sind, müssen nicht beide Sensoren einen identischen Messwert liefern.
Mario.
1119  International / Deutsch / Re: String in Char ohne Bufferoverflow on: April 08, 2012, 06:10:44 am
void* malloc(int size) und free(void*) sind in diesem Fall Dein Freund. Damit reservierst Du dynamisch Speicher und gibst ihn wieder frei.
Soweit ich weiss, klappt das auch bei der avr-libc.
Mario.
1120  International / Deutsch / Re: Licht auf bestimmte Musik !!! on: April 08, 2012, 01:42:46 am
Dann hast Du ein grundsätzliches Problem. Tritt das nur auf, wenn Du mehr als 7 LEDs betreibst, oder ist es egal wieviele LEDs angesteuert werden.
Um dem Problem auf die Schliche zu kommen, würde ich schrittweise vorgehen.
Also erstmal nur eine einzige LED ansteuern mit einer bestimmten Blinksequenz, die Du auch prüfen kannst. (z.b. 1 sekunde an, 1 sekunde aus, 0,5 sekunden an, 0.5 sekunden aus -> langes blinken, kurzes blinken)
Dann siehst Du, das die Sequenz korrekt übertragen wird. Das Ganze dann mit unterschiedlichen LEDs und Channel probieren. Wenn das einzeln auf allen Channels klappt, dann mit 2 LEDs weitermachen.
1121  International / Deutsch / Re: Licht auf bestimmte Musik !!! on: April 07, 2012, 06:45:25 am
Quote
MIt " for (int i=0; i<9; i++) {" liest Du aber 9 Byte ein nicht 8 und hast einen Array-Überlauf.
Gut aufgepasst Uwe :-)
Der Punkt im neuen Code war mir gar nicht aufgefallen, da er ja vorher schon richtig war und erst im neuen Code falsch. :-)
Anstatt ein Byte zuwenig zu lesen, wird nun ein Byte zuviel gelesen, das dann noch nicht mal verwendet wird.
Zumindest sollte sich aber die Blinksequenz geändert haben. ;-)

Achso, das wäre im übrigen eine "einfache" Methode zum debuggen. Erzeuge eine Sequenz in Vixen die immer nur eine LED eine Sekunde schaltet. Die Sequenz sollte bei der ersten LED starten und bis zur letzten durchlaufen. Anhand der "fehlenden" LEDs die nicht leuchten, kann man dann zumindest vermuten wo ein Fehler sein könnte. Nicht schön, aber besser als nix.
1122  International / Deutsch / Re: Licht auf bestimmte Musik !!! on: April 07, 2012, 06:23:53 am
Es wäre aber z.B. gut zu wissen, das Du das bereits probiert hast. Wie sollen wir Dir effektiv helfen, wenn wir raten müssen.
Wenn Du den Code schon bereinigt hast, würde ich eher auf ein Problem bei der übermittelten Sequenz vermuten. Da ich das Protokoll nicht kenne, kann ich dazu aber nicht viel schreiben.
Leider ist das debugging hier ein wenig schwierig, da die serielle Verbindung die man normalerweise für Ausgaben verwendet, bereits blockiert ist. Schau Dir daher evtl. nochmal genau die definierten Channels und Sequenzen im Vixen an, vielleicht steckt da ja ein kleiner Fehler drin. (Channel vertauscht o.ä.)
Der Code sieht aus meiner Sicht zumindest erstmal sauber aus.
1123  International / Deutsch / Re: Linux auf ATMega 1284p laufen lassen on: April 07, 2012, 06:10:13 am
Ich halte das eher für einen Aprilscherz. Wenn auch ein gut gemachter. Sollte das tatsächlich echt sein, dann Hut ab. :-)
1124  International / Deutsch / Re: Licht auf bestimmte Musik !!! on: April 07, 2012, 06:05:30 am
Quote
Nur ich weiß nicht genau wie ich das problem lösen kann und ob man es überhaupt lösen kann....im moment fällt mir noch nichts passendes ein !
Das verstehe ich nicht ganz, Du hast doch das Beispiel auf die 8 LEDs erweitert, nur lediglich vergessen an allen Stellen den Code auf 8 LEDs zu erweitern.
Die Stelle
Code:
if (Serial.available() >= 7)
fragt ab, ob bereits 7 Bytes für 7 Channels im seriellen Puffer liegen. Was muss man wohl machen, wenn man statt 7 nun 8 Channel hat und daher warten will, bis 8 Bytes für 8 Channel im Puffer liegen?
Ebenso das Array
Code:
int incomingByte[7];
das für 7 Byte definiert wird. Was muss ich wohl machen, damit ich ein Array für 8 Bytes definiere?
1125  International / Deutsch / Re: Licht auf bestimmte Musik !!! on: April 07, 2012, 05:11:50 am
Ich vermute mal, Dein Problem ist das
Code:
if (Serial.available() >= 7)
Damit wird schon aus dem Serial-Puffer gelesen, wenn erst 7 der 8 Channels übertragen wurden. Damit bleibt das 8 Byte im Puffer und wird beim nächsten Durchlauf als erstes Byte also für Channel 1 gelesen. Damit verschiebt sich Deine Sequenz um genau 1 Byte pro Durchlauf.
Ein weiterer Fehler, der sich aktuell zwar nicht auswirkt, aber später Probleme machen kann ist, das Dein Array zu klein ist.
Ein
Code:
int incomingByte[7];
Erzeugt ein Array mit 7 Einträgen, nicht mit 8. Eigentlich könntest Du nur von incomingByte[0] bis incomingByte[6] darauf zugreifen. Das Du incomingByte[7] verwendet kannst, liegt einfach nur daran das der Arduino kein Memory-Protection hat. Da der Compiler aber nicht weiss, das Du ein Byte mehr an Speicher verwendest, kann es sein das auf diesem Byte bereits wieder Daten einer anderen Variable im Speicher liegen und Du damit plötzlich deren Wert veränderst, wenn Du ein incomingByte[7]=xxx machst.
Pages: 1 ... 73 74 [75] 76 77 ... 94