Show Posts
Pages: 1 2 3 [4] 5 6 ... 219
46  International / Deutsch / Re: PROJEKT MIT ARDUINO MEGA256 UND CMUCAM 4 on: September 21, 2014, 01:06:27 pm
hi!
es geht mein Projekt. ich muss mit Arduino mega 256 und die CMUCAM4 forme und Farbe von drei unterschiedliche Objekten in drei behälter sortieren können.
zum beispiel: objekt von type1:gelb und dreieckig form geht zum behälter 1
                          objekt von type2:rot und rechteckige form geht zum behälter 2
                          objekt von type3:blau und rund geht zum behälter 3
-objekten bezüglich der form zu unterscheiden habe ich keine Ahnung

ich bitte um ihre beitrag

Falls es Dir bei der beschriebenen Aufgabenstellung nicht aufgefallen ist: Du brauchst Deine drei verschiedenen Objekte nicht nach zwei Kriterien sortieren, sondern nur nach einem einzigen!

D,h. Du kannst Dir aussuchen, ob Du die Objekte nach Farbe ODER nach Form sortierst, aber Du brauchst nicht beides.

Sobald Du Deine drei Objekttypen nach Farbe sortiert hast, sind sie gleichzeitig auch nach Form sortiert. Und umgekehrt.

Wenn es so ist wie Du schreibst "bezüglich der form zu unterscheiden habe ich keine Ahnung", dann brauchst Du davon auch überhaupt keine Ahnung haben, solange Du wenigstens Ahnung davon hast, wie Du die Objekte nach Farbe sortieren kannst. Das reicht bei der Aufgabenstellung aus!
47  International / Deutsch / Re: DS18B20 auf Atmega8 on: September 21, 2014, 12:54:54 pm
Kann ich noch ein Register Array erstellen mit enum?

Ja klar kannst Du, das ergibt sich doch aus den Kommentaren in dem von Dir kopierten Code.

Aber um eine Gleitkommazahl (4 Bytes) in Integer-Registern zu übertragen, benötigst Du zwei Stück von der Sorte.

Zum Beispiel:
Code:
enum
{    
  CELSIUSHIWORD,  
  CELSIUSLOWORD,
  HOLDING_REGS_SIZE_2 // leave this one
};
Dann teilst Du vor dem Senden Deinen 4-Byte Gleitkommawert auf zwei Register auf:

holdingRegs[CELSIUSHIWORD]= obere zwei Bytes der Variablen
holdingRegs[CELSIUSLOWORD]= untere zwei Bytes der Variablen

Und am Ende mußt Du die Bytes zu zwei und zwei dann wieder zu einer float-Gleitkommazahl zusammenfügen und kannst sie Dir danach anzeigen lassen.
48  International / Deutsch / Re: Lösungsansatz gesucht im Sleepmode on: September 21, 2014, 12:43:51 pm
Der Atmega328 hat zwei Hardware-Interrupts.

Was mit Pin-2 und Interrupt-0 möglich ist, funktioniert auf Atmega328 Controllern ebenfalls mit Pin-3 und Interrupt-1.
49  International / Deutsch / Re: DS18B20 auf Atmega8 on: September 21, 2014, 12:31:30 pm
mit
Code:
long celsius1= raw*625L;
holdingRegs[celsius] =celsius1;   

Wie wäre es denn damit, symbolische Konstanten stets in GROSSBUCHSTABEN zu schreiben, und das bei enum-Konstanten genau so wie bei #define-Konstanten zu handhaben, damit Du nicht zwischen Konstantennamen und Variablennamen durcheinander kommst?

Code:
//////////////// registers of your slave ///////////////////
enum
{     
  // just add or remove registers and your good to go...
  // The first register starts at address 0
  CELSIUS,
  LICHT,       
  HOLDING_REGS_SIZE // leave this one
  // total number of registers for function 3 and 6 share the same register array
  // i.e. the same address space
};

Dann kommt man beim Schreiben von Code nicht so leicht durcheinander, wo eine symbolische Konstante und wo eine Variable verwendet wird.

Hab ichs richtig mit dem delay für den DS18B20 gemacht?
Keine Ahnung, ich finde, es sieht irgendwie merkwürdig aus.

Hier bleibt es allerdings durchgehend bei 27.

Dass Dein Register-Array als Integer-Array deklariert ist, ist dir aber schon klar:
Code:
unsigned int holdingRegs[HOLDING_REGS_SIZE];
Oder?
Und wenn Du eine Gleitkommazahl an einen Integer-Wert zuweist, bekommt der Integer nur den ganzzahligen Anteil. Also überträgst Du so wie Du es machst auch stets nur einen Integer-Wert, nämlich die Vorkommastellen der Temperatur.

Vielleicht doch die Temperatur lieber als Integer in Zehntelgrad übertragen?
50  International / Deutsch / Re: DS18B20 auf Atmega8 on: September 21, 2014, 10:15:39 am
Eigentlich dachte ich dass der Wert über Modbus gesendet wird?!
Code:
//////////////// registers of your slave ///////////////////
enum
{     
  celsius,
  Licht,       
  HOLDING_REGS_SIZE // leave this one
  // total number of registers for function 3 and 6 share the same register array
  // i.e. the same address space
};

Alles was bei enum drin steht, wird auch übertragen.
Somit wäre der Wert auch in "Verwendung".

???

Deine obenstehende enum-Definition ist eine Umschreibung für sowas:
Code:
//////////////// registers of your slave ///////////////////
#define  celsius 0
#define  Licht 1
#define  HOLDING_REGS_SIZE 2

Das Aufzählungskonstante "celsius" hat mit der später in der loop-Funktion deklarierten Gleitkomma-Variablen celsius nichts zu tun. Das kannst Du auch testen, indem Du mal die eine oder andere "celsius" Deklaration vom Namen her änderst.
51  International / Deutsch / Re: DS18B20 auf Atmega8 on: September 21, 2014, 09:29:25 am
kann man es nicht ohne delay machen?

Natürlich kannst Du auch einen DS18B20 auch ohne delay abfragen.

Aber Du mußt ihm trotzdem Zeit zum Messen geben.
Mindestens 750 Millisekunden pro Messung (oder etwas mehr).

Dazu müßtest Du den Messvorgang dann in zwei Vorgänge aufteilen:
1.) Messung vom Sensor anfordern
2.) Nach frühestens 750 ms (oder etwas mehr): Messwert abholen

Was Du in den 750 Millisekunden dazwischen machst, ist dem Sensor egal. Du kannst das Programm entweder für die Zeit mit delay() blockieren. Oder irgendwas anderes machen. Aber Du kannst den angeforderten Messwert nicht vom Sensor abholen, bevor der Sensor nicht mit der angeforderten Messung fertiggeworden ist.

Nachtrag noch wegen der scheinbar gleichbleibenden Dateigröße:
Die zusätzlich eingebundene Library scheint keine Gleitkommarechnungen durchzuführen, aber Du in Deinem Test-Sketch hast zwar die Berechnung hingeschrieben:
Code:
celsius = (float)raw / 16.0;
aber der so errechnete Wert wird im Programm hinterher nirgends mehr verwendet!
Dadurch optimiert der Compiler dann natürlich die Berechnung weg, und wenn er feststellt, dass keine Gleitkommarechnung notwendig ist, weil diese wegoptimiert wurde, wird dann auch kein Gleitkommacode mehr ins Programm eingebunden.

Du mußt den Wert auch tatsächlich verwenden und zum Beispiel auf Serial ausgeben, damit die Rechnung NICHT aus dem Code wegoptimiert wird. Also z.B.:
Code:
celsius = (float)raw / 16.0;
Serial.println(celsius);
Dann kann die Rechnung nicht wegoptimiert werden und dann wird auch die Gleitkomma-Library automatisch mit in den Code eingebunden.
52  International / Deutsch / Re: invalid operands on: September 21, 2014, 09:24:15 am
Dann hab ich jetzt aber nur noch das Pointer-Problem.

Du hast mit Pointern ein ganz gewaltiges Problem.
Und mit C-Strings.
Und mit C-Programmierung überhaupt.

Was soll das sein:
Code:
char* server_ip[15];
char* server_ip_z[15];

Das ist die Deklaration für 2*15 = 30 "Pointer auf Strings".
Und zwar Strings, die nirgendwo existieren und nirgendwo Speicherplatz reserviert haben.

Also wohl nicht das, was Du möchtest.

Wenn Du Platz für einen String von maximal 15 Zeichen Länge deklarieren möchtest, dann sieht das so aus:
Code:
char server_ip_z[16];
Reserviert wird dabei Platz für 16 chars, also 16 einzelne Zeichen.
Warum 16 und nicht 15? Weil jeder C-String als abschließendes Zeichen noch ein Nullzeichen \0 benötigt, als Zeichen für das Ende des Strings.

Wenn Du mit Chars, Strings und Pointern hantieren und in C programmieren möchtest, müßtest Du mal dringend was darüber Lernen!
53  International / Deutsch / Re: DS18B20 auf Atmega8 on: September 21, 2014, 09:15:15 am
Auch wenn ich
Code:
float celsius;
celsius = (float)raw / 16.0;

auskommentiere, bleibts bei 5060 Bytes

Du bindest ja auch noch eine Third-Party Magic-Library ein:
Code:
#include <SimpleModbusSlave.h>
Wie sieht es denn in dieser Library mit Gleitkommazahlen aus?
54  International / Deutsch / Re: Ethernetshield funktioniert nur auf Arduino Board. on: September 21, 2014, 09:11:14 am
Die beiden beschreiben des isp des Uno.

Ich habe es aber so verstanden, dass du ein Ethernet Shield an einen  "Standalone" atmega328 anschießen möchtest.

Jo so ist es auch nur brauche ich ja das Pinout des ISP Steckers um zu wissen wo auf den sechs Pins SCK, MISO, usw liegen., um es auf das Shield zu übertragen so wie weiter oben empfohlen wurde.

Dann vergiss alles, was ich oben geschrieben habe!
Ich habe irgendwie gelesen, dass Du mit einem Arduino MEGA verkabeln möchtest, ohne ein Shield zu stecken.
Aber das möchtest Du ja gar nicht.
Mein Fehler. Ich hätte wohl mehr das Buzzword "Atmega328" im Text benötigt um zu erkennen, was Du tatsächlich vorhast. Da Du nur "ATMega" geschrieben hast, bin ich von einem MEGA2560 ausgegagen, der verkabelt werden soll und dabei Probleme macht.

55  International / Deutsch / Re: invalid operands on: September 21, 2014, 09:01:59 am
Nach dem Code hab ichs doch wieder als Array in der Variable ip, oder?

Ja. Dann hast Du aus dem 15-Byte langen ASCII-String eine 4-Byte IP-Nummer gemacht.

Und ich wills auch nicht per Serial verschicken, das bleibt auf diesen einem Board.

Du möchtest aber die 4-Byte IP-Nummer vielleicht als IP-Nummer mit der Ethernet-Library verwenden.

Oder auch die 4-Byte IP-Nummer im EEPROM speichern, als Konfigurationsdaten, die nach dem Abschalten des Stroms gespeichert blieben sollen.
56  International / Deutsch / Re: DS18B20 auf Atmega8 on: September 21, 2014, 08:57:07 am
Mir würde auch reichen wenn es ohne komma wäre.
Also also ganze Zahl, 19,5 Grad == 195 oder 1950

Also ich sehe nur eine einzige Gleitkommadivision in Deinem Code:
Code:
celsius = (float)raw / 16.0;

Deine Division durch 16 ist quasi eine Multiplikation mit 0.0625, weil 1/16=0.0625

Daher kannst Du die Temperatur ganz einfach als "long" Wert in Zehntausendstel Grad bekommen, wenn Du Deinen raw-Wert mit 625 multiplizierst.

Code:
long celsius10000= raw*625L;

Also 19,5°C wären dann 195000 als long.
Mit der richtigen Rundung und einer Integer-Division durch ein Vielfaches von 10 kannst Du die Zehntausendstel Grad dann auch wieder runterrechnen auf einen Integer in Zehntelgrad oder Hundertstelgrad. Und das Programm sollte deutlich kleiner als vorher sein, weil die Math-Library für Gleitkommaarithmetik nicht mit eingebunden werden braucht.
57  International / Deutsch / Re: invalid operands on: September 21, 2014, 08:30:27 am
Richtig. Also ich will die IP-Adresse mit allen 12 Ziffern (also auch die 0'en) und den drei Punkten anzeigen lassen und jede Ziffer einzelnd ändern können und das brauch ich dann später für's Ethernet (womit ich mich aber bisher noch gar nicht auseinander gesetzt hab, das kommt als letztes^^).

Und bei mir haperts eben an der Umwandlung.

Anbei Umwandlung eines 15 Zeichen langen Char-Arrays in eine 4-Byte IP-Adresse, die von der Ehternet-Library direkt verwendet werden kann.

Code:
#include <SPI.h>
#include <Ethernet.h>

IPAddress ip(0,0,0,0);
char server_ip_z[16]="192.168.002.178";

void setup() {
  Serial.begin(9600);
 
  // Umwandlung der vier Zahlen in die vier Bytes der IP-Adresse
  for (int i=0;i<4;i++) ip[i]=atoi(&server_ip_z[4*i]);

  // Ausgabe der umgewandelten IP
  for (int i=0;i<4;i++)
  {
    Serial.print(ip[i]);
    if (i<3) Serial.print('.');
  }
  Serial.println();
}

void loop() {
}
58  International / Deutsch / Re: DS18B20 auf Atmega8 on: September 21, 2014, 08:17:52 am
Was kann da noch gelöscht werden?

Sobald Du in Deinem Sketch eine einzige Gleitkommeberechnung drin hast, wird eine ca. 1,4 KB große Gleitkomma-Library zu Deinem Programm dazugelinkt.

Wenn Du in einem Programm ohne Gleitkommarechnungen auskommst, wird das Programm gleich ca. 1,4 KB kleiner.

Temperaturen könnte man z.B. statt als Gleitkommazahl als Integerwert behandeln, z.B. als ganze Zahl "Temperatur in Zehntelgrad" oder bei höheren Anforderungen als ganze Zahl "Temperatur in Hundertstelgrad".

Dein Temperatursensor macht das intern ja auch: Seine Temperaturen sind intern dargestellt nur 9, 10, 11 oder 12 einzelne Bits und keine Gleitkommazahl.
59  International / Deutsch / Re: invalid operands on: September 21, 2014, 08:10:13 am
Jurs: Genau.
Ich hab halt die IP-Adresse am Display (mit Punkten eigentlich) stehen und will mit den links/rechts-Tasten den Cursor zwischen den Ziffern navigieren und mit den rauf/runter-Tasten die Ziffern um eine Stelle verändern.

Also hast Du einen String aus Ziffern und Punkten wie z.B.
Code:
char server_ip_z[16]="192.168.2.178";
und dieser String soll dann in eine IP-Adresse umgewandelt werden, die Du mit der Ethernet-Library verwenden kannst?

Oder noch anders?
60  International / Deutsch / Re: Mit Taster while beenden on: September 21, 2014, 08:04:43 am
So sieht die while aus.
 while (bereitschaft == LOW)

Das ganze soll später für mein Wecker sein.
Er soll halt so lange klinkeln bis der Taster gedrückt wird.

Könnte mir jemand bitte ein Tipp geben wie ich es anstelle?

Du musst den Taster innerhalb der while-Schleife auslesen, damit sich die geprüfte while-Bedingung überhaupt ändern kann. Wenn Du die Variable bereitschaft innerhalb der while-Schleife nicht änderst, behält sie immer denselben Wert, die sie am Anfang der while-Schleife bereits hat.

Also entweder so ändern:
Code:
while (bereitschaft == LOW)
{
  bereitschaft=digitalRead(BEREITSCHAFTSPIN);
}

Oder so:
Code:
while (digitalRead(BEREITSCHAFTSPIN) == LOW);
Pages: 1 2 3 [4] 5 6 ... 219