Forum: Mikrocontroller und Digitale Elektronik AVR Atmega ports register


von Stevo J. (stevo9)


Lesenswert?

Moin,
ich habe eine Frage bzgl. der direkten Adressierung der IO Register vom 
AVR Mikrocontroller Atmega.
Inzwischen benutze ich den ATmega2560 bedingt der Vielzahl an IO (vorher 
ATmega328).

Bislang habe ich noch die echt langsamen Arduino Befehle verwendet, 
inzwischen spreche ich aber lieber direkt die einzelnen Ports bzw 
Register an. (DDR, PORT, PIN)
Hat es einen Vorteil, wenn ich einen PORT (z.B. PORTC) ausschließlich 
als Input definiere (alle 8 Bits) und den anderen (z.B. PORTL) 
ausschließlich aus Output?
Oder gibt es eine andere sinnvolle Zuweisung der IO, z.B. IO die viel 
gepollt werden auf einem gemeinsamen PORT?

Ich habe mehrere 74HC959 (Schieberegister für output), 74HC165 
(Schieberegister für input) sowie auch einzele Leds, und Relays direkt 
an meinem ATmega2560 verbunden.

von Einer K. (Gast)


Lesenswert?

Stevo J. schrieb:
> Hat es einen Vorteil, wenn ich einen PORT (z.B. PORTC) ausschließlich
> als Input definiere (alle 8 Bits) und den anderen (z.B. PORTL)
> ausschließlich aus Output?

Eher ist das Gegenteil der Fall...
Da der maximale Output Strom nicht nur pro Pin, oder pro ganzen Chip, 
sondern auch für pro Register begrenzt ist.

Aus dem Grund kann ein geschicktes Mischen der Eingänge und Ausgänge 
empfehlenswert/notwendig sein.

Mit Arduino hat das allerdings nichts zu tun.

von Achim H. (pluto25)


Lesenswert?

Andererseits ist es einfacher und schneller einen Port 
abzufragen/auszugeben als jedes Bit einzeln. Für die Shift Register 
(74...) könnte ein Pin verwendet werden der ein Hardware Shift Register 
enthält (Spi,Uart,I2c) Das macht die Ein/Ausgabe weniger aufwendig.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Ich mische mir das so zurecht wie es gerade passt bzw. was ich brauche.

Wenn ich einen 8Bit-Datenbus brauche, bekommt der natürlich einen 
kompletten Port.

Ansonsten kommt das auf die Programmierung an. Da ich auf den 
AVR-Controllern recht viel interruptgesteuert mache ist das egal. Man 
braucht nur einmal den Interrupt zu programmieren, den Rest macht die 
Hardware bzw. die Hardware passt sich ein Stück dem Programm an.

Gleiches gilt wenn man keine (parallelen) Daten verarbeitet und Zustände 
von Tastern oder so nicht puffert. Dann kann man die Pins einfach mit 
SBIS/SBIC auswerten, auf welchem Port da was liegt ist dadurch ebenfalls 
schnuppe. Oder andersrum, wenn man nur einzelne Pins schaltet (z.B. LEDs 
oder sonstewas) geht das prima mit SBI/CBI, für jeden Port/Pin der 
gleiche Aufwand.

Anders siehts aus wenn man z.B. Daten an ein Display sendet, das sind 
meistens mindestens 4 Leitungen gleichzeitig, die man ändert. Da machts 
Sinn, wenn die alle geordnet an einem Port liegen, am besten noch am 
oberen oder am unteren Ende.

Das Ganze natürlich vorausgesetzt man hat genug freie I/O-Pins und muß 
sich nicht verbiegen um noch irgendwie irgendwo einen fehlenden freien 
Pin zu finden.

Gegenteilig gibts aber auch die Möglichkeit, eine Brücke im Programm 
ersetzt eine (Löt)Brücke auf der Platine.

Ich finde das ist ein recht komplexes Thema und angesichts der vielen 
Möglichkeiten, die sich mit den I/O-Pins eines (größeren) AVR bieten, 
wird man das nicht abschließend beantworten können. Es kommt immer auf 
den Anwendungsfall an, was am besten, am einfachsten oder manchmal eben 
auch notwendig ist.

von Stevo J. (stevo9)


Lesenswert?

Hi, ist zwar inzwischen schon etwas länger her, aber möchte trotzdem 
gerne meine Erfahrung teilen. Inzwischen habe ich etwas getestet und 
gemessen:

Also bzgl. des maximalen Output-Stroms pro Pin, habe ich keinerlei 
Probleme: Die MCU ist mit max. 40 mA per single Pin spezifiziert (<35mA 
recommended max) . Jedoch wahrscheinlich eher peak Werte gemeint; ich 
würde niemals dauerhaft über 20 mA verbrauchen. Meine ShiftRegister, 
Leds, IC, Sensoren benötigen meistens nur 2-8 mA.

Ferner habe noch die Aussage gelesen 200 mA für alle PIN. Dies kann ich 
nicht bestätigen.
Zumal angegeben bei externer Versorgung ein Maximum der current draw is 
0.8A. Ich versorge meinen Arduino Mega (ATmega2560) ferner direkt mit 
einem 2A - 5V Netzteil. Mein Verbrauch bislang liegt nur bei 200mA wird 
aber wahrscheinlich aber größer werden.

Bzgl. der Schnelligkeit der Input Abfrage:
Über die direkte Abfrage der einzelnen Ports bzw Register an. (DDR, 
PORT, PIN) habe ich erheblich an Reduzierung der Zykluszeit gewonnen 
(Der Faktor lag fast im 8x fachen Bereich.)

Ferner habe nun versucht möglichst viele digital Sensoren auf ein 
Register zu legen um diese möglichst alle gemeinsam abzurufen.
Sobald ich paar Vergleichwerte habe, werde ich diese gerne hier teilen.

von Stefan F. (Gast)


Lesenswert?

Stevo J. schrieb:
> Ferner habe noch die Aussage gelesen 200 mA für alle PIN. Dies kann ich
> nicht bestätigen.

Damit bewegst du dich auf dünnem Eis. Der Hersteller verspricht nicht 
mehr in seinem Datenblatt. Wenn es jetzt gut klappt, dann beim nächsten 
mal mit einem neueren oder älteren Chip vielleicht nicht. Außerdem sind 
sporadische Fehlfunktionen zu erwarten, wenn die Stromversorgungs-Pin 
überlastet werden. Die fallen vielleicht nicht sofort auf, aber später 
zum Beispiel im nächsten Sommer.

Beitrag #6472154 wurde von einem Moderator gelöscht.
von Stevo J. (stevo9)


Angehängte Dateien:

Lesenswert?

> Damit bewegst du dich auf dünnem Eis. Der Hersteller verspricht nicht
> mehr in seinem Datenblatt. Wenn es jetzt gut klappt, dann beim nächsten
> mal mit einem neueren oder älteren Chip vielleicht nicht. Außerdem sind
> sporadische Fehlfunktionen zu erwarten, wenn die Stromversorgungs-Pin
> überlastet werden. Die fallen vielleicht nicht sofort auf, aber später
> zum Beispiel im nächsten Sommer.


Ich glaube, du hast mich hier falsch verstanden bzw. ich habe mich 
falsch ausgedrückt (kann meinen Beitrag auch nicht mehr ändern...).
Mein Gesamtverbrauch liegt bei bei maximal 200 mA; dort ist die 
Versorgung des Arduinos, mehrer Schieberegister, Strom-Sensoren 
inbegriffen. Der Strom der aus den Output des MCU kommen liegt bei ca. 
50 mA!

Bzgl. meiner Aussage 200 mA für alle PIN: Ich hätte stark erwartet, dass 
der atmega2560 mehr kann als der ATmega328 (auch bedingt der großen 
Anzahl an IO).
Leider ist dies nicht der Fall. Ich habe gerade im Datenblatt 
nachgeschaut, auch hier sind nur 200 mA angegeben:
(DC Current VCC and GND Pins ....200.0mA)

Aber danke für den Hinweis.

von Axel S. (a-za-z0-9)


Lesenswert?

Stevo J. schrieb:
> Hi, ist zwar inzwischen schon etwas länger her, aber möchte trotzdem
> gerne meine Erfahrung teilen. Inzwischen habe ich etwas getestet und
> gemessen:
>
> Also bzgl. des maximalen Output-Stroms pro Pin, habe ich keinerlei
> Probleme ...

Ich fürchte, du hast dich da zu sehr auf einen Nebenschauplatz führen 
lassen. Wenn der Strombedarf zu einem Kriterium wird, auf welchen Port 
du ein Signal legst, dann machst du prinzipiell etwas falsch. Du 
solltest dann besser einen Treiber nachschalten.

Aus meiner Sicht gibt es drei deutlich wichtigere Kriterien, nach denen 
man seine Signale auf IO-Pins verteilt.

1. Manche Pins sind mehr oder weniger fest zugeordnet. Etwa die Pins für 
UART, SPI oder Timer (capture input, PWM output). Die muß man zuerst 
vergeben.

2. Software. Wenn man Pins immer gemeinsam abfragt (z.B. die beiden 
Phasensignale eines Drehgebers), dann ist es sinnvoll, die auf den 
gleichen Port zu legen. Das gilt auch bei der Ausgabe. Der Klassiker 
wären hier die Datenleitungen zu einem Display. Wenn man die an den 
gleichen Port und dann am besten auch noch in der richtigen Reihenfolge 
auflegt, macht man sich das Leben sehr viel einfacher, weil man die 
Daten für die Ausgabe bloß noch verschieben und maskieren muß. Wenn man 
die kreuz-und-quer, gar noch an mehreren Ports auflegt, macht man sich 
das Leben viel schwerer.

3. Platinenlayout. Vor allem wenn man seine Platinen selber macht, hat 
man oft Beschränkungen was Leiterbahnbreite und Durchkontaktierungen 
angeht. Auch hier kann man sich das Leben leichter machen, wenn man 
Signale so auflegt, daß man sie kreuzungsfrei routen kann.

Nicht immer lassen sich alle Wünsche erfüllen. So können sich 
Anforderungen aus 2. und 3. widersprechen. Dann muß man sich 
entscheiden, was einem wichtiger ist. Und auch wenn ich 2. und 3. oben 
in einer bestimmten Reihenfolge genannt habe, ist das nicht im Sinne 
einer Priorität zu verstehen.

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Axel S. schrieb:

> Aus meiner Sicht gibt es drei deutlich wichtigere Kriterien, nach denen
> man seine Signale auf IO-Pins verteilt.
[...]

Das hört sich nach einem Konzept an, was auch ich unterschreiben würde. 
Ziemlich genau so mache ich das nämlich ebenfalls.

Und zusätzlich: was diese 200mA-Grenze betrifft, gilt die für den 
gesamten Chip oder maximal pro Supply-Signal (so es denn überhaupt mehr 
als eins gibt), aber nicht pro Port (das dann höchstens indirekt, wenn 
zufällig mal aus einem Supply-Pin genau nur ein Port versorgt wird).

Nur M328P-fixierten Schmalspurfachleuten kommt es so vor, als gäbe es 
genau diese Ausnahmesituation universell und nur diese kommen auf die 
Idee, ein perPort-Limit zu konstruieren...

von Veit D. (devil-elec)


Lesenswert?

c-hater schrieb:

> Nur M328P-fixierten Schmalspurfachleuten kommt es so vor, als gäbe es
> genau diese Ausnahmesituation universell und nur diese kommen auf die
> Idee, ein perPort-Limit zu konstruieren...

Da muss ich dich leider korrigieren. Lies einmal im Manual zwischen 32.2 
und 32.2.1 die Notes. Common DC Characteristics.

von c-hater (Gast)


Lesenswert?

Veit D. schrieb:

> Da muss ich dich leider korrigieren. Lies einmal im Manual zwischen 32.2
> und 32.2.1 die Notes. Common DC Characteristics.

In welchem Manual?

von Veit D. (devil-elec)


Lesenswert?

Hallo,

okay, es gibt eine neue Ausgabe, da stehts unter der Tabelle 30.1 auf 
Seite 323.
http://ww1.microchip.com/downloads/en/DeviceDoc/ATmega48A-PA-88A-PA-168A-PA-328-P-DS-DS40002061B.pdf

In meiner 2018er Version stehen überall in den Notes 100mA. Jetzt 
aktuell teilweise 150mA. Warum auch immer.

: Bearbeitet durch User
von Stevo J. (stevo9)


Lesenswert?

Oh, danke Veit, sehr interessant. Wusste ich gar nicht, dass die 
currents so genau spez. sind.

1)The sum of all IOH, for ports J0-J7, G2, A0-A7 should not exceed 200mA
2)The sum of all IOH, for ports C0-C7, G0-G1, D0-D7, L0-L7 should not 
exceed 200mA
3)The sum of all IOH, for ports G3-G4, B0-B7, H0-H7 should not exceed 
200mA
4)The sum of all IOH, for ports E0-E7, G5 should not exceed 100mA
5)The sum of all IOH, for ports F0-F7, K0-K7 should not exceed 100mA

: Bearbeitet durch User
von Veit D. (devil-elec)


Lesenswert?

Hallo,

bitte. Musste jetzt erstmal überlegen. Deine Angaben sind vom 
ATmega2560. Nicht das wir durcheinander kommen.  :-)

von c-hater (Gast)


Lesenswert?

Veit D. schrieb:

> okay, es gibt eine neue Ausgabe, da stehts unter der Tabelle 30.1 auf
> Seite 323.
> 
http://ww1.microchip.com/downloads/en/DeviceDoc/ATmega48A-PA-88A-PA-168A-PA-328-P-DS-DS40002061B.pdf
>
> In meiner 2018er Version stehen überall in den Notes 100mA. Jetzt
> aktuell teilweise 150mA. Warum auch immer.

Du hast offenichtlich das Problem nicht verstanden. Das ist: Es gibt 
KEIN proPort-Limit, sondern nur ein perSupply-Limit.

Nur bei ganz bestimmten AVR8 wird daraus für Schmalspurdenker ein 
proPort-Limit. Nämlich genau bei denen, die (mehr oder weniger zufällig) 
über einen Port verfügen, der eine exclusive Versorgung hat.

Das ist aber eher die Ausnahme als die Regel. Es gibt nämlich ziemlich 
viele AVR8, die überhaupt nur eine Versorgung haben, aber trotzdem 
mehrere Ports. Und es gibt auch ziemlich viele AVR8, die zwar mehrere 
Supplies haben, aber noch viel mehr Ports, von denen aber keiner 
exklusiv aus einer dieser Supplies versorgt wird.

Kannst du solche Vielfalt begreifen und sinnvoll einsortieren, also die 
übergeordneten Gesetze verstehen?

von Einer K. (Gast)


Lesenswert?

Aua...

Folgt jetzt das c-hater-Port-Strom-Desaster auf das 
c-hater-Aref-BOD-Desaster?
Da bin ich ja mal gespannt.

c-hater schrieb:
> Es gibt KEIN proPort-Limit, sondern nur ein perSupply-Limit.
Wo steht das?
Im Datenblatt?
Ne, oder ...

Also:
Hast du dir das vielleicht nur ausgedacht um .....

von Veit D. (devil-elec)


Lesenswert?

c-hater schrieb:

> Du hast offenichtlich das Problem nicht verstanden. Das ist: Es gibt
> KEIN proPort-Limit, sondern nur ein perSupply-Limit.

Tut mir leid, ich kann im Manual und in den Notes keinen Hinweis lesen 
in dem Zusammenhang. In den Notes gehts rein um die maximalen 
Summenströme der Ports. Getrennt für Source und Sink. Note 5. ist auch 
interesant. Wo liest du das mit dem "per Supply Limit" oder was auch 
immer das sein soll?
Aktuell gibts ein
a) Pin Limit
b) Port Limit
c) Chip Limit
Alle 3 muss man beachten wenn man an allen Pins hier und da paar mA 
benötigt.

von c-hater (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:

> Folgt jetzt das c-hater-Port-Strom-Desaster auf das
> c-hater-Aref-BOD-Desaster?
> Da bin ich ja mal gespannt.
> Hast du dir das vielleicht nur ausgedacht um .....

Nö. Du bist einfach zu blöd, um das "Große Ganze" zu begreifen. Ein 
kurzer Anschub, um dir klar zu machen, was du alles nicht weisst, wurde 
hier im Thread bereits geposted:

Beitrag "Re: AVR Atmega ports register"

Das war dann der Fall, dass es mehrere Supplies und viele Ports gibt, 
aber keinen, der exklusiv eine Supply hat.
Das andere Ende findest du massenhaft im ATtiny-Bereich: mehrere Ports, 
aber nur eine Versorgung. Z.b. ATtiny 2313/2313A/4313 und viele andere 
mehr.

von Einer K. (Gast)


Lesenswert?

c-hater schrieb:
> Du bist einfach zu blöd, um das "Große Ganze" zu begreifen.
Meinst du, diese blöde Anmache würde irgendwie deine Fantasien und 
Einbildungen zur Realität umformen?

So wie du beim c-hater-Aref-BOD-Desaster keinen reproduzierbaren Test 
vorweisen konntest, stattdessen gekniffen hast, droht dir hier das 
gleiche Schicksal.

Hier kannst du, auch auf Aufforderung, keine Stelle im Datenblatt 
vorweisen, welche deine Behauptungen stützt.

Du hast die Wahl:
1. Belege deine Behauptungen
2. Ziehe den Schwanz ein und kneife

Alternativ:
Beleidige mich weiter und blamiere dich damit.

Übrigens:
Das Verhalten nennt man heutzutage auch mal rumtrumpen.


-----

Das aus meiner Sicht richtige Verhalten wäre, die Daten im Datenblatt 
als Wahr anzunehmen und sich daran dann auch zu halten.
Irgendwelche trumpigen Fantasien, sollten das genannte Verhalten nicht 
beeinträchtigen.

von Stefan F. (Gast)


Lesenswert?

Bei der Wortwahl kann man den c-hater genau so wenig ernst nehmen, wie 
den Bademeister.

von Ralph S. (jjflash)


Lesenswert?

Arduino Fanboy D. schrieb:
> Übrigens:
> Das Verhalten nennt man heutzutage auch mal rumtrumpen.

Das kannte ich zwar noch nicht, aber es beschreibt ziemlich gut ein 
bestimmtes Verhalten und werde ich mir für diverse Dinge als Redewendung 
mal merken, es trifft so schön "des Pudels Kern" (das ist dann eine 
Redewendung aus Goethes Faust... da kann man dann auch schön 
"rumGoethen" : - ) )

von Pandur S. (jetztnicht)


Lesenswert?

Was soll es denn eine Lichtshow an einem AVR zu betreiben. Falls man nur 
einen Zustand anzeigen will genuegt viel weniger Strom.
Ich verwende ab 5V zu einer roten oder gruenen LED einen Vorwiderstand 
von 10k und einen 4.7k fuer 3.3V. die Blauen brauchen etwas mehr 
Spannung. Blau verwende ich daher bei 3.3V nicht. die Blauen sind aber 
gut ein Analog Signal fuer einen Digitaleingang zu limitieren.

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.