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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren