Go Down

Topic: Reaktionszeit Arduino Uno oder Mega unter 10µs ? Allgemeine Tipps gefragt.. (Read 2537 times) previous topic - next topic

uwefed


@MaFu,

danke für den Hinweis!

Könnte man den Schwellwert dann per SW anstatt ein Poti einstellen?

@uwefed
Was mach denn der Interrupt Eingang des Arduino? Ich habe bisschen darüber gelesen, aber leider bin
nicht schlau geworden. Was ich will, ist ja, dass Arduino TTL-Signale (0V->5V, oder 5V->0V) ausgibt, aber trotzdem im Betrieb bleibt.

Bei einem Interrupt wird die Interruptfunktion aufgerufen.

Wenn nur ein TTL Signal notwendig ist dann reicht der bereits vorgeschlagene Komparator mit einem Operationsverstärker.

Grüße Uwe

uwefed


Die Frage ist, wie realisiere ich es ein System ( mit Arduino), welches als Eingangsignal auf Analoge Signale ( per Schwellwert/Sollwert -was ich aber digital einstellen will, nicht per Poti) und TTL Signale sehr schnell (am besten unter 10µs) reagiert, welces aber per SW konfiguerbar ist, und als Antwort drauf wieder Analoge (PWM? ) und Digitale (HIGH, LOW) Signale ausgeben kann.

Ich dachte, sowas wäre perfekt mit Arduino zu realisieren? 

Arduino ist geeignet aber nicht in der Zeit die Dir vorschwebt also schlußendlich ungeeignet.
Grüße Uwe

markbee

Moin,

ein Mikrocontroller besteht vereinfacht gesagt aus vielen Registern, deren einzelne Werte (= Bits) man auf 1 oder 0 setzen kann.
Um einen Pin am Arduino UNO (=ATMEGA328) auf Ausgang zu setzen, heißt die Funktion in der Arduino IDE (im setup() deklarieren):

pinMode(pinNr, OUTPUT);

wenn man direkt das Register und in diesem Fall das Register für z.B. den PORT B, Pin 5 (beim Arduino also digital Pin 13) auf Ausgang setzen will, dann heißt der Befehl:

bitSet(DDRB,5);

eine andere Schreibweise wäre

DDRB |= (1<<5);

oder

DDRB |= _BV(5);

DDRB = The Port B Data Direction Register

Damit setzt man das Bit 5 von DDRB auf 1 und damit den Ausgang Port B 5 auf 1. Beim Arduino entspricht das dem Pin 13 (digital).

ATEMGA328 zu Arduino Pin-Map:
http://arduino.cc/en/uploads/Hacking/Atmega168PinMap2.png

Will man nun den Pin 13 auf HIGH (oder logisch 1) schalten, dann heißt es in der Arduino IDE

digitalWrite (13, HIGH);

analog, wenn man das Register direkt beschreiben will

bitSet(PORTB,5);

oder

PORTB |= (1<<5);

oder

PORTB |= _BV(5);

PORTB - The Port B Data Register

Damit setzt man das Bit 5 in PORTB auf 1 und damit den Ausgang auf HIGH (bei einem 5V-Arduino UNO also z.B. auf 5V). Der ATMEGA328 braucht in diesem konkreten Fall

für den digitalWrite()-Befehl 66 Taktzyklen, also 66 * 62,5ns = 4.125 ns oder 4µs.
für das direkte Beschreiben der Register (bitSet()) 2 Taktzyklen (Stichwort: SBI) oder 2 * 62,5ns oder 125ns

(62,5ns wenn der ATMEGA328 mit 16 MHz = 16.000.000 Schwingungen/ Sekunde getaktet ist. 1 Sekunde/ 16.000.000  = 0.0000000625 = 62,5 ns pro Taktzyklus).

Ein direktes Beschreiben der Register beschleunigt die Verabeitung dieses einzelnen Befehls also um den Faktor 33.

Vorteil des direkten Beschreiben der Register ist demnach zum einen das i.d.R. schnellere Verarbeiten der Befehle und auch der (teilweise weitaus) geringere Platzbedarf im Flash-Speicher des Arduino.
XBee blog: http://lookmanowire.blogspot.com/

Udo Klein

Also bei den Reaktionszeiten ist wie gesagt ein Komparator die bessere Wahl. Der Arduino kann ja NACH der Abschaltung dann noch weitere Alarmierungen vornehmen die nicht so zeitkritisch sind.

Problematischer sehe ich es wenn ein Sicherheitssystem von jemand konstruiert wird der nicht einmal die Grundlagen dafür beherscht, aber das mußt Du selber wissen.
Check out my experiments http://blog.blinkenlight.net

sloomy


Problematischer sehe ich es wenn ein Sicherheitssystem von jemand konstruiert wird der nicht einmal die Grundlagen dafür beherscht, aber das mußt Du selber wissen.


Den Satz finde ich sehr schade..Schließendlich will ich somit ja einsteigen und die Grundlagen lernen! Dafür ist die Forum doch hier da, und nicht dafür, dass man fertig gemacht wird, oder gleich wie bei meiner anderen Frage, dass ich eine kostenpflichtige Lösung bevorziehen soll!

Aber herzlichen Dank für den Hinweis mit dem Komperatoren, uwefed! Den habe ich mir auch zum Herzen genommen, und  das werde ich auch berücksichtigen und in der Richtung weiterlesen, mich weiter erkundigen, recherchieren.

Keiner kommt auf diese Welt mit den Kenntnissen aus dem Mutterleib, die bringen wir uns selber bei. Und wenn euch da nach einem Leitfaden frage, hoffe ich und freue ich mich sehr auf so eine geniale, viel erklärende und AUFklärende Antwort von markbee..

Vielen Dank, markbee, noch einmal für die detaillierte Erklärung.


Udo Klein

Du wirst nicht fertiggemacht. Aber entweder Deine Anwendung ist nicht kritisch, dann verstehe ich den Aufwand nicht, oder sie ist es, dann ist sie nicht wirklich geeignet zum Einsteigen.

Auf was ich raus will: egal was Du baust, eine Anfängerlösunug funktioniert nie auf Anhieb. Nicht einmal die meissten Profilösungen tun das. Nur wissen die Profis daß und bauen ihre Lösungen nicht als erstes in Sicherheitssysteme ein.
Check out my experiments http://blog.blinkenlight.net

sloomy


Du wirst nicht fertiggemacht. Aber entweder Deine Anwendung ist nicht kritisch, dann verstehe ich den Aufwand nicht, oder sie ist es, dann ist sie nicht wirklich geeignet zum Einsteigen.

Auf was ich raus will: egal was Du baust, eine Anfängerlösunug funktioniert nie auf Anhieb. Nicht einmal die meissten Profilösungen tun das. Nur wissen die Profis daß und bauen ihre Lösungen nicht als erstes in Sicherheitssysteme ein.


DAS sind weise Sätze. :) Das werde ich mir auch zum Herzen nehmen, und vorher viel testen und verifizieren/validieren, bevor ich es überhaupt als Sicherheitssystem nennen werde. :) Danke :)

Doc_Arduino

Hallo,

wenn ich das ergänzen darf, für Anfänger, welcher jenige ich auch bin, ist vielleicht diese Schreibweise verständlicher. Soll keine Kritik an die Könner sein.
Die binäre Darstellung ist auf den ersten Blick klarer was man definiert hat.

Code: [Select]

void setup()
{
// 0x...  Hexadezimale Angabe
DDRA  = 0xFF;      // Port.A komplett als Ausgang definiert
PORTA = 0xAA;      // aber nur jeder 2. auf High Pegel, Bit 1, 3, 5, 7

// 0b...  Binäre Schreibweise
DDRA  = 0b11111111;        // Port.A komplett als Ausgang definiert
PORTA = 0b10101010;        // aber nur jeder 2. auf High Pegel, Bit 1, 3, 5, 7

//  dezimale Schreibweise
DDRA  = 255;        // Port.A komplett als Ausgang definiert
PORTA = 170;        // aber nur jeder 2. auf High Pegel, Bit 1, 3, 5, 7

}

void loop()

  PORTA = 0;        // Port A komplett aus
}
Tschau
Doc Arduino

markbee

...und es gibt ja noch eine Schreibweise, die ich vergessen hatte:

PORTB |= _BV(5)     // bit PORTB 5 gesetzt
PORTB &= ~_BV(5)   // bit PORTB5 gelöscht
PORTB ^= _BV(5)     // toggle

Jetzt fehlt ja eigtl. nur noch die Assembler-Fraktion ;)
XBee blog: http://lookmanowire.blogspot.com/

uwefed


Du wirst nicht fertiggemacht. Aber entweder Deine Anwendung ist nicht kritisch, dann verstehe ich den Aufwand nicht, oder sie ist es, dann ist sie nicht wirklich geeignet zum Einsteigen.

Auf was ich raus will: egal was Du baust, eine Anfängerlösunug funktioniert nie auf Anhieb. Nicht einmal die meissten Profilösungen tun das. Nur wissen die Profis daß und bauen ihre Lösungen nicht als erstes in Sicherheitssysteme ein.


Ich stimme mit Udo überein daß Du nicht fertiggemacht wirst. Du wirst nur von uns auf den nackten kalten Boden der Wirklichkeit zurückgebracht.

Ich weiß viele Sachen, da ich immer neugierig war und bin und seit ca 30 Jahren zuerst als Jugendlicher und dann in meiner Arbeit mit Elektronik zu tun hatte/habe und auch seit dieser Zeit mich für Programmierung privat interessiere. Mein erster Computer war ein VC20 und dann ein C64.

Schau Dir mal die Internetseite von Udo an und Du wirst sehen welche Programmierkenntnise er hat. Da komme ich bei weiten nicht ran.

Grüße Uwe

Go Up