Forum: Mikrocontroller und Digitale Elektronik Arduino - Pin Directions - digital, analog oder beides?


von Christian J. (Gast)


Lesenswert?

Hallo,

da ich da teilweise etwas seltsame Effekte habe mal eine Frage. Ich 
beziehe mich auf die Nanos 328 und auf die Mega2560 Boards.

Schliesse ich eine LED an den A0 oder beliebige anderen Analog Port an 
und setze diesen Port auf Ausgabe und schreibe HIGH hinein glimmt die 
LED nur ganz schwach. Sind die Analog Ports überhaupt für digitale 
Ausgabe zu gebrauchen und vor allem mit der gleichen Treiberleistung? 
Das Datenblatt des Atmegas sagt ja, dass die Pins volle Digitalfähigkeit 
haben. Nur was die Arduino IDE daraus wurstelt weiss ich nicht.

Beim Nano scheint ein Pin nur Open Collector oder Input zu sein, Nummer 
habe ich grad nicht im Kopf? Stimmt das? Jedenfalls kann ich keinen 
Pegel dort ausgeben.

Gruss,
Christian

von Heine (Gast)


Lesenswert?

weis nicht wie das mit der andruino ide ist, aber du musst ws vorher 
noch das Register als Ausgang definieren und das erst de jew. Pin au 
high schalten

von Mike (Gast)


Lesenswert?

Christian J. schrieb:
> Nur was die Arduino IDE daraus wurstelt weiss ich nicht.

Und wir wissen nicht, was du da programmierst.
Wenn du ihn als analogen Ausgang verwendest, kommt da PWM raus, wenn du 
ihn als digitalen Ausgang verwendest, kannst du ihn z.B. mit den 
Digitalausgabebefehlen steuern.

von Wolfgang A. (Gast)


Lesenswert?

Christian J. schrieb:
> Beim Nano scheint ein Pin nur Open Collector oder Input zu sein, Nummer
> habe ich grad nicht im Kopf? Stimmt das? Jedenfalls kann ich keinen
> Pegel dort ausgeben.

Der Aufbau des Ausgangs hat nichts mit Nano zu tun, sondern steht im 
Atmel Datenblatt des Prozessors. Um bei einem Open Drain Ausgang einen 
Pegel auszugeben, kann du immer einen Pull-up Widerstand verwendet.
Ein Open Kollektor Ausgang wird es jedenfalls wohl kaum sein.

von Christian J. (Gast)


Lesenswert?

Mike schrieb:
> Und wir wissen nicht, was du da programmierst.

pinMode(PIN, OUTPUT);
digitalWrite(PIN,HIGH);

digital und KEIN analogWrite(...);

Das Datenblatt des 328 gibt an, dass sich I2C und TWI Pins als Open 
Drain verhalten können, wenn diese Betriebsmodi ausgewählt sind. 
Alledings haben sie auc normale Push-Pull Treiberstufen. Evtl ist also 
die Verwendung von bestimmten Libs daran schuld.

von Bernhard F. (bernhard_fr)


Lesenswert?

Eins vorweg, ich arbeite derzeit mit dem Meag2560 Rev3 unter Atmel 
Studio und ich kann dir versichern:

1)
bei:
1
DDRF  |= (1<<PF0);
2
PORTF |= (1<<PF0);

kommen am "Analog Pin0 (PF0)" glasklare 5 V raus die auch eine normale 
LED mit Vorwiderstand für 8mA schön zum leuchten bringen...

2)
Wenn der Pin nicht als Ausgang gesetzt ist, man aber trotzdem eine 1 zum 
Schreiben ins Portregister schickt, na dann wird der Pullup gesetzt.
Die LED glimmt dann ganz schwach...



Wie kommen die überhaupt bei Arduino auf die schwachsinnige Idee auf nen 
stinknormalen Pin ohne D/AC (sowas hat der ATMEGA2560 doch garnicht?!) 
einen Analogwert ausgeben zu wollen?
O.K. http://arduino.cc/en/pmwiki.php?n=Reference/AnalogWrite hilft...

Hm... irgend ein Software PWM geschwubbel wird dort also als Analogwert 
verkauft... (Ich kommentier das jetzt mal nicht...)
Also ist es doch kompletter Schwachsinn zu sagen AnalogWrite() kann mehr 
treiben als DigitalWrite(). Bzw der Pin Hätte mehr "Analogfähigkeit" als 
"Digitalfähigkeit". Analog ist doch hier nur einfach schnell ein und 
ausschalten...


Christian J. schrieb:
> Mike schrieb:
>> Und wir wissen nicht, was du da programmierst.
>
> pinMode(PIN, OUTPUT);
> digitalWrite(PIN,HIGH);


Die 2 Codezeilen scheinen ja anscheined nicht auszureichen, sondern 
irgendetwas was du eingebunden hast scheint zu verhindern, dass du einen 
Pin als Ausgang setzten kannst.
Aber wenn man seine libs nicht selber schreibt, man die Doku nicht ließt 
oder selbige nicht vorhanden ist, dann weiß man auch nicht was das 
Programm letztendlich im Detail macht.



Christian J. schrieb:

> Das Datenblatt des 328 gibt an, dass sich I2C und TWI Pins als Open
> Drain verhalten können, wenn diese Betriebsmodi ausgewählt sind.
> Alledings haben sie auc normale Push-Pull Treiberstufen. Evtl ist also
> die Verwendung von bestimmten Libs daran schuld.

Ähm gerade gelesen... versuchst du wirklich auf Pins etwas auszugeben 
die für eine Schnittstelle konfiguriert wurden?

: Bearbeitet durch User
von Wolfgang A. (Gast)


Lesenswert?

Bernhard F. schrieb:
> Wie kommen die überhaupt bei Arduino auf die schwachsinnige Idee auf nen
> stinknormalen Pin ohne D/AC (sowas hat der ATMEGA2560 doch garnicht?!)
> einen Analogwert ausgeben zu wollen?

Wenn du dich etwas weiter damit beschäftigst, siehst du, dass bei den 
Arduinos auch PWM als Analogsignal bezeichnet wird, und das ist es 
natürlich auch, wenn man die Zeit mit einbezieht. IMHO hat nur der 
Arduino Due zwei DACs.

von Dussel (Gast)


Lesenswert?

> Hm... irgend ein Software PWM geschwubbel wird dort
> also als Analogwert verkauft... (Ich kommentier das jetzt mal nicht...)
Da siehst du, warum Arduino hier für manche ein rotes Tuch ist. 
Allerdings gilt Arduinonutzer<->Dummer Nutzer nicht. (Ich nutze selber 
keinen.)

Bernhard F. schrieb:
> Ähm gerade gelesen... versuchst du wirklich auf Pins etwas auszugeben
> die für eine Schnittstelle konfiguriert wurden?
Er versucht, auf Pins etwas auszugeben, die also Schnittstelle 
konfiguriert werden können. Für so schlau, dass er das nicht getan hat, 
halt ich ihn schon.

Zum Thema: Die erste Frage ist, wie groß der Vorwiderstand ist. 
Vielleicht hat das Board ja schon einen eingebaut, so dass mit einem 
zusätzlichen Vorwiderstand der Strom zu gering wird.

von Dussel (Gast)


Lesenswert?

Wolfgang A. schrieb:
> Wenn du dich etwas weiter damit beschäftigst, siehst du, dass bei den
> Arduinos auch PWM als Analogsignal bezeichnet wird, und das ist es
> natürlich auch, wenn man die Zeit mit einbezieht.
Nein. Wenn man die Zeit mit einbezieht, hat man eine Rechteckschwingung. 
Die hier in dem Zusammenhang als analog zu bezeichnen, wäre sehr weit 
hergeholt.

von Thomas E. (thomase)


Lesenswert?

Dussel schrieb:
> Nein. Wenn man die Zeit mit einbezieht, hat man eine Rechteckschwingung.
> Die hier in dem Zusammenhang als analog zu bezeichnen, wäre sehr weit
> hergeholt.

Dass es sich hierbei um die Änderung des Duty Cycles einer PWM handelt, 
ist klar. Erst mit einem nachgeschalteten Tiefpass wird daraus dann ein 
Analogsignal.

Dass das tiefe Verständnis dieses Zusammenhanges über den Horizont des 
normalen Arduinonutzers weit hinaus geht, ist auch klar.

Also lass gut sein. Für Arduinonutzer ist das analog.

mfg.

von Bernhard F. (bernhard_fr)


Lesenswert?

Wolfgang A. schrieb:

> Wenn du dich etwas weiter damit beschäftigst, siehst du, dass bei den
> Arduinos auch PWM als Analogsignal bezeichnet wird, und das ist es
> natürlich auch, wenn man die Zeit mit einbezieht.

Ähm, das habe ich in genau der Zeile darunter?

Und als "analoges Signal" würde ich den PWM-Kram erst bezeichnen, wenn 
er auch noch geglättet wurde...


Dussel schrieb:

> Er versucht, auf Pins etwas auszugeben, die also Schnittstelle
> konfiguriert werden können. Für so schlau, dass er das nicht getan hat,
> halt ich ihn schon.

Ich hätte ihm ja auch nicht unterstellt, das bewusst gemacht zu haben.
Aber es wäre nicht das erste mal das irgend eine Arduino-libary mehr 
macht, als man sich von ihr wünscht.

von Wolfgang A. (Gast)


Lesenswert?

Bernhard F. schrieb:
> Aber es wäre nicht das erste mal das irgend eine Arduino-libary mehr
> macht, als man sich von ihr wünscht.

Sonst wären schon digitalWrite() oder digitalRead() nicht so 
schnarchlangsam ;-)

von Dussel (Gast)


Lesenswert?

Wolfgang A. schrieb:
> Sonst wären schon digitalWrite() oder digitalRead() nicht so
> schnarchlangsam ;-)
Ist das so? Was machen die denn sonst noch? Eigentlich dürften das grob 
geschätzt so 20 Takte sein. Wie lange dauert es denn?

von Thomas L. (thomas_hx)


Lesenswert?

DigitalWrite() benötigt auf dem 328 mit 16MHz ca 4µs (64 Takte)
DigitalRead()  keine Ahnung

Unter LunaAvr benötigt der entsprechende Befehl 250ns (4Takte).

von Christian J. (Gast)


Lesenswert?

>>Hm... irgend ein Software PWM geschwubbel wird dort also als Analogwert
>>verkauft... (Ich kommentier das jetzt mal nicht...)
>>Also ist es doch kompletter Schwachsinn zu sagen AnalogWrite() kann mehr

Alsoooo....... ein "Geschwubbel" ist das nicht, das macht der Timer 0, 
der gnau dafür abgezweigt wurde und der auch millis bedient. Damit 
möchte man, dass zb RGB LEDS gedimmt werden können. Und das ist auch 
nicht sooooo vekehrt.

In Teufels Küche kommt man nur, wenn man die normalen Hardwareregister 
benutzt, die ja auch definiert sind und vorbei an der IDE mal was 
verstellen will und so die Libs verärgert, die was ganz anderes mit den 
Ressourcen machen wollen.  Denn der gemeine User soll ja nur die 
"Arduino Language" verwenden. Aber wenn das system so sch.... wäre, 
würde es sich nicht millionenfach verkaufen und nicht jeder Chinese in 
seiner 70.ten Stick Etagenwohnung dafür irgendwelche Sensoren und 
"Shields" auf den Markt werfen für 1 Euro fuffzig.

digitalwrite (64) kann man durch digitalwritefast (7 takte) er setzen, 
wo alle Portzugriffe in einer Wahnsinns-Header Datei, sozusagen ein 
Makroprozessor durch Makros in  Potzugriffe ersetzt werden da 
digitalwrite leider noch die gültigkeit prüft (0,1...?), wenn Dummuser 
da zb 5 ein gibt usw. Aber der Profiduino-User ist ja clever und ändert 
fix die Lib-Dateien ab und entfernt die Bereichsprüfung für 1 oder 0 und 
ersetzt die Bit-Manipulation durch eine Ein-Oder-ung. Damit fängt er 
sich sicherlich neue Probleme irgendwo anders ein aber das System soll 
ja Spass machen und eine ewige Baustelle sein.

Und die Sache, dass eine serial oder wiring Lib mir da irgenwas macht, 
was sie nicht soll muss ich mal erkunden, wenn ich ein paar Bier drin 
habe, dann geht das am besten.

>>Ähm gerade gelesen... versuchst du wirklich auf Pins etwas auszugeben
>>die für eine Schnittstelle konfiguriert wurden?

Nein, nicht wirklich! Ich das schon verstanden haben tun .. weil ich ja 
schon Profiduino-User sein :-)


Schön, nicht wahr? Arbeit für Doofe... aber 10 Mal schneller Pins 
toggeln.
1
#define digitalPinToPortReg(P) \
2
(((P) >= 22 && (P) <= 29) ? &PORTA : \
3
((((P) >= 10 && (P) <= 13) || ((P) >= 50 && (P) <= 53)) ? &PORTB : \
4
(((P) >= 30 && (P) <= 37) ? &PORTC : \
5
((((P) >= 18 && (P) <= 21) || (P) == 38) ? &PORTD : \
6
((((P) >= 0 && (P) <= 3) || (P) == 5) ? &PORTE : \
7
(((P) >= 54 && (P) <= 61) ? &PORTF : \
8
((((P) >= 39 && (P) <= 41) || (P) == 4) ? &PORTG : \
9
((((P) >= 6 && (P) <= 9) || (P) == 16 || (P) == 17) ? &PORTH : \
10
(((P) == 14 || (P) == 15) ? &PORTJ : \
11
(((P) >= 62 && (P) <= 69) ? &PORTK : &PORTL))))))))))
12
13
#define digitalPinToDDRReg(P) \
14
(((P) >= 22 && (P) <= 29) ? &DDRA : \
15
((((P) >= 10 && (P) <= 13) || ((P) >= 50 && (P) <= 53)) ? &DDRB : \
16
(((P) >= 30 && (P) <= 37) ? &DDRC : \
17
((((P) >= 18 && (P) <= 21) || (P) == 38) ? &DDRD : \
18
((((P) >= 0 && (P) <= 3) || (P) == 5) ? &DDRE : \
19
(((P) >= 54 && (P) <= 61) ? &DDRF : \
20
((((P) >= 39 && (P) <= 41) || (P) == 4) ? &DDRG : \
21
((((P) >= 6 && (P) <= 9) || (P) == 16 || (P) == 17) ? &DDRH : \
22
(((P) == 14 || (P) == 15) ? &DDRJ : \
23
(((P) >= 62 && (P) <= 69) ? &DDRK : &DDRL))))))))))

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.