Gast
#3047692
wieso funktioniert das nicht
1 | |
2 | |
3 | |
4 | |
will das UART initialisieren debugger meldet immer Operand 1 out of Range
|
Anzeige
|
UART, Assembler , ATmega328P
Gast
#3047692
wieso funktioniert das nicht
will das UART initialisieren debugger meldet immer Operand 1 out of Range
Gast
#3047724
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
Gast
#3054167
Jetzt meldet er das sbis nict funktioniert wieso?
Gast
#3054191
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.
Gast
#3054194
SO steht es aber im Datenblatt was kann ich sonst machen 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”.
Gast
#3054207
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
Gast
#3054210
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.
Gast
#3054216
Jetzt kommt immer die Fehlermeldung invalid Register 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.
Max schrieb: > Jetzt kommt immer die Fehlermeldung invalid Register Und wie sieht dein Code dazu aus? 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
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.
Gast
#3054260
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. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|