Forum: Mikrocontroller und Digitale Elektronik UART, Assembler , ATmega328P


von Max (Gast)


Lesenswert?

wieso funktioniert das nicht
1
ldi r16, 0x68
2
out UBRR0L , r16
3
ldi r16, 0x00
4
out UBRR0H , r16
will das UART initialisieren debugger meldet immer
Operand 1 out of Range

von Spess53 (Gast)


Lesenswert?

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

von Max (Gast)


Lesenswert?

1
start:
2
    sbis UCSR0A, UDRE0
3
    rjmp start
4
    ldi r16, 0x4D
5
    sts UDR0 , r16
Jetzt meldet er das sbis nict funktioniert wieso?

von Uwe (Gast)


Lesenswert?

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.

von Max (Gast)


Lesenswert?

SO steht es aber im Datenblatt was kann ich sonst machen

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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”.

von MWS (Gast)


Lesenswert?

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:
1
LDS Rxx, Register_ausserhalb_IO
2
SBRS Rxx, Bitnummer

von Karl H. (kbuchegg)


Lesenswert?

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

von amateur (Gast)


Lesenswert?

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.

von Max (Gast)


Lesenswert?

Jetzt kommt immer die Fehlermeldung invalid Register

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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”.

von Karl H. (kbuchegg)


Lesenswert?

>  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.

von Karl H. (kbuchegg)


Lesenswert?

Max schrieb:
> Jetzt kommt immer die Fehlermeldung invalid Register

Und wie sieht dein Code dazu aus?

von Karl H. (kbuchegg)


Lesenswert?

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.

von amateur (Gast)


Lesenswert?

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.

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.