Show Posts
Pages: 1 2 3 [4] 5 6 ... 200
46  International / Deutsch / Re: Zeitkritischer Sketch - Zeit für Codeausführung bestimmen on: August 11, 2014, 03:52:26 pm
Mit beiden Signalen meinst du das Hallsignal einerseits und den Pin den ich auf High schalte andererseits, richtig?

Ja, das ist doch der Wert, der Dich im Endeffekt interessiert, oder?

Definierst Du eine Variable zum Speichern einer Zeit:
Code:
volatile unsigned long time;

Wenn der Hallsensor auslöst, setzt Du die Variable auf den aktuellen Stand des Mikrosekundenzählers:
Code:
time=micros();

Und wenn der andere Pin HIGH schaltet, ermittelst Du die Zeitdifferenz:
Code:
time=micros()-time;

Dann steht in "time" die Zeitdifferenz, plusminus vier Mikrosekunden, solange bis Du die Variable beim nächsten Auslösen des Hallsensors wieder auf eine neue Startzeit setzt.
47  International / Deutsch / Re: Frequenzgenerator Programmieren on: August 11, 2014, 03:42:58 pm
Sprich jeder Steugende Pegel müsste einen interrupt auslösen und dann nach einem bestimmten Muster, welches man evtl. bitweise erstellt (01010100000011111101010101) den Ausgang auf High/Low setzen.

Im Endeffekt kannst Du alles programmieren, wenn Du erstmal genau weißt, was Du haben möchtest.
48  International / Deutsch / Re: Schnelle Impulse mit Analogread erfassen on: August 11, 2014, 03:14:36 pm
Hab den Delay im sketch auch schon auf 0.001 gestellt so das ich im Serial Monitor mehr abfragen habe. Hat aber aucht nichts geholfen. smiley-cry

Was'n für ein "delay"?
Ein "delay" im Sketch hilft NIE etwas, ist aber fast immer die Quelle allen Übels.

Anbei mal ein einfacher Impulszähler für die Impulszählung mit einem Arduino UNO
Code:
#define IMPULSEINGANG 2

void setup() {
  Serial.begin(9600);
  attachInterrupt(0, impulsISR, RISING);  // Interrupt 0 hängt beim UNO an Pin-2
  pinMode(IMPULSEINGANG, INPUT);
}

volatile unsigned long impulsCounter=0;

void impulsISR()
{
  impulsCounter++;
}

unsigned long letzterStand=0;

void loop() {
  if (impulsCounter!=letzterStand)
  {
    noInterrupts();
    letzterStand=impulsCounter;
    interrupts();
    Serial.println(letzterStand);
  }
}

Gezählt wird "digital" auf steigende Flanke des Signals (RISING).

Das Signal müßte in diesem Fall ein Push-Pull-Signal sein, das zwischen HIGH und LOW wechselt. Wenn der Ausgang zwischen "offen" und "HIGH" pendelt, muß an Pin-2 ein ca. 4.7 Kiloohm PullDown-Widerstand nach GND geschaltet werden, damit die Zählung funktioniert.

Bei hoher Impulsrate ggf. die Baudrate auf 115200 erhöhen.
Probier mal aus, ob damit was gezählt wird.
49  International / Deutsch / Re: Uno kalibrieren on: August 11, 2014, 02:37:37 pm
Ist das normal oder stimmt da bei mir was nicht?

Ja, das ist normal, nur Deine aberwitzigen Vorstellungen von digitalen Mikrocontrollern stimmen nicht.

Offene (unbeschaltete) Eingänge sind prinzipbedingt stets "floatend", können also jedes beliebige Spannungslevel zwischen 0V und 5V annehmen.

Einen definierten Pegel erreichst Du durch Anlegen eines Signals.

Verbindest Du einen Analogpin mit GND, bekommst Du mit analogRead 0 gemessen.
Verbindest Du einen Analogpin mit 5V, bekommst Du mit analogRead 1023 gemessen.
Und mit digitalen Pins und High und Low ist es genau so.

Deshalb werden digitale Eingänge auch stets mit "PullUp" oder "PullDown" Widerständen beschaltet, z.B. wenn Du einen Taster anschließt und auswerten möchtest. Offene, unbeschaltete Eingänge haben stets einen beliebigen Pegel zwischen 0 und 5V, aber nicht den, den Du Dir wünschst.
50  International / Deutsch / Re: Arduino + Ethernetshield als TCP Client ? on: August 11, 2014, 12:04:06 pm
Ich habe aber inzwischen herausgefunden, dass der Arduino vom Server ein "connection establish request" anfordert (siehe Anhang). Das macht die Herstellersoftware nicht.

TCP ohne vorher eine Verbindung zu aufzubauen?

Sorry, da bin ich überfragt. Solch ein Internetprotokoll kenne ich nicht.
51  International / Deutsch / Re: Zeitkritischer Sketch - Zeit für Codeausführung bestimmen on: August 11, 2014, 10:22:10 am
Mir gehts vor allem darum zu wissen, wie lange der Arduino zwischen dem Auftreten des Hallsignals und dem Start des Timers braucht.  Dazu bräuchte ich irgendeine Möglichkeit der Messung oder Berechnung.

Kann man nicht auf Basis des Codes die dafür nötigen Arbeitsschritte des Controllers ermitteln?

Das soll jetzt wohl soviel heißen wie:
1, Ich habe kein geeignetes Oszilloskop und
2, Ich habe auch keinen geeigneten Logiktester
um den Zeitunterschied zwischen beiden Signalen zu testen.
???

Per Software messen ist insofern schwierig, weil die Ausführung von Software selbst Zeit kostet, und wenn Du nun zusätzlichen Code schreibst, um Zeiten zu messen, dauert auch dieser Code Zeit, Und um diese Zeit wird dann die "gemessene" Zeit länger.
52  International / Deutsch / Re: bytes gehen in serial buffer verloren on: August 11, 2014, 09:43:51 am
Woran kann das liegen?

Was ist das für ein Befehl, was macht der:
Code:
  QThread::msleep(5);

Das sieht für mich extrem verdächtig nach "Busy waiting" aus.

Wenn Du beim Auslesen des seriellen Eingangspuffers so lange wartest, bis der Puffer übergelaufen ist, gehen Dir selbstredend Zeichen verloren.

Mal angenommen, die 5 in msleep(5) stünde für 5 Millisekunden "Pause", und Du machst diese Pause nach jedem eingelesenen Zeichen, dann würde der Puffer nach einer Weile unweigerlich überlaufen, wenn Du die Zeichen mit einem Zeitabstand von weniger als 5 Millisekunden von Zeichen zu Zeichen sendest.
53  International / Deutsch / Re: Arduino + Ethernetshield als TCP Client ? on: August 11, 2014, 08:06:32 am
Die Protokolldatei lässt sich in Wireshark öffnen. Ich habe einen Auszug exportiert und angehängt, die Details fehlen da leider.

OK, da geht es um hin und her gesendete Daten.
Soweit kommst Du aber offenbar gar nicht, da Du kein "Connect" auf Port 81 zustande bekommst.

Auf den Port 80 komme ich mit dem Firefox und auch mit dem Arduino (wenn ich mich zuvor per Firefox authentifiziert habe). Auf den Port 81 komme ich mit der PC Software des Herstellers (daher stammt auch das Wireshark Protokoll).
Zum Einstellen habe ich da nichts gefunden außer der RS485 bus Adresse, aber die hat ja nichts mit TCP zu tun, oder?

Wenn Du vom PC aus mit der Herstellersoftware auf das Gerät zugreifen kannst, ohne dass etwas umkonfiguriert werden muß, dann muss nichts umkonfiguriert werden.

Die Frage ist nur: Weshalb bekommst Du vom PC aus sowohl auf Port 80 (Firefox) als auch Port 81 (Herstellersoftware) einen Connect, aber vom Arduino bekommst Du nur auf Port 80 (HTTP-Port) einen Connect, aber nicht auf Port-81.

Nachtrag/Nachfrage: Du beendest doch die Herstellersoftware auf dem PC, bevor Du den Zugriff mit dem Arduino probierst? Denn wenn die Herstellersoftware auf dem PC die Verbindung auf Port-81 ständig aufgebaut läßt, aber das Gerät nur eine TCP-Verbindung zur Zeit bedienen kann, wäre Port-81 auf dem Gerät immer dann blockiert, wenn bereits eine andere Verbindung auf Port-81 offen ist.
54  International / Deutsch / Re: Arduino Indiziergerät mit leichten Schwächen on: August 11, 2014, 07:38:14 am
Das Programm setzt das Tastverhältnis am PWM-Pin auf Basis einer vorher bestimmten Drehzahlfunktion. Ich habe also eine Wertetabelle erstellt, in der ich bei einem bestimmten Tastverhältnis die Drehzahl an meinem Versuchsstand gemessen habe und hinterher daraus eine Funktion erstellt, die die gewünschte Drehzahl in das Tastverhältnis umrechnet.

Das sieht mir nach einer sehr aufwändigen Sinuserzeugung aus, mit 12-Bit PWM, die durch die ganzen Gleitkommazahlberechnungen auch nicht besonders schnell ist.

Ich weiß nicht, wie oft in Deinem Programm die Sinuserzeugung mit "ISR(TIMER5_CAPT_vect)" aufgerufen wird, aber ich habe mal einen kleinen Benchmark gemacht, wieviel Rechenzeit Deine Sinuserzeugung wegfrisst.

Diese Programm mißt die Zeit, die 5000 Berechnungen des Sinus und 5000 mal setzen des OCR1A Registers dauern:
Code:
const    uint8_t PWM_Pin=11; // analoges Ausgangssignal 0...4095 für Uno auf PIN 9 umschalten!!!

// Kontinuierliches Sinussignal
float Zeit=0;     
float T=5;         // Periodendauer T=5 Sekunden für Sinusanregung T=1/f
float pi=3.14159266;
float omega=2*pi*(1/T)/1000; // Kreisfrequenz Omega in 1/s (/1000 für die Umrechnung von millisekunden in s)
float Drehzahlmittelwert=1000; // 1/min Drehzahlmittelwert der Sinusanregung hier gebe ich die gewünschte Drehzahl vor
float Amplitude=400; // 1/min Amplitude der Sinusanregung +- 400 1/min ausgehend vom Drehzahlmittelwert

void setup(){

 pinMode(PWM_Pin, OUTPUT);      // PWM PIN 11 für Sinusanregung
 Serial.begin(9600);

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//// Einstellungen Timer 1 
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
TCCR1A = (1 << COM1A1) | (1 << WGM11);                // Enable Fast PWM on OC1A (Pin 11)
TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS10);   // Mode 14 Fast PWM/ (TOP = ICR1), pre-scale = 1
 
ICR1 = 4095;  //Set the TOP value for 12-bit PWM
OCR1A =0;     //PWM-PIN 11 auf LOW
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

void test()
{
  for(int i=0; i<5000;i++)
  {
    Zeit=i;
    OCR1A = (Amplitude*sin(omega*Zeit)+Drehzahlmittelwert+141.71)/0.95954; //setzt Tastverhältnis an PWM_PIN 11
  }
}

void loop()
{
  unsigned long time=millis();
  test();
  Serial.println(millis()-time);
}

Das sind ca. 925 ms für 5000 Berechnungen. Mal angenommen, Du läßt den Sinus jede Millisekunde einmal neu berechnen, also 5000 mal in 5000 Millisekunden, dann kostet das an Rechenleistung
925/5000 = 18,5% der gesamten Controllertakte
Wenn Du jetzt rechnest, dass pro Berechnung ein Timer-Interrupt von 4µs Dauer aufgerufen sind, kommen nochmal 5000*4µs = 20000 µs = 20ms drauf.
(925+20)/5000 = 18,9% der Controllertakte

Das würde bedeuten, dass Du eine ca. 20% niedrigere Datenrate bekommst, wenn Du den Sinus vom selben Controller erzeugen läßt, der auch die Messungen durchführen soll. Also sagen wir mal, der (oben von mir gepostete) Sketch kann durch Optimierungen auf 1200 Datensätze pro Sekunde geboostet werden, dann würde er mit Sinuserzeugung auf demselben Controller noch 1200*0,8 = 960 Datensätze pro Sekunde wegspeichern.

Bei 1500 U/min = 25 U/s wären das 960/25 = 38 Datensätze pro Umdrehung, die maximal machbar wären.

Und mit "externer Sinuserzeugung" durch einen zweiten Controller würde man ca. 20% mehr Datensätze aufzeichnen können.

Ich mache mich mal ans Boosten der Aufzeichnungsgeschwindigkeit und versuche, die Sinusanregung in meinen Sketch zu integrieren.

Bis dahin kannst Du ja mit dem von mir oben geposteten Sketch schon mal Probeaufzeichnungen mit exakten 2ms Zeitabständen zwischen den Datensätzen machen.
55  International / Deutsch / Re: Arduino + Ethernetshield als TCP Client ? on: August 11, 2014, 06:43:09 am
Ich fürchte, dass da überhaupt keine Verbindung aufgebaut wird.

Na klar, da tritt ein Timeout auf.

Und wenn Du wenigstens eine minimale Fehlerbehandlung im Sketch vorsehen würdest, dann würdest Du das auch sehen und bräuchtest dann nicht mal den Versuch machen, etwas zu senden.

Versuch's mal mit:
Code:
   if (client.connect(server, 81))
   {
     Serial.println("connected");     
     client.write(0x62);
     client.write(0xff);
     client.write(0x03);
     client.write(0xff);
     client.write((byte)0x00);
     client.write(0x45);
     client.write(0x58);
     client.write((byte)0x00);     
     Serial.println("gesendet...");
   }
   else
   {
     Serial.println("connection failed");
   }

Dann siehst Du doch genau, dass Du keine Verbindung zum Server bekommst!


Kann es sein, dass da <Ethernet.h> nicht funktioniert, weil der Hersteller was proprietäres programmiert hat?

Ethernet ist Ethernet, das ist standardisiert.
Was proprietär ist, ist das Kommonikationsprotokoll des Herstellers.

Du hattest irgendwie ein Wireshark-Protokoll gesendet. Was für ein Format hat die Datei? Ich kann da nur eine Binärdatei sehen, die ich mir nicht anzeigen lassen kann. 

Mußt Du das Kommunikationsprotokoll vielleicht am Gerät konfigurieren/einstellen? Du schreibst, das Gerät kann sowohl HTTP auf Port 80 als auch das Firmenprotokoll auf Port 81, vielleicht muss das konfiguriert werden, bevor das Gerät überhaupt Verbindungen auf Port 81 akzeptiert?

Und bist Du überhaupt sicher, dass das andere Protokoll per TCP funktioniert und nicht per UDP?
56  International / Deutsch / Re: Frequenzgenerator Programmieren on: August 11, 2014, 05:50:19 am
Irgendwie hab ich kein Leuchtturm beispiel...

Zeigt Dein Browser in diesem Thread  Reply #11 nicht an?
57  International / Deutsch / Re: Zeitkritischer Sketch - Zeit für Codeausführung bestimmen on: August 11, 2014, 05:29:27 am
Also nochmal langsam: Zeitstempel (micros(); ) beim hallsignal erfassen und dann nochmal unmittelbar vor dem timer-interrupt. Differenz dann per Serial ausgeben?

Das wird ja wohl schlecht gehen, den Zeitpunkt VOR einem eintretenden Interrupt-Ereignis zu timen.

Wenn Du den zeitlichen Abstand von zwei Signalen messen möchtest, dann nimmst Du dafür normalerweise ein Oszilloskop mit entsprechender Bandbreite oder einen Logiktester, triggerst auf das erste Signal und liest ab, wann danach das zweite Signal auftritt.

So wie Du den Programmablauf beschreibst, wird der Jitter beim zweiten Signal aber stets +/-4µs betragen.

Beim Arduino läuft ständig Timer0 mit und erzeugt Timer-Interrupts für die Bereitstellung von Zeitfunktionen in millis, micros und delay. So ein Timer-Interrupt benötigt mit allem Overhead alles in allem ca. 4µs und Du kannst nie wissen, wann der nach Erkennung eines bestimmten Signals auftreten und dazwischenhauen wird.
58  International / Deutsch / Re: Hilfe, wie kann ich Bilder für eine Matrix kleiner bekommen ??? on: August 11, 2014, 05:18:30 am
jetzt ist die Frage kann ich das auch kleiner bekommen wie ich es bis jetzt habe ??? hier ein Beispiel:

Code:
const bool  CirocPic1[512] PROGMEM = {
0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

Klar. Wenn Du nur 0 und 1 Informationen abspeichern möchtest, dann reicht dafür 1 Bit, aber Du berbrätst 1 Byte.

Du kannst daher den Speicherverbrauch lockern auf ein Achtel rezuzieren, wenn Du immer 8 Bits zu einem Byte zusammenfasst.
Code:
const byte CirocPic1[64] PROGMEM = {
B00000001, B10000000, B00000000, B00000000, etc.

Du mußt dann beim Zugriff nur die 8 Bits wieder einzeln aus den Bytes herauslesen (bitRead).
59  International / Deutsch / Re: Pool-pumpen Steuerung mit TDS und Zeitschaltuhr hilfe beim programmieren on: August 11, 2014, 05:10:35 am
Bei dem Versuch Xively einzubinden gab mir die IDE den Fehler aus das mein Speicher knapp wird und mögliche Fehler auftreten.

Was für ein Board verwendest Du?

Die Einbindung der Ethernetfunktionen per Ethernet-Library führt zu einem erheblichen Zusatzverbrauch an Flash- und RAM-Speicher, so dass Du ggf. einen Controller mit mehr Speicher benötigst als ein UNO hat. Dann müßtest Du ein MEGA-Board verwenden, um mehr Speicher zur Verfügung zu haben.
60  International / Deutsch / Re: Arduino + Ethernetshield als TCP Client ? on: August 11, 2014, 04:48:19 am
eine Fehlermeldung (call of overloaded 'write(int)' is ambiguous), wenn ich (0x00) einsetze.

Null ist ein Sonderfall, wegen des in C definierten Null-Pointers, der ebenfalls den numerischen Wert 0 hat und die vordefinierte Funktion dann nicht weiß, ob sie ein 0-Byte (= 1 Byte) oder einen 0-Pointer (= 2 Bytes) senden soll.

Probiere beim Senden Deiner 0-Bytes mal:
Code:
client.write((byte)0x00);
Pages: 1 2 3 [4] 5 6 ... 200