Hi Leute, Vielleicht kann mich ja mal jemand erleuchten. Ich habe ein Programm geschrieben wo ich diverse Schwellwerte, Rechenwerte, Vergleichswerte speichern möchte ( ca. 15 Werte). Da ich vorher mit Microchip PICs gearbeitet habe bin ich jetzt ein bischen verwirrt. Mein Programm benutzt 2 Timer ISRs (falls das wichtig sein sollte). Je nachdem in welche Register ich bestimmte Werte abspeichere gibts es fehlfunktionen (die Werte werden überschrieben oder erst garnicht gespeichert). Belege ich die Register-Variablenzuweisung neu dann funktioniert wieder ein anderer Teil nicht. Ich habe auch schon gemerkt das man nur mit bestimmten Registern Vergleichsoperatioen durchführen kann u.s.w. Mir scheint so als hätten manche Register bestimmte Funktionen und können NICHT frei verwendet werden. Jetzt habe ich einige Werte im RAM abgelegt und siehe da, mein Programm funktioniert schon besser. Allerdings kann ich ja anscheinend im RAM keine symbolischen Adressen mehr verwenden... (das ist sehr lästig uns unübersichtlich) Welche Register kann ich denn jetzt wirklich frei verwenden ??? Gruß Alex
...Als beispiel wie dämlich das ist: So sieht meine 3-fach verschachtelte Warteschleife aus: WAIT1: ldi temp,8 sts $0004,temp LOOP3: ldi temp,255 sts $0005,temp LOOP2: ldi temp,255 sts $0006,temp LOOP1: lds temp,$0006 dec temp sts $0006,temp brne LOOP1 lds temp,$0005 dec temp sts $0005,temp brne LOOP2 lds temp,$0004 dec temp sts $0004,temp brne LOOP3 ret
Von welchem MC sprechen wir denn? Falls AVR, dann sind nur die Register 16-31 mit allen Befehlen nutzbar, bei den Registern 0-15 gibt es Einschränkungen. Die Register 26 bis 31 können paarweise als 16-Bit-Zeiger (X, Y, Z) verwendet werden. Bei einigen Typen kommen dann noch Sonderverwendungen für Hardware-Multiplikation usw. hinzu. Genaues steht im Datenblatt. Gruß, Frank
schau mal ins datenblatt des jeweiligen mc nach, Reg 0-15 sind einfache register, 16 bis 32 sind bessere register weil sie wie I/O register behandelt werden können und ab 24 sind es besondere register z.B. für rechenopereationen und son zeugs, so in etwa sollte es sein, hab auch nicht viel ahnung davon
Klar kannst Du Variablen Namen zuweisen: .dseg .org 0x60 ;Beginn des RAM Rx_Buff: .byte 64 var1: .byte 1 var2: .byte 1 .cseg Nur R0 und R1 werden als Ergebnis des LPM oder MUL Befehls verändert. Alle anderen erst dann, wenn Du sie benutzt. Wenn also ein Register überschrieben wird, dann hast Du es eben auch in einer anderen Funktion mit benutzt. Auf R0..R15 lassen sich die Befehle mit "I" am Ende nicht benutzen (LDI, SUBI usw.). Du solltest Dir aber ruhig erst mal das Instructionset der AVRs ansehen. Peter
OK, danke euch... das hat mir denke ich mal geholfen. Ich muß trotzdem sagen das die Datenblätter von Microchips MCUs doch um einiges übersichtlicher und verständlicher sind als die von ATMEL. Gruß Alex
Na, ja, AVR und PIC sind doch sehr unterschiedlich und wenn Du mit PICs vertraut bist, dann sieht das Datenblatt des AVR vielleicht erst einmal verwirrend aus. Aber bisher sind mir die AVR-Datenblätter noch keine Antwort schuldig geblieben. Was findest Du denn unübersichtlich/unverständlich? Gruß, Frank
Naja, vielleicht war ich ein bissel voreilig mit dieser Aussage. Allerdings was man bei der Benutzung der Register zu beachten hat (wie Peter es oben beschreibt), finde ich nicht im Datenblatt. Zumindest nicht so das man es direkt versteht. Mir fehlen so die "Achtung" Hinweise. Bei den Timern werden erst mal alle Funktionen aufs kleinste Detail auseinander genommen und am Ende steht dann welche Register für was zuständig sind. Ich hätte gerne lieber so Rubriken wie "Timer als Counter" und "Timer als PWM Generator" oder so... Dann wußte ich ebenfalls nicht wie ich das interne RAM lesen und beschreiben konnte. Das man dafür extra Befehle braucht, hätte man ja auch mal erwähnen können. Für euch ist das mit Sicherheit selbstverständlich, aber als Ein- b.z.w. Umsteiger steht man erstmal im dunkeln. Ich muß ganz ehrlich sagen, ich hatte das Datenblatt zuerst nur als PDF im Rechner. Wenn man sich das Teil mal ausdruckt, läßt sich schon wesentlich besser damit arbeiten. Gruß Alex
Wenn Du den Text von Peter Dannegger genau anguckst, dann sollte Dir auch auffallen, daß der nutzbare SRAM erst bei 0x0060h beginnt. In die Adressen 0x00h-0x60h werden die Register R0-R31 und sämtliche I/O-Steuerregister gemapped, was für manche Zwecke ganz nützlich sein kann (z.B. mit einer Schleife alle Register R0-R31 auf den Stack retten). Das dürfte erklären, warum bei Deinem Codebeispiel so lustige Sachen passieren können. MfG Olaf
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.