Brauche Hilfe bei SRAM-Programmierung

Gast #270918
Lesenswert?
• ▲
▼
Servus Leute

ich kriegs einfach nicht hin, mit dem X bzw. X+ automatisiert das SRAM
zu beschreiben.
AVR: 90S8515 ohne ext. SRAM
SRAM Adresse beginnt bei 0x0060

Hier die Aufgabe:

sobald eine Taste gedückt wurde (das funktioniert), soll folgendes
geschehen:
Register R20 soll in erstes SRAM Byte gespeichert werden (0x0060)
Register R21 soll in nächstes SRAM Byte gespeichert werden (0x0061)
Ende

Sobald die Taste wieder gedrückt wurde (Entprellt hab ich schon):
Register R20 soll in nächstes SRAM Byte gespeichert werden (0x0062)
Register R21 soll in nächstes SRAM Byte gespeichert werden (0x0063)
Ende

usw.

Habs versucht mit

init:
  clr r27     ; Clear X high byte
  ldi r26,0x0060     ; Set X low byte to 0x0060
main: (als Unterprogramm)
  st X+, R20
  st X+, R21



Nur wenn ich dann mal einen Wert z.B. 0x0063 anzeigen lasse, ist da was
falsches drin.
Gast #270923
Lesenswert?
• ▲
▼
ok danke, bringt mich schon nen stuck weiter

wie kann ich denn abfragen ob das Ende des SRAMs erreicht wurde?

Mein Code ist dieser:

loop:
  ld temp, X+      ; Bytes aus SRAM
  cpi r26, 0x025F      ; Ende SRAM ?
        brne ungleich
        ret

ungleich:
; ..weiter auslesen und per UART senden...
        ...
        rjmp loop
Gast #270924
Lesenswert?
• ▲
▼
Hi, bis ans Ende des S-Rams würde ich nie gehen, weil du dann Probleme
mit den Rcall Befehlen hast. Am Ende des S-Rams wird ja der Stack
abgelegt.

Du könntest eventuell hergehen, und den Stack auf den Programmanfang
legen.

z.B.:

ldi spl,low(0x0070)
ldi sph,high(0x0070)

Somit wäre der Stack am Anfang des S-Rams.

und im Programm würde es dann so ausschauen:

loop:
  ld temp, X+      ; Bytes aus SRAM
  cpi xl,low(ramend)      ; Ende SRAM xl?
        brne ungleich
  cpi xh,high(ramend)     ;Ende SRAM xh?
        brne ungleich
        ret

ungleich:
; ..weiter auslesen und per UART senden...
        ...
        rjmp loop

Du kannst nicht immer nur das lowbyte des Pointers abfragen, da das
S-RAM vermutlich größer als 256 bytes ist. Dadurch gibt es ein low und
ein highbyte. 0x0112 wäre dann in r27 "10" und in r26 "12".

Ich hoffe, du verstehst mich.


Gruß Florian

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.