Hi
>wieso funktioniert das nicht
Weil die Adressen von UBRRH und UBRRL nicht mit in/out erreichbar sind.
Nimm lds/sts. Außerdem muss bei Doppelregistern erst das H-Register
beschrieben werden. Beim Lesen erst das L-Register.
MfG Spess
sbis = (S)kip if (B)it in (I)o-Register is (S)et
Wobei die Betonung auf IO-Register liegt !
Denn :
> Weil die Adressen von UBRRH und UBRRL nicht mit in/out erreichbar sind.
Ja, steht tatsächlich drin.
Aber da steht auch noch das hier:
Note: 1. See ”About Code Examples” on page 7.
For I/O Registers located in extended I/O map, “IN”, “OUT”, “SBIS”,
“SBIC”, “CBI”, and “SBI” instructions must be replaced with instructions
that allow access to extended I/O. Typically “LDS” and “STS” combined
with “SBRS”, “SBRC”, “SBR”, and “CBR”.
Max schrieb:> SO steht es aber im Datenblatt was kann ich sonst machen
Satzzeichen verwenden ?
In den Atmel Datenblättern stehen immer dieselben Beispiele, auch wenn
sich das betreffende Register beim beschriebenen Controllertyp aufgrund
der Adressverteilung außerhalb des IO-Bereichs befindet.
Dann wird vom geneigten Programmschreiberling erwartet, dass er diese
IO-Begehle durch das entsprechende Äquivalent ersetzen kann, also:
Max schrieb:> SO steht es aber im Datenblatt
Ist ein Fehler im Datenblatt, der beim Weiterkopieren des Textes aus dem
Mega8-Datenblatt ins Mega328-Datenblatt entstanden ist und bei Atmel
nicht bemerkt wurde.
> was kann ich sonst machen
dasselbe was du auch beim Rest machst.
Du kannst SBIS, CBIS nicht auf diese I/O-Register anwenden, so gern du
das auch möchtest. Also musst du dir den I/O-Registerinhalt mittels LDS
in ein normaler Register holen und dort kannst du dann das
interessierende Bit testen. zb mit einem SBRS
Die Befehlsreferenz enthält jede Menge an Befehlen. Überlege Dir genau,
was der Befehl macht und bilde ihn einfach nach.
Die Leute bei Atmel arbeiten genau wie Du: "Kopieren geht über
studieren". Ruck-Zuck ist das Handbuch zum neuen Prozesssor fertig ob
das ganze auch geht interessiert doch keinen.
Bei verschiedenen Prozessoren arbeiten diese Befehle klaglos. Wurde
aber, besonders bei neueren Prozessoren das Register verschoben, liegt
es nicht mehr im I/O-Bereich. Damit es aber nicht langweilig wird, wurde
der Name beibehalten.
Karl Heinz Buchegger schrieb:> Ist ein Fehler im Datenblatt, der beim Weiterkopieren des Textes aus dem> Mega8-Datenblatt ins Mega328-Datenblatt entstanden ist und bei Atmel> nicht bemerkt wurde.
Nein, ist kein Fehler, die Atmel-Leute sind einfach nur zu faul, die
Beispiele anzupassen. Stattdessen kopieren sie einfach folgenden
Wortlaut mehrfach ins Datenblatt:
For I/O Registers located in extended I/O map, “IN”, “OUT”, “SBIS”,
“SBIC”, “CBI”, and “SBI” instructions must be replaced with instructions
that allow access to extended I/O. Typically “LDS” and “STS” combined
with “SBRS”, “SBRC”, “SBR”, and “CBR”.
> was kann ich sonst machen
Schau ins Datenblatt deines Prozessors ins Kapitel "Register Summary".
Alle Register, die in der Spalte "Address" nur eine Zahl haben (die dann
in Klammern steht), kannst du nicht mit IN, OUT, SBI, CBI, SBIS, SBIC
erreichen sondern du musst immer den Umweg über STS bzw. LDS gehen und
eine 'Ehrenrunde' über ein normales Register drehen.
Karl Heinz Buchegger schrieb:> Max schrieb:>> Jetzt kommt immer die Fehlermeldung invalid Register>> Und wie sieht dein Code dazu aus?
Du wirst doch nicht ... oder doch?
Im Beispiel von MWS
1
LDS Rxx, Register_ausserhalb_IO
2
SBRS Rxx, Bitnummer
steht das xx für eine von dir zu wählende Zahl. Also r16 oder r18 oder
....
Da hier keiner weiß, welche Register du im restlichen Code benutzt und
welche Register gerade frei sind, hat MWS die übliche Konvention benutzt
und xx als Platzhalter für eine von dir einzusetzende Information
benutzt. Selbstverständlich gibt es kein Register namens Rxx.
Der Befehlssatz der Atemls ist ausgesprochen kompakt. Dies hat aber zur
Folge, dass nicht alle möglichen Speicherstellen mit einem einfachen
Befehl erreicht werden können.
Dazu sind dann Befehle mit expliziter Adressangabe vonnöten.
Die ersten paar Register liegen im sogenannten I/O-Bereich. Diese können
mit Einzelwortbefehlen, implizit adressiert werden. Alle anderen
Register müssen mit ihrer vollen Adresse, oder mittels der
Zeigerregister angesprochen werden.
Schau Dir mal die Instruction set summary an. Da kann man im wahrsten
Sinne des Wortes "sehen", warum die "Reichweite" der Befehle beschränkt
ist.
Darüber hinaus solltest Du mal einen Blick ans Ende der
Prozessordokumentation werfen. Dort sind alle internen Register mit
ihrer "Lage" im Adressraum aufgeführt. Register im I/O-Bereich sind auch
entsprechend mit ihrer Alternativadresse aufgeführt.