Show Posts
Pages: 1 [2] 3 4 ... 194
16  International / Deutsch / Re: 100% CPU Auslastung Arduino IDE 1.0.5 unter Mac OS 10.9.4 on: July 29, 2014, 05:03:03 am
ich habe auf meinem Mac Book (Modell Mitte 2010) seid kurzem das Aktuelle Mac OS 10.9.4 aufgespielt.

Apple scheint hart daran gearbeitet zu haben, dass viele ältere Java-Programme unter Mac OS 10.9.4 nicht mehr funktionieren, und das betrifft nicht nur die Arduino-Software.

Die Arduino-Software in der Version 1.0.5 wird nicht mehr weiterentwickelt, insbesondere wird diese Version auch nicht mehr an inkompatible Updates des Apple-Betriebssystems angepaßt werden. Das Arduino-Team arbeitet schon längst an der irgendwann erscheinenden 2.0 Version, die unter den Versionen "1.5.x BETA" läuft und inzwischen nicht nur für den DUE, sondern auch für die 8-Bit Controller anständig funktioniert.

Du solltest Dir je nach installierter Java-Version daher die Arduino-Version 1.5.7 Beta holen, die im Downloadbereich wie folgt gekennzeichnet sind:
- Mac OS X: ZIP file for Java 6 (runs on any version of OSX)
- Mac OS X: ZIP file for Java 7 (only OSX 10.7 or greater)
17  International / Deutsch / Re: Arduino Lasercontroler on: July 29, 2014, 04:40:53 am
woran liegt das ?

Also an Deinem Code liegt es wohl nicht.

Was die Ursache ist, kann man nur raten. In Frage kommen:

- Maximale TTL-Steuerfrequenz des Lasers überschritten
- Mangelhafte Stromversorgung des Lasers oder des Arduino-Boards
- Fehlerhafte analogRead-Messwerte aufgrund langer Leitungen, starker Störungen oder falscher Beschaltung

Kannst Du beim Auftreten des Fehlers in den seriellen Ausgaben erkennen, ob dann auch ein besonders hoher sensorValue gemessen wird?



18  International / Deutsch / Re: für Due: Benchmark Test für verschiedene MCUs on: July 28, 2014, 08:47:12 am
ich habe einen Benchmarktest für einen ARM7 und einen ARM9 Microcomputer geschrieben, und mich würde interessieren, ob man ihn auch auf einen Due portieren kann.
Er ist teilw. sehr speicherintensiv (Kopier- und Sortier-Tests von 3 verschiedenen int array[500]), wenn das den Specher überfordert, könnte man auch die Teil-Tests weglassen. (edit - sah gerade: 96kB RAM - das reicht 100%ig !)

Mit 1500 Integerwerten kannst Du es sogar auf einen 8-Bit Controller "Arduino MEGA2560" portieren.

Native 16-Bit int Werte belegen 1500*2Byte = 3000 Bytes.
Umgeschrieben auf 32-Bit long Werte 1500*4 Byte =6000 Bytes
Der Atmega2560 hat 8 kB RAM und der portierte Benchmark sollte in beiden Fällen lauffähig sein:
Mit nativen 16-Bit Integer.
Und mit 32-Bit Integern, die in dem Fall auf einem 8-Bit Controller "long" heißen.
19  International / Deutsch / Re: Datum von gestern ohne Libary berechnen on: July 28, 2014, 07:18:37 am
Vielen Dank für den Code, jurs!!

Ich habe nochmal den fehlerhaften Wikipedia-Algorithmus für die Berechnung der Julianischen Tageszahl überprüft und dabei festgestellt: Zumindest zwischen den Jahren 1582 und 2850 rechnet der dort angegebene Algorithmus stets eine um zwei Tage zu hohe Tageszahl aus. Der Algorithmus ist daher korrekt und nur die letzte Konstante ist falsch.

Statt 1721117 muss es im Wikipedia-Algorithmus einfach nur 1721115 heißen, dann passt es.

Ja das wäre super, wenn Du die zweite Umrechnungsfunktion auch noch portieren könntest. Meine portierte Funktion gibt für heute den 09.09.-4017 aus.  smiley-cry

Wieso hast Du solche Probleme, den Algorithmus von Wikipedia nach C umzusetzen?

Meine Funktion umgesetzt nach Wikipedia:
Code:
void calDate(long JD, int &Jahr, int &Monat, int &Tag)
{
  float Z = long(JD + 0.5);
  float g = long((Z - 1867216.25) / 36524.25);
  float A = Z + 1 + g - long(g/4);
  float B = A + 1524;
  float C = long((B-122.1) / 365.25);
  float D = long(365.25 * C);
  float E = long((B-D) / 30.6001);
  Tag = B - D - long(30.6001*E);
  if (E<14)  Monat = E - 1; else Monat = E - 13;
  if (Monat>2)  Jahr = C - 4716; else Jahr = C - 4715;
}

Für einen alternativen Algorithmus ohne die Verwendung von Gleitkommazahlen müßte man mal mit Google suchen, da gibt es sicher auch etwas.
20  International / Deutsch / Re: I2C hängt sich auf und startet Programm von neuen on: July 28, 2014, 06:26:26 am
Ich benutzen die standardmäßige library von Arduino (install Mai 2014) und die gepostet library ist der aktuelle Stand.

OK, also die standardmäßige Library.
Da diese vor der Freigabe intensiv getestet wurde und von tausenden Arduino-Programmierern verwendet wird, ist die Wahrscheinlichkeit hoch, dass das Problem nicht in der Library liegt, sondern in Deinem Code.

Bei meinen o.g. Fehlerfall stürzt mein Programm ab.

Der Begriff "Absturz" steht ja erstmal nur dafür, dass das Programm nicht mehr oder nicht mehr wie gewünscht reagiert. Dafür kann es verschiedene Ursachen geben.

Die vier häufigsten Fälle, die hier im Forum immer wieder vorkommen, sind:

1) RAM-Speicher aufgebraucht: Das Programm verbraucht mehr RAM-Speicher als der Controller RAM-Speicher frei hat. Dadurch wird bei Funktionsaufrufen der "Stack" überschrieben und nach einem Funktionsaufruf landet das Programm im Nirwana. Hast Du mal geprüft, wie viel RAM-Speicher Dein Programm noch frei hat, wenn der Fehler auftritt?

2. Durchgedrehte Pointer-Operationen: Beim Umgang mit Pointern wird nicht auf den beabsichtigen Speicherbereich zugegriffen, sondern außerhalb. Z.B. Array-Index zu klein. Falsch adressierte Pointer. Dadurch können sich sowohl RAM-Variablen auf "magische" Weise plötzlich verändern und Werte enthalten, die sie nicht enthalten sollten. Auch Folgefehler sind möglich, z.B. dass sich eine Variable mit einem Schleifenzählerwert ändert und in der Folge auf einen durchgeknallten Array-Index zugegriffen wird. Oder der Stack wird überschrieben und zerstört.  Alle Zugriffe über Pointer prüfen!

3. Mangelhafte Fehlerbehandlung: Wenn Variablen aufgrund aufgetretener (auch Hardware) Fehler plötzlich Daten enthalten, die sie nicht enthalten sollten, und solche Fehler unbemerkt durchrauschen, können Folgefehler auftreten, oft auch durch Zugriffe mit falschem Array-Index oder mit ungültigen Pointern, und dann liegt wieder Problem 2. vor. Beispiel: Ein I2C Gerät sendet Dir Daten und die Anzahl der gesendeten Bytes wird ebenfalls vom I2C-Gerät übermittelt. Du reservierst dann typischerweise so viel RAM-Speicher, wie es der maximalen Anzahl gesendeter Bytes entspricht. Wenn aber nun ein I2C-Gerät eine fehlerhafte Anzahl Bytes übermittelt und diese Anzahl größer ist als der Bereich, wo Du die gesendeten Bytes abspeichern möchtest, müßtest Du beim Einlesen stets prüfen, ob Du nicht außerhalb des reservierten Arrays Daten schreibst.

4. Endlosschleifen, bei denen die Abbruchbedingung nicht erreicht wird

Also ich würde bei einem hängenden Programm insbesondere den selbstgeschriebenen Code auf diese vier Punkt prüfen.
21  International / Deutsch / Re: I2C hängt sich auf und startet Programm von neuen on: July 28, 2014, 05:00:25 am
Hat jemand eine Idee?

Anstelle einer obskuren Wire-Library, die vermutlich von extrem wenigen Leuten verwendet wird, die vor drei Jahren zuletzt ein Update hatte und bis heute fehlerhaft zu sein scheint, die standardmäßige Wire-Library verwenden, die mit der Arduino-Software mitgeliefert wird?
22  International / Deutsch / Re: Problem mit negativer Zahl on: July 28, 2014, 04:48:43 am
Was mache ich falsch?

Du gehest davon aus, dass Du mit stets positiven "unsigned long" Zahlen in den negativen Bereich hinein rechnen kannst und dann ein richtiges Ergebnis herausbekommst. Tatsächlich bekommst Du bei einer Subtraktion in den Minusbereich einen Underflow mit Zahlen, die etliche Milliarden darstellen, und das ergibt dann wohl einen Overflow bei der abschließenden Division.

Rechnen mit negativen Zahlen funktioniert nur mit vorzeichenbehafteten Zahlen, z.B.
Code:
additionswert = additionswert + ((long)millis() - (long)timeindex[0] - 6000) / -5;

Aber Vorsicht: (long)millis() wird nach ca. 25 Tagen negativ, wenn Dein Programm so lange ohne Reset läuft.
23  International / Deutsch / Re: Datum von gestern ohne Libary berechnen on: July 27, 2014, 11:07:47 am
Da sieht der Algorithmus mit dem Julianischen Datum auf Wikipedia deutlich einfacher aus. Scheinbar bin ich aber zu blöd den dort gezeigten Pseudocode in Arduino-Code umzuwandeln. Mein Julianisches Datum stimmt nämlich hinten und vorne nicht.

Der Wikipedia-Pseudocode läßt sich supereinfach in C-Code umsetzen.
Leider scheint das Ergebnis nicht ganz genau zu sein.
Für verschiedene Tage zwischen 1990 und 2014 habe ich getestet, der Wikipedia-Code bekommt zwei Tage zuviel heraus.

Falsch rechnender Code nach Wikipedia:
Code:
long julianDay_wrong(int Jahr, int Monat, int Tag)
{
  float y = Jahr + (Monat - 2.85)/12;
  float A  = (long)(367 * y) - 1.75 * (long)(y) + Tag;
  float B  = (long)(A) - 0.75 * (long)(y / 100);
  return (long)(B) + 1721117;
}
Wenn man sich darauf verlassen könnte, dass stets zwei Tage zuviel herauskommen, könnte man auch damit arbeiten. Allein, mir fehlt das rechte Vertrauen.

Hier ist eine andere Möglichkeit zum errechnen der julianischen Tageszahl, bei der das richtige Ergebnis herauskommt:

Code:
long julianDay(int Jahr, int Monat, int Tag)
{
  Jahr+=8000;
  if(Monat<3) { Jahr--; Monat+=12; }
  return (Jahr*365L) +(Jahr/4) -(Jahr/100) +(Jahr/400) -1200820 +(Monat*153+3)/5-92 +Tag-1;
}

Ein Rechenschema zum zurückrechnen des Kalenderdatums aus der Julianischen Tageszahl kennt Wikipedia auch:
http://de.wikipedia.org/wiki/Julianisches_Datum#Berechnung_des_Kalenderdatums_aus_dem_julianischen_Datum
Ob dieser Algorithmus besser ist?
Bekommst Du das selber hin?
24  International / Deutsch / Re: Stromsparmodus Arduino Nano on: July 27, 2014, 09:03:56 am
okay vielen danke smiley

Wenn Du ein fertiges Board bevorzugst: Das "Mini-05" Board wird immer noch gelegentlich mal angeboten, z,B, hier:
http://www.exp-tech.de/Mainboards/Arduino-Mini-05-with-pin-headers.html

Weil an diesem Board alle stromfressenden Komponenten wie "Power-On LED" und "Serial-USB Adapter" standardmäßig weggelassen wurden, eignet es sich sehr gut für batteriebetriebene Projekte.

Programmieren kannst Du das Board, indem Du entweder die ISP-Pins entsprechend für einen ISP-Programmer oder einen "Arduino as ISP" anschließt, oder indem Du zum Programmieren einen externen USB-Serial-Adapter anschließt, den Du nach dem Programmieren des Boards wieder entfernst.

Die moderneren "Pro Mini" Boards haben leider eine PowerOn-LED, aber es gibt Bastelanleitungen im Internet, wie Du beim Pro Mini die stromfressende LED durch Durchtrennen einer Leiterbahn außer Gefecht setzen kannst.
25  International / Deutsch / Re: Datum von gestern ohne Libary berechnen on: July 27, 2014, 07:40:02 am
Für mein aktuelles Projekt benötige ich das Datum von gestern. Die Uhrzeit und das Datum lese ich von einer RTC (DS1307) direkt aus. Also ohne irgendeine Libary. Wie kann ich also aus dem aktuellen Datum das Datum von gestern oder vor einer Woche OHNE eine Libary berechnen?

Mit zwei Funktionen. Eine Funktion, die Dir das Datum von heute in eine fortlaufende Tageszahl umwandelt. Von der Zahl ziehst Du dann 1 ab. Und dann brauchst Du noch eine gegensätzliche Funktion, die Dir die Tageszahl wieder in das Datum zurückverwandelt.

Pseudocode für die erste der beiden Funktionen findest Du sogar bei Wikipedia:
http://de.wikipedia.org/wiki/Julianisches_Datum#Chronologisches_julianisches_Datum
26  International / Deutsch / Re: Stromsparmodus Arduino Nano on: July 27, 2014, 07:30:57 am
blinken tut mal nix smiley-grin

Hat das Nano-Board keine Board-LED an Pin-13?
Funktioniert der normale "Blink-Sketch" mit Blinken an der Pin-13 LED auf Deinem Board?

Ich merke eine veränderung druch drücken von 55mA zu 39mA

Das dürfte der Energiesparmodus sein. Ein Atmega328 mit 16 MHz getaktet braucht ca. 17 mA. Im Powerdown-Modus braucht er weit unter 1 mA, Also sollte der Stromverbrauch eines Boards mit 55 mA Verbrauch, bei dem Du den Atmega328 in Powerdown versetzt, ungefähr 55-17 = 38 mA verbrauchen.

Das kommt mit Deinem Messwert ja extrem gut hin.
27  International / Deutsch / Re: Stromsparmodus Arduino Nano on: July 27, 2014, 07:09:43 am
ich bekomme es einfach nicht hin den Nano in den Energiesparmodus zu versetzen. Ich messe immerwieder 50-55mA

Messen tue ich in dem ich ein Amperemeter in Reihe schalte zwischen 9v + und vin

Ich habe es versucht mit verschieden Lib

Ich habe Dir mal einen Beispielcode gemacht, der den Sleepmode beendet, wenn an einem Atmega328 der Pegel an Pin-2 wechselt (Interrupt 0, CHANGE) .

Wenn der Controller wach ist, sendet er je nach Status von Pin-2 eine unterschiedliche Blinkfolge auf der Board LED-13

Testschaltung:
Taster zwischen GND und Pin-2 (Pin wird im Programm auf pinMode INPUT_PULLUP gesetzt)
Code:
#include <avr/sleep.h>

#define WAKEPIN 2
#define WAKEINTERRUPT 0
#define BOARDLED 13

volatile byte isWake =1; // Statusflag zeigt, ob der Controller wach ist

void goToSleep()
{
  sleep_enable();
  noInterrupts();
  attachInterrupt(WAKEINTERRUPT, wakeUp, CHANGE);
  isWake=0;
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  interrupts();
  sleep_cpu();  // hier geht der Controller in den Sleepmode
  sleep_disable();  // und ab hier ist er nach einem Interrupt-0 wieder wach
  detachInterrupt(WAKEINTERRUPT);
}

void wakeUp()
{
  isWake=1;
}


void setup()
{
  pinMode(WAKEPIN,INPUT_PULLUP);
  pinMode(BOARDLED,OUTPUT);
//  goToSleep();  // Kommentarstriche entfernen, falls anfangs schlafend
}

void blink(int num, long duration)
{
  for(int i=0;i<num;i++)
  {
    digitalWrite(BOARDLED,(i+1)%2);
    delay(duration);
  }
}

void loop()
{
  if (isWake)
  {
    if (digitalRead(WAKEPIN)==LOW) blink(8,250);
    else blink(4,500);
    goToSleep();
  }
}

Wie verändert sich denn damit die Stromaufnahme, während der Controller schläft?
28  International / Deutsch / Re: MQ135 Air Quality Sensor inkl. Breakout bord verwenden? on: July 27, 2014, 05:51:21 am
das Auslesen des Sensors :-)

OMG!

Einen Analogeingang liest Du mit der "analogRead()" Funktion und bekommst einen Wert zwischen 0 und 1023.

Einen Digitaleingang liest Du mit "digitalRead()".

Beispielcode mit Ausgabe auf Serial, AO-Sensor an A0-Arduino und DO-Sensor an Pin-2 Arduino:
Code:
#define ANALOGEINGANG A0
#define DIGITALEINGANG 2

int sensorValue;
boolean gasAlarm;

void setup()
{
 Serial.begin(9600);      // sets the serial port to 9600
}

void loop()
{
 sensorValue = analogRead(ANALOGEINGANG);
 gasAlarm= digitalRead(DIGITALEINGANG);
 Serial.print(sensorValue);
 Serial.print('\t');
 if (gasAlarm) Serial.print("ALARM");
 Serial.println();
 delay(1000);
}

Die Alarmschwelle stellst Du mit dem Trimmerpoti auf der Sensorplatine ein.

Ob die Alarmbedingung in meinem Sketch so richtig geraten ist, dass "1" für "Alarm" steht und "0" für "kein Alarm", müßtest Du ausprobieren und falls ich falsch geraten habe müßte die Alarmbedingung negiert werden.
29  International / Deutsch / Re: Direct Port manipulation funktion für den DUE on: July 27, 2014, 05:05:49 am
Wie sieht es denn mit Analog read und Write aus? Hat da jemand vorschläge? smiley-grin

Die Arduino Core Library ist für alle unterstützten Plattformen "Open Source", einschließlich der SAM3X-Plattform und wird jeweils mitgeliefert. Da brauchst Du nur reinzuschauen, wie die Arduino-Komfortfunktionen es mit der direkten Hardwareprogrammierung machen, wenn Du Anregungen suchst.
30  International / Deutsch / Re: MQ135 Air Quality Sensor inkl. Breakout bord verwenden? on: July 27, 2014, 04:49:48 am
hat von euch schon mal jemand mit dem Sensor gearbeitet und kann mir erklären wie er funktioniert ?

Nö, noch nie mit dem Sensor gearbeitet.

Aber da brauchst Du doch nur raufschauen und weißt, wie er am Arduino funktioniert.

Dein Sensor hat vier Anschlüsse:
G - Ground - Arduino GND
AO - Analog Out - Arduino Analog-Pin
DO - Digital Out - Arduino Digital-Pin
V - Voltage - Arduino 5V

Was'n daran nicht zu verstehen?
Pages: 1 [2] 3 4 ... 194