Show Posts
Pages: 1 ... 14 15 [16] 17 18 ... 28
226  International / Deutsch / Re: Wie heißen die Stecker, und woher bekomme ich diese? on: January 05, 2013, 03:42:12 am
Wenn mich nicht alles täuscht, dann sind das JST-Stecker.

Schau mal hier, ob der passende dabei ist:
http://www.jst-mfg.com/product/pageview/connector_e/pageview.html#page_num=1

Hast du das Posting gelesen???
Ob es die Stecker bei R und C überhaupt gibt, sei mal dahingestellt.
227  International / Deutsch / Probleme mit I2C-LCD/Keypad Adapter on: January 04, 2013, 07:06:13 pm
Hi,
Zur Ansteuerug eine 4x20 LCD-Displays hab ich mir einen I2C-LCD-Keypad Adapter organisiert.
--> http://www.ebay.de/itm/I2C-Serial-LCD-controller-keypad-control-Arduino-/230748741705?pt=LH_DefaultDomain_0&hash=item35b9b26049

Hat da schon jemand Erfahrungen damit?

Problem ist Folgendes: Man kann an die "Eingänge" für Taster entweder ein Matrix-Keypad (4x4) oder 8 einzelne Taster anschliessen.
Ich möchte die Variante mit 8 einzelnen Tastern verwenden. Ich habe alles nach Vorschrift verdrahtet, aber ich bekomme nicht mehr als 4 Taster eingelesen. Die anderen 4 werden nicht erkannt.
Ich benutze die "LCDI2Cw"-Bibliothek. Da das Gerät standardmässig auf 4x4 eingestellt ist, habe ich schon probiert mit folgender Sequenz auf den "8-Tasten-Modus" umzustellen:
Code:
  unsigned char mode = 0x01;
  lcd.keypadMode(mode);


Aber es sieht so aus, als ob er den Befehl gar nicht verarbeitet.
Da diese Funktion erst mit Firmware 1.4 aktiv sein soll, hab ich mal die Firmwareversion ausgelesen: Da bekomm ich den Wert "2" zurück?????
Sonst läuft das Interface wie erwartet, nur das mit den Tastern bring ich nicht hin :-(

Gruß/hk007


228  International / Deutsch / Re: 32Bit-Zahl als Bit-Array / --> Einlesen eines Absolutwertgebers on: January 02, 2013, 05:46:05 am
Hi,

komisch, hatte gestern nacht noch mal ein Posting mit Erfolgsmeldung nachgeschoben. Irgendwie ist das weg????
Zum OsziBild: Takt ist gelb (6 Pakete a 4 Takte) , Data ist blau. Leider sieht man auf dem Bild nur ca. 75% des gesamten Telegramms. Sonst wäre nichts zu erkennen gewesen.

Das deaktivieren des Interrupts hat nichts gebracht. Das mit den Neusetzen der Zeit in der Int hab ich auch mal probiert. Aber ich wollte in der Int so wenig Code wie möglich halten. Drum nur das Setzen des newdata

Die zündende Idee war wie folgt:

Ich hab am Ende der Loop noch ein delay(1) eingefügt. Dann war auf jeden Fall sicher gestellt, daß im Falle einer Datenübertragung einmal die Int-Routine durchlaufen wird.
Anscheinend gab es Zustände, wo das Hauptprogramm "zu schnell" war.
Der Code sieht jetzt so aus:

Code:
const int data = 3;
boolean newdata = LOW;
int ctr;
unsigned long time;
long distance = 0;
float Position;


void setup(){
  Serial.begin (57600);
  pinMode(data, INPUT);
  attachInterrupt(0, INT01, RISING);   //(UNO: Int0 = PIN 2)
}

void loop(){
  X_Achse();
  delay(1);
}

void X_Achse() {
  if (newdata) {
    time = millis();
  }
  newdata = LOW; 

  if ((millis() - time) >= 20 ) {
     if (ctr == 24) {
       distance = distance >>1;      // erstes Bit verwerfen
       if bitRead(distance,20) {     // negativer Wert??
         bitWrite(distance,20,0);
         Position = float(distance/-100.0);  // Wert auf mm normieren
       }
       else {
         Position = float(distance/100.0);
       }
      Serial.println (Position);
    }
    ctr = 0;
  } 
 
}

void INT01() {
  newdata = HIGH;
  bitWrite(distance, ctr, !digitalRead(data));
  ctr=ctr+1;
}

Jetzt bekomm ich alle 130 ms einen RICHTIGEN (24Bit langen) Wert :-)

Quote
Ausserdem sollten distance und ctr als volatile deklariert werden. ( Damit der compiler berücksichtigt, dass Takt() und loop() gleichzeitig laufen und er keine falschen Optimierungen vornimmt.)
OK.... sagt mir momentan nichts, werd mich aber mal zu volatile einlesen.


Danke für deine geduldigen Antworten.
Sorry nur nochmal dass das posting von gestern Nacht irgendwie weg war.
229  International / Deutsch / Re: Wie heißen die Stecker, und woher bekomme ich diese? on: January 01, 2013, 07:45:39 pm
Quote
Du mußt aber aufpassen, weil bei dieser buchse die anschlüsse verschieden lang sind......

Hmm.... ich glaub eher, dass alle gleich lang sind und beim Auslöten verrutscht sind. smiley-zipper
230  International / Deutsch / Re: Wie heißen die Stecker, und woher bekomme ich diese? on: January 01, 2013, 06:11:00 pm
Wenn mich nicht alles täuscht, dann sind das JST-Stecker.

Schau mal hier, ob der passende dabei ist:
http://www.jst-mfg.com/product/pageview/connector_e/pageview.html#page_num=1

231  International / Deutsch / Re: 32Bit-Zahl als Bit-Array / --> Einlesen eines Absolutwertgebers on: January 01, 2013, 05:02:15 pm
Ich glaub jetzt eher, daß ich meinen Code noch optimieren muss.
Mit dieser Änderung:
Code:
 if ((millis() - time) >= 20 [color=red]&& !newdata[/color]) {
    if (ctr > 0) {
     Serial.print (millis());
     Serial.print (": ");
     Serial.println (ctr);

sieht es schon wesentlich besser aus:
Code:
4483: 24
4615: 24
4748: 24
4881: 24
5014: 24
5147: 23
5251: 1
5280: 22
5412: 24
5545: 24
5679: 23
5812: 24

Aber es sind immer noch "Fehltelegramme".
Sieht aus, als ob es immer noch Timingprobleme beim Zusammenspiel zwischen Interruptroutine und Hauptprogramm gibt.
Den Int während der Auswertung im Hauptprogramm zu deaktivieren trau ich mich nicht, da ich dann fürchte einen Interrupt zu verpassen.
232  International / Deutsch / Re: 32Bit-Zahl als Bit-Array / --> Einlesen eines Absolutwertgebers on: January 01, 2013, 02:48:04 pm
Quote
Manchmal verwirft er bis zu 4 Pakete
"verwerfen" bedeutet, dass länger als 20 ms nichts mehr gekommen ist, aber ctr nicht bis 24 gezählt hatte, richtig?
Ja


Quote
Was passiert, wenn du statt
if (ctr >= 24) { ...   zum Test  if (ctr > 0) { ... nimmst und mitschreibst, wieviele Pulse gekommen sind ?
Code:
    if (ctr > 0) {
     Serial.print (millis());
     Serial.print (": ");
     Serial.println (ctr);
    }
--> Ergebnis:
19892: 24
20025: 23
20159: 24
20300: 24
20433: 24
20537: 1
20566: 22
20698: 24
20831: 23
20963: 24
21067: 1
21098: 22
21230: 24
Ich bin gerade am überlegen, ob ich vllt. ein Problem mit den Eingangssignal habe?
Zur Info: Die Signale kommen als 1,5V-Signal aus dem Geber. Damit ich es im Arduino einlesen kann, hab ich Sie durch eine Transistorbeschaltung verstärkt:
Gebersignal mit 5K an Basis des BC547C, 5V über 10K an Collector und Arduino-Eingang, Emitter an GND. (Schema wie im Bild, allerdings mit anderen Werten)
Da die Schaltung invertiert frag ich auch nach Rising und !digitalRead.
Im Anhang seht ihr mal ein Oszi-Bild des Signals.

Quote
Wenn der Clock - Puls nur zu lesen ist, ist shiftIn() übrigens nicht passend.
Soll heissen, dass dafür der CLK ein Ausgang sein soll?
Ne, bei mir sind beides Eingänge. Also der Geber sendet auf beiden Leitungen.
233  International / Deutsch / Re: 32Bit-Zahl als Bit-Array / --> Einlesen eines Absolutwertgebers on: January 01, 2013, 11:03:52 am
Quote
distance |= bit;  ist eine Kurzschreibweise für distance = distance | bit; // setze ein bit in distance
bit <<= 1;   ist eine Kurzschreibweise für   bit  = bit << 1; // schiebe bit eins nach links

Das geht mit anderen Operatoren  ( + , * , / usw.) auch, und wird oft direkt von der Hardware unterstützt.

Oh ja, mit "+" kenn ich das auch. aber "|=" war mir etwas zu kryptisch.

Quote
Ja, das stimmt. Mit 3 shiftIn Befehlen kriegst du 24 bit.
Hmm.... aber dann muss ich mich irgendwie drum kümmern, daß ich dann ins richtige der 3 Bytes schreibe, und daß ich die 3 Bytes am Ende dann zusammenfüge.
Oder denk ich da falsch?

Ich poste jetzt mal meinen Code. Ist vllt. etwas hölzern, aber geht.
Allerdings erkennt er nicht jedes Datenpaket :-( Manchmal verwirft er bis zu 4 Pakete, bis er eins dekodiert.  Darum dachte ich zunächst, daß die Int-Routine "Takt()" zeitlich an der Grenze ist.
Das mit den millis() hab ich eingebaut , damit ich erkenne wann ein neues Paket startet. Wenn seit 20ms kein Takt mehr da ist, weiss ich daß ich in den 120ms Pause bin, und bei der nächsten Flanke ein neues Paket beginnt.
Code:
// Takteingang: PIN2
// Dateneingang: PIN3
// Länge Paket: 24Bit in ca. 10ms
// Anschliessend ca. 120ms Pause
// Das erste Bit des Datenpakets wird verworfen

const int data = 3;
boolean newdata = LOW;
int ctr;
unsigned long time;
long distance = 0;


void setup(){
  Serial.begin (57600);
  pinMode(data, INPUT);
  attachInterrupt(0, Takt, RISING);   //(UNO: Int0 = PIN 2)
}

void loop(){
  if (newdata) {
    time = millis();
  }
  newdata = LOW;
  
  if ((millis() - time) >= 20) {
    if (ctr >= 24) {
     distance = distance >>1;
     Serial.println (distance);
    }
    ctr = 0;
  }
}

void Takt() {
  newdata = HIGH;
  bitWrite(distance, ctr, !digitalRead(data));
  ctr=ctr+1;
}




234  International / Deutsch / Re: 32Bit-Zahl als Bit-Array on: December 31, 2012, 09:42:29 pm
Hi michael_x

das ist viel Input. Das muss ich erst mal sacken lassen.
Quote
(Wodurch ändert sich denn der Wert des data - Pins ? Da ist doch sicher irgendwo ein Clock Puls...)
Probierst du gerade, das Rad neu zu erfinden? (Das soll keine Kritik sein, nur sollte man vor dem Neu-Erfinden wissen, was es schon gibt)
Gott beware. Ich will sicher nichts neu erfinden, was es bereits gibt. Bin aus angeborener Faulheit immer froh, wenn ich was vorhandenes verwenden kann.

Du hast richtig erkannt: Ich habe zwei Eingänge. eine Clk- und einen Data-Impuls. Um genauer zu sein: Ich lese will eine Absoluwertgeber einlesen. Bei jeder positiven Flanke des CLK wird der Data-Eingang gelesen.
Das "Telegramm" ist ca. 10ms lang. In dem "Telegramm" bekomme ich ein 24 Bit Datenpaket.

shiftin() kann (so viel ich aus der Reference gelesen habe)  nur ein Byte??

Quote
Ja, für die Maschinenbefehle ( Assembler )
" Die meisten Befehle brauchen nur 1 Zyklus ", meine ich irgendwo gelesen zu haben, aber genauer weiss ich nicht. Tip: Datenblatt .
Für unsereins ist eher interessant, wie gut der Compiler arbeitet, bzw. wie man ihn unterstützen kann.
Hab einige "Tests" gemacht:
Das Unterprogramm in der loop 50 mal aufgerufen. Am Ende der loop die Zeit mit millis() gemessen. Dann das Unterprogramm 100x aufgerufen. Den Zeitunterschied berechnet.... durch 50 geteilt....
--> Meine Unterprogramm "Takt ()" dauert ~21µs.(Beim Schreiben auf Bit"31" des "Long". Seltsam: Beim Schreiben auf Bit "0" ist es  ~1,6µs schneller.

Das mit der Frage nach den 3Byte Datenformat war nur deshalb, weil dann das Vorzeichenbit automatisch an die richtigen Stelle gekommen wäre.

Quote
long bit = 0x00001;
long distance = 0;
...
void Takt() {
 newdata = HIGH;
if ( !digitalRead(data)) distance |= bit;
 bit <<= 1;

}

Sorry: das hab ich leider überhaupt nicht verstanden. Dazu fehlts mir wohl an C-Grundlagen.
235  International / Deutsch / Re: 32Bit-Zahl als Bit-Array on: December 30, 2012, 02:49:48 pm
Hi,

also das mit den bitWrite klappt ganz prima :-)
zu meiner Geschichte hätte ich jetzt noch zwei Zusatzfragen:
1.)
Gibts irgendwo eine Aufstellung, wie viel Laufzeit ein Befehl hat?
Hintergrund:
Ich hab den Befehl in einer Interruptroutine:
Code:
long distance = 0;
int ctr;
const int data = 3;
.
.
.
void Takt() {
  newdata = HIGH;
  bitWrite(distance, ctr, !digitalRead(data));
  ctr=ctr+1;
}
Da würd mich jetzt interessieren, ob ich berechnen kann, wie lange die dauert. OK, ich könnte am Anfang und am Ende die micros() abfragen. Aber ob das so genau ist?
Wenn die Routine länger als 0,4 ms dauert, dann hab ich nämlich ein Timing-Problem.

2.)
Ich hab Anfangs von einer 32 Bit Zahl geschrieben.
Kann man eigentlich auch Zahlenformate selber definieren? Mir würde nämlich für "distance" ein signed Format mit 20Bit + Vorzeichen für den Anwendungsfall genau passen.
236  International / Deutsch / Re: 32Bit-Zahl als Bit-Array on: December 30, 2012, 08:45:08 am
Hey,
das hört sich gut an. Werds mal testen.
Sind die Befehle neu? Die hab ich noch nie gesehen/gebraucht. smiley-red
237  International / Deutsch / 32Bit-Zahl als Bit-Array / --> Einlesen eines Absolutwertgebers on: December 29, 2012, 05:51:21 pm
Hi,
bräuchte mal wieder Hilfe:

Ich bekomme eine 32 Bit Zahl über einen Eingang auf den Arduino Bit für Bit übertragen.
Jetzt stell ich mir die Frage, wie ich das am elegantesten umrechne.
Mir ist bis jetzt nur die Möglichkeit eingefallen, die 32 Bit in ein "bool myarray[32]" abzuspeichern und dann händisch durchzurechnen: myarray[1]*2^0+myarray[2]*2^1+myarray[3]*2^2+......

Gibts da nicht eine andere Möglichkeit? Irgendwie die Bits "durchzuschieben"? Bitshift hab ich mir mal angeschaut, aber wie bring ich das neue Bit dann in die Zahl rein?

Habt ihr da eine Idee?

Gruß/hk007

238  International / Deutsch / Re: Pull-down- und Pull-up-Widerstände on: December 29, 2012, 03:18:33 am
Drum hab ich ja geschrieben, daß die Stichleitungen nicht zu lang sein dürfen :-)
239  International / Deutsch / Re: Problem beim Upload auf die Duemilanove-Platine!!! on: December 28, 2012, 06:17:53 pm
Es gab schon mal dieses Problem 2010.

http://arduino.cc/forum/index.php/topic,30128.0.html

Gehts jetzt bei dir? Hast du was an den TX/RX-Pins dran gehabt?
240  International / Deutsch / Re: Pull-down- und Pull-up-Widerstände on: December 28, 2012, 06:16:11 pm
Ich hab für so was (DS1820) RJ45 Stecker genommen.
Die DS1820 hab ich in CU-Hülsen gepackt, dann ein normales Patchkabel in der Mitte zerschnitten. An der einen Seite den Sensor angelötet, an der anderen ist dann der Stecker.
Da ich 8 Stück verbaut habe, hab ich als "Verteiler" einen billigen 8-fach Switch (Pollin) genommen, alle Bauteile mit dem Heissluftfön von der Platine gepustet und die 8 Buchsen untereinander verbunden. Wenn die Stichleitungen nicht zu lang sind, dann geht das prima.
Pages: 1 ... 14 15 [16] 17 18 ... 28