Pages: 1 [2]   Go Down
Author Topic: Arduino entkoppeln / vor Spannungseinflüssen sichern  (Read 3652 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
God Member
*****
Karma: 6
Posts: 705
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Udo,
ich steh grad irgendwie aufm schlauch:
Habe jetzt die digitalen PINS 1-13 alle auf Output gesetzt: pinMode(13, OUTPUT); etc
Jetzt versteh ich dich so, dass ich die als analogIn gekennzeichneten Eingänge auch auf Output setzen sollte, sofern sie nicht gebraucht werden.
Quote
Die freien "analogen" Inputs sind auch digitale Inputs. Die betrifft das genauso.
Frag mich allerdings grad wie ich das mache? Die gehen ja auch von 1-13.....

Wie gesagt...ich galub ich steh grad nur aufm Schlauch aber bitte gib mir nen Tipp.

Gruß
Logged

0
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3470
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ein (digitaler) Pin hat aus Sicht des Prozessors 4 Ausgabezustände:

1) Output Low
2) Ouput High
3) Input Low == High Z
4) Input High == Pullup aktiviert

Unbenutzte Analogpins sind wie Digitalpins zu behandeln.

Zustand (3) ist nur sinnvoll wenn ein Pin von außen beschaltet ist. Ansonsten "schwebt" der Pin. Schwebende Pins verursachen jede Menge merkwürdige Effekte. Dazu gehören unter umständen auch erhöhter Stromverbrauch oder merkwürdige Abstürze. Deshalb sollst Du alle unbenutzten Pins entweder auf ein festes Potential legen oder die Pullups aktivieren. Da festbinden der Pins zu Zerstörung der Ausgänge führen kann wenn man Mist programmiert würde ich im Zweifelsfall immer für die Pullups votieren, also (4).
Logged

Check out my experiments http://blog.blinkenlight.net

Gurkengraeber
Guest
 Bigger Bigger  Smaller Smaller  Reset Reset

von Udo Klein:
Quote
Ausgänge sind nie hochohmig.
Quote
3) Input Low == High Z

'High Z' oder 'Z3-State' ist weder Input noch Output.
Der Z3-State ( hochohmig ) tritt auf, wenn der Pin nicht vom Programm definiert ist. Nach dem Einschalten des Arduino sind alle alle Digital-Pins hochohmig, bis sie vom Programm definiert werden. Wie lange das dauert, kann ich nicht messen.
Quote
Schwebende Pins verursachen jede Menge merkwürdige Effekte.
Mein Reden !
Schließe ich eine Transistor-Basis über einen 1 kOhm Widerstand direkt an den Digital-Ausgang an, ist dieser Transistor nach dem Einschalten zufällig an oder aus. Darum habe ich Pull-Down-Widerstände ( 100 kOhm vom Ausgang nach Masse ) angeschlossen, damit die Transistoren standardmäßig aus sind. Bei Pull-Up-Widerständen ( 100 kOhm vom Ausgang nach Plus ) wäre der Transistor dann standardmäßig eingeschaltet.

MfG
Logged

Gurkengraeber
Guest
 Bigger Bigger  Smaller Smaller  Reset Reset

@currymuetze:

Du könntest auch versuchen, einen "sternförmigen Massepunkt" zu setzen. Also einen Massepunkt dicht am Arduino. Und von diesem gehen die Masseleitungen zum LCD, den Sensoren, den Schaltern etc.

MfG
Logged

Offline Offline
God Member
*****
Karma: 6
Posts: 705
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,
bin nun verwirrt:
Udo, du schreibst erst
Quote
Alle unbenutzten Pins müssen entweder als Ausgang geschaltet werden oder von außen auf definierte Pegel.
und dann
Quote
ich im Zweifelsfall immer für die Pullups votieren, also (4). (=Input High)
Also wie jetzt?

Also so wie ich es jetzt verstanden habe würde ich alle unbenutzten digitalen PINs so schalten:
 pinMode(x, INPUT);
 digitalWrite(x, HIGH);
und alle unbenutzen analogen Eingänge so:

 pinMode (Ax, INPUT);
 digitalWrite (Ax, HIGH);
 
Passt das?

Gruß
Logged

0
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3470
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Jein. Du behandelst einfach ALLE unbenutzten Pins wie Digitalpins. Du musst dazu nur wissen, daß A0-A6 die DigitalPins 13-19 sind. D.h. falls alle Pins unbenutzt wären würdest Du einfach

Code:
For (uint8_t pin=0; pin<20; ++pin) {
    pinMode(pin, INPUT);
    digitalWrite(pin, HIGH);
}

schreiben. Das könntest Du auch einfach immer am Anfang von setup schreiben und danach die benutzten Pins initialisieren. Das Arduino will das nicht per Default umstellen weil sie Angst haben bestehende Sketches damit inkompatibel zu beeinflussen. Kann ich verstehen, ist aber immer eine beliebte Falle.
Logged

Check out my experiments http://blog.blinkenlight.net

Offline Offline
God Member
*****
Karma: 6
Posts: 705
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi Udo,
da ich das Mega board nutze, muss ich dass dann auf pin<53 anpassen?
Was ist das eigentlich für eine variable uint8_t??
Ist ja schön kurz, mein code sieht so aus:
Code:
/*******PINS auf PULLUP schalten*******************/
   pinMode(0, INPUT);
   digitalWrite(0, HIGH);
   pinMode(1, INPUT);
   digitalWrite(1, HIGH);
   pinMode(5, INPUT);
   digitalWrite(5, HIGH);
   pinMode(6, INPUT);
   digitalWrite(6, HIGH);
   pinMode(7, INPUT);
   digitalWrite(7, HIGH);
   pinMode(13, INPUT);
   digitalWrite(13, HIGH);  
   pinMode(14, INPUT);
   digitalWrite(14, HIGH);
   pinMode(15, INPUT);
   digitalWrite(15, HIGH);
   pinMode(16, INPUT);
   digitalWrite(16, HIGH);
   pinMode(22, INPUT);
   digitalWrite(22, HIGH);
   pinMode(23, INPUT);
   digitalWrite(23, HIGH);
   pinMode(24, INPUT);
   digitalWrite(24, HIGH);
   pinMode(25, INPUT);
   digitalWrite(25, HIGH);  
   pinMode(26, INPUT);
   digitalWrite(26, HIGH);
   pinMode(27, INPUT);
   digitalWrite(27, HIGH);  
   pinMode(28, INPUT);
   digitalWrite(28, HIGH);
   pinMode(29, INPUT);
   digitalWrite(29, HIGH);
   pinMode(30, INPUT);
   digitalWrite(30, HIGH);
   pinMode(31, INPUT);
   digitalWrite(31, HIGH);  
   pinMode(32, INPUT);
   digitalWrite(32, HIGH);
   pinMode(33, INPUT);
   digitalWrite(33, HIGH);
   pinMode(34, INPUT);
   digitalWrite(34, HIGH);
   pinMode(35, INPUT);
   digitalWrite(35, HIGH);  
   pinMode(36, INPUT);
   digitalWrite(36, HIGH);
   pinMode(37, INPUT);
   digitalWrite(37, HIGH);  
   pinMode(38, INPUT);
   digitalWrite(38, HIGH);
   pinMode(39, INPUT);
   digitalWrite(39, HIGH);
   pinMode(40, INPUT);
   digitalWrite(40, HIGH);
   pinMode(41, INPUT);
   digitalWrite(41, HIGH);  
   pinMode(42, INPUT);
   digitalWrite(42, HIGH);
   pinMode(43, INPUT);
   digitalWrite(43, HIGH);
   pinMode(44, INPUT);
   digitalWrite(44, HIGH);
   pinMode(45, INPUT);
   digitalWrite(45, HIGH);  
   pinMode(46, INPUT);
   digitalWrite(46, HIGH);
   pinMode(47, INPUT);
   digitalWrite(47, HIGH);  
   pinMode(48, INPUT);
   digitalWrite(48, HIGH);
   pinMode(49, INPUT);
   digitalWrite(49, HIGH);
   pinMode(50, INPUT);
   digitalWrite(50, HIGH);
   pinMode(51, INPUT);
   digitalWrite(51, HIGH);    
   pinMode(52, INPUT);
   digitalWrite(52, HIGH);
   pinMode(53, INPUT);
   digitalWrite(53, HIGH);  
   pinMode(A0, INPUT);
   digitalWrite(A0, HIGH);  
   pinMode(A1, INPUT);
   digitalWrite(A1, HIGH);
   pinMode(A2, INPUT);
   digitalWrite(A2, HIGH);
   pinMode(A3, INPUT);
   digitalWrite(A3, HIGH);
   pinMode(A4, INPUT);
   digitalWrite(A4, HIGH);
   pinMode(A5, INPUT);
   digitalWrite(A5, HIGH);
   pinMode(A6, INPUT);
   digitalWrite(A6, HIGH);
   pinMode(A7, INPUT);
   digitalWrite(A7, HIGH);
   pinMode(A8, INPUT);
   digitalWrite(A8, HIGH);
   pinMode(A9, INPUT);
   digitalWrite(A9, HIGH);
   pinMode(A10, INPUT);
   digitalWrite(A10, HIGH);
   pinMode(A11, INPUT);
   digitalWrite(A11, HIGH);
   pinMode(A12, INPUT);
   digitalWrite(A12, HIGH);  
   pinMode(A13, INPUT);
   digitalWrite(A13, HIGH);
   pinMode(A14, INPUT);
   digitalWrite(A14, HIGH);
   pinMode(A15, INPUT);
   digitalWrite(A15, HIGH);  
« Last Edit: July 05, 2011, 03:01:25 pm by currymuetze » Logged

0
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3470
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

A0, A1, ... sind doch irgendwelche Konstanten. Schau Dir mal die Inhalte an. In WProgram.h steht bei mir:
Code:
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
const static uint8_t A0 = 54;
const static uint8_t A1 = 55;
const static uint8_t A2 = 56;
const static uint8_t A3 = 57;
const static uint8_t A4 = 58;
const static uint8_t A5 = 59;
const static uint8_t A6 = 60;
const static uint8_t A7 = 61;
const static uint8_t A8 = 62;
const static uint8_t A9 = 63;
const static uint8_t A10 = 64;
const static uint8_t A11 = 65;
const static uint8_t A12 = 66;
const static uint8_t A13 = 67;
const static uint8_t A14 = 68;
const static uint8_t A15 = 69;
#else
const static uint8_t A0 = 14;
const static uint8_t A1 = 15;
const static uint8_t A2 = 16;
const static uint8_t A3 = 17;
const static uint8_t A4 = 18;
const static uint8_t A5 = 19;
const static uint8_t A6 = 20;
const static uint8_t A7 = 21;
#endif

Man beachte, daß "normale" Arduinos 8 analoge Pins unterstützen. Leider sind bei den PTH Gehäusen nur 6 davon nach außen geführt. D.h. korrekterweise müsste mein Code die auch noch festsetzen, also so:

Code:
For (uint8_t pin=0; pin<22; ++pin) {
    pinMode(pin, INPUT);
    digitalWrite(pin, HIGH);
}

Logged

Check out my experiments http://blog.blinkenlight.net

Offline Offline
God Member
*****
Karma: 6
Posts: 705
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

also wenn ich das richtig verstehe sind A0 und folgende eigentlich Ausgang 54-69?(BeimMega?)
ruft denn jeder sketch wprogramm.h auf? Ist bei mir nicht extra definiert.

Also mach ichs einfach so:
Code:
For (uint8_t pin=0; pin<69; ++pin) {
    pinMode(pin, INPUT);
    digitalWrite(pin, HIGH);
}
Und danach belege ich die einzelnen Ausgänge und eingänge, die bestückt sind?

Korrekt so?
Logged

0
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3470
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ja, genau so. WProgram.h wird nicht _aufgerufen_ sondern immer _eingebunden_. D.h. das passiert schon beim Compilieren und nicht erst wenn das Program läuft.
Logged

Check out my experiments http://blog.blinkenlight.net

Offline Offline
Jr. Member
**
Karma: 4
Posts: 97
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo currymuetze,

war das Festlegen der übrigen Pins am Ende der entscheidende Hinweis, um Deinen Arduino vor Spannungseinflüssen abzukoppeln?
Ich kämpfe mich gerade durch ein ähnliches Problem (LED spinnt gelegentlich, Relaiskarte bringt Arduino [und LED] zum Absturz).

Grüße
Logged

Offline Offline
God Member
*****
Karma: 6
Posts: 705
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

da krammst aber nen alten Thread aus smiley-wink
Soweit ich mich erinnern kann, war das Problem bei der Motorschaltung, welche ich durch zusätzliche 0.1uF Caps und Dioden abgesichert habe.
Aber genau weiß ich es nicht mehr, da ich mittlerweile einige Updates der Platine hinter mir habe.
Mach am besten einen eigenen Thread mit der Fehlerbeschreibung auf, das wird zielführender sein.

Viel Erfolg
Logged

Pages: 1 [2]   Go Up
Jump to: