Ich versuche momentan eine Testsoftware auf einem uC in Assembler zu schreiben. Mein Problem ist das ich die Ports F ung G ansprechen und verändern will, und das aber nicht hinbekomme. Kennt sich jemand mit den Ports gut aus?? Ich habs mit verschiedenen Befehlen versucht (sbi, sbr, ldi, lds sts, andi, ori), aber ich bekomme immer entweder den Fehler "Error:Operand out of range" oder "Error:Invalid Register) Wär super wenn mir da jemand helfen könnte...
Schau dir mal im Datenblatt die Verwendung der Ports an,lies (und versteh!) das Tutorial hier auf der Seite. IN und OUT sind die Befehle um auf die special-function register zu zugreifen.Auf welche genau und wie... Tutorial nachvollziehen,DATENBLATT angucken
ldi r16, 0xff sts ddrf, r16 das sollte klappen problem ist, dass sbi / out nicht in den 16 bit adressen schreiben kann, wo diese 2 ports liegen gruss
kenne den 128 zwar nicht, aber für gewöhnlich ist es out beim AVR. Deine BEfehle funktionen nur auf Registern nicht auf Ports. Gruß Philipp
verdammt seid Ihr schnell, als ich eben geschrieben hab, gab es noch keine Antwort :)
@Philipp nicht ganz!! Du kannst einen Port auch über sts ansprechen!! @Ronny solche Posts kannst du dir spahren. da ist es besser nichts zu sagen, und die klappe zu halten
> IN und OUT sind die Befehle um auf die special-function register > zu zugreifen. Nur die unteren 64. Darüber muß man mit lds/sts arbeiten. Das gilt unter anderem auch für PORTF und PORTG. Im Datenblatt steht aber auch deren Adresse.
Und pass auf, dass JTAG nicht per Fuse aktiviert ist! Da kriegst du dann auf den Pins die für JTAG da sind nichts raus. Außerdem muss AVCC angeschlossen sein, weil dann 2 Ports sonst nicht mit Spannung versorgt sind.
Wenn du das Ansprechen per lds/sts meinst: Das geht für alle Standardregister (r0 bis r31) und für sämtliche I/O-Register.
@Jens: 'Spahren' kann man es sich auch,alles mit probieren rausbekommen zu wollen.Sich erstmal die Grundlagen anzuschauen bevor man wild drauflos probiert hat noch keinem geschadet. Gerade zu dem Thema gibt es eine Menge Threads hier,obwohl alles prima im Tutorial erklärt wurde.Schade um die Zeit,wenn man immer wieder die selben Sachen erklären muss.
Rolf Magnus das passt doch bei allen registern, die der controller hat, bis auf die schreibgeschuetzten..
@Ronny da stimm ich dir zu, nur bei solchen Kleinigkeiten lohnt es nicht gross tips zu geben, da dauern die Diskusionen danach lännger, als die Antwort..
> das passt doch bei allen registern, die der controller hat, bis > auf die schreibgeschuetzten.. Ja, und?
Zur Erklärung: Der Mega128 hat (wie die meisten der 'großen' Megas) einen Extended I/O-Space. Der normale I/O-Space der AVRs endet bei der Adresse 0x5F (I/O-Register-Adresse 0x3F). Die dicken Dinger haben aber so viele Peripherie-Komponenten, dass dieser Adressbereich für die ganzen I/O-Register nicht mehr ausreicht und so ein Teil des (sonst als General Purpose SRAM verfügbaren) SRAM dazugenommen wird. Da die Befehle in und out aber die I/O-Register mit ihrer Register-Adresse (anstatt mit der absoluten Adresse) ansprechen und nur 6 Bit Platz für die Adresse haben, ist halt bei 0x3F (also absolut: 0x5F) Schluss und man muss die I/O-Register im Extended I/O-Space (ab absoluter Adresse 0x60) wie normale SRAM-Variablen mit sts und lds ansprechen. Deshalb haben diese I/O-Register auch keine Register-Adresse mehr, sondern es wird nur noch die absolute Adresse angegeben (siehe Register Summary im Datenblatt).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.