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


von Bernd S. (mms)


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

von Peter D. (peda)


Lesenswert?

Du kannst in Deinem FPGA alles so machen, wie Du lustig bist.

Wenn ein Register reicht, nimmste eben nur eins.


Peter

von yalu (Gast)


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.

von ozo (Gast)


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.

von Bernd S. (mms)


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

von Andreas K. (a-k)


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

von ARM-Fan (Gast)


Lesenswert?


von Bernd S. (mms)


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

von yalu (Gast)


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.

von Peter D. (peda)


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

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.