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
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
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.
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.
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.
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
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.
> 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.
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.
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.
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.
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 ;-)
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?
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).
>>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.