www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik warum immer drei Register für eine Sache?


Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

warum benötigt man für jede Operation stets drei Register? ein Register 
z.B. wo man für einen Pin einstellen kann das der Pullup (intern) 
aktiviert ist, ein Register, dass dieser Pullup deaktiviert ist und noch 
ein weiteres Register, bei dem man rauslesen kann, ob der Pullup 
aktiviert ist?

Welche Gründe erlauben nicht das verwenden von einem Register, welches 
den Pullup setzt? z.B. 0 für setzen und 1 für nicht setzen und das kann 
man dann auch noch auslesen?

Wer kann mich da mal aufklären, warum das so gemacht wird.

Bernd

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst in Deinem FPGA alles so machen, wie Du lustig bist.

Wenn ein Register reicht, nimmste eben nur eins.


Peter

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiß jetzt nicht genau, von welchem µC du sprichst, wenn
überhaupt. Aber bei einigen (z.B. den SAMs von Atmel) gibt es
getrennte Setz-, Lösch- und Leseregister, damit das Ändern einzelner
Bits ohne Beeinflussung der übrigen mit einem einzelnen I/O-Zugriff
geschehen kann. Normalerweise sind dazu immer zwei Zugriffe
erforderlich: Lesen, logische Verknüpfung, Schreiben.

Autor: ozo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meinst du mit "jeder Operation" jede Operation oder nur die port- (und 
afaik atmel) spezifischen Dinge, die du näher beschrieben hast?
Erstes (schnelle Register-Register Operationen) ist Teil der RISC 
Architektur. Zweites wahrscheinlich eher persönlicher Geschmack der 
Atmel Menschen.

Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry, ich schreibe von den ARM7 µController von Atmel...

>getrennte Setz-, Lösch- und Leseregister

ja genau so ist es bei diesem Atmel µC auch. ok, das heißt es bringt 
weniger arbeitsschritte mit sich, auch wenn man das im ersten moment 
nicht gleich erkennt.

Bernd

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Diese Register-Technik findet man vorrangig bei Prozessoren, die nicht 
in der Lage sind, in einem einzelnen Befehl selektiv einzelne Bits eines 
I/O-Ports zu ändern.

Siehe Interrupt

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen dank für die antworten;

d.h. bei einer RISC Architektur ist es auch so, dass wenn der PIO 
Controller aktiviert ist und als Ausgang konfiguriert ist, man über die 
Register

PIO_SODR (Set Output Data Register) und
PIO_CODR (Clear Output Data Register) eine 1 oder eine 0 versenden kann 
bzw. versendet wird?

soll eine 1 am Ausgang sein, muss das PIO_SODR Register gesetzt werden; 
wenn eine 0 am Ausgang sein soll, dann das PIO_CODR mit einer 1 
ansprechen?

Bernd

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> sorry, ich schreibe von den ARM7 µController von Atmel...

Ja, die habe ich mit den "SAMs" auch gemeint (AT91SAMxxx, natürlich
gibt es auch andere ARMs von Atmel, aber die sind in ihrer On-Chip-
Peripherie alle ähnlich).

> ok, das heißt es bringt weniger arbeitsschritte mit sich, auch wenn
> man das im ersten moment nicht gleich erkennt.

In den meisten Fällen ist das so. Zusätzlich ist dadurch das Verändern
einzelner Bits ein atomarer Vorgang, der nicht durch Interrupts
unterbrochen werden kann (s. Kommentar von Andreas Kaiser).

Beispiel:

Du möchtest die Bits 8 bis 11 setzen, ohne die restlichen 28 Bits zu
verändern. Die klassischen Methode besteht aus drei Schritten:

1. Auslesen des aktuellen Registerinhalts

2. Verodern des gelesenen Inhalts mit 0x00000f00

3. Zurückschreiben des Ergebnisses in das Register

Manche Prozessoren (z.B. die Atmel AVRs) fassen diese drei Aktionen zu
einem Befehl zusammen. Dadurch wird die Ausführung etwas schneller und
atomar, trotzdem sind noch zwei I/O-Zyklen für die Registerzugriffe in
(1) und (3) erforderlich.

Bei den Atmel ARMs wird einfach die Maske 0x00000f00 in das
Setzregister geschrieben. Die I/O-Hardware sorgt dafür, dass alle
Registerbits, deren zugehörige Maskenbits 0 sind, nicht geändert
werden. Dadurch entfällt der anfängliche Lesezugriff.

Sollen allerdings auf einen Schlag alle 32 Bits geschrieben (einige
davon gesetzt, die restlichen gelöscht) werden, kommt das klassische
Verfahren mit einem Schreibzugriff aus, während man bei den Atmels
ARMs erst über das Setzregister die 1-Bits, danach über das
Löschregister die 0-Bits schreiben muss. Deswegen kann das
Output-Datenregister über PIO_ODSR auch direkt beschrieben werden.

> soll eine 1 am Ausgang sein, muss das PIO_SODR Register gesetzt
> werden; wenn eine 0 am Ausgang sein soll, dann das PIO_CODR mit
> einer 1 ansprechen?

Richtig. Und wie oben geschrieben, können speziell beim
Output-Datenregiester auch alle 32-Bits auf einmal über PIO_ODSR auf
beliebige 0/1-Werte gesetzt werden.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd Schuster wrote:
> sorry, ich schreibe von den ARM7 µController von Atmel...

Die ARM sind keine gute MC-Architektur für Steuerungen, da sie keine 
Bitbefehle haben.
Auch haben sie keine Befehle, um schnell mal Interrupts zu sperren.


Durch die 32Bit Breite ist es aber sehr warscheinlich, daß verschiedene 
Pins verschieden verwendet werden, z.b. auch in Interrupts.

Ohne Bitbefehle muß man aber ein Register lesen, ändern, zurückschreiben 
und das geht nicht atomar, d.h. ein Interrupt kann dazwischen hauen und 
das Chaos ist perfekt.
Man bräuchte dann für jeden einzelnen Bitbefehl riesige Codemonster.

Daher der Ausweg, daß man Bits setzen oder löschen kann ohne vorheriges 
Lesen. Man muß dann keine Interrupts disablen.


Peter

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.