Forum: Mikrocontroller und Digitale Elektronik Brauche Hilfe bei SRAM-Programmierung


von Permanentmagnet (Gast)


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.

von jornbyte (Gast)


Lesenswert?

ldi r26,0x0060     ; Set X low byte to 0x0060
sollte so sein
ldi r26,0x60     ; Set X low byte to 0x0060
mit st X+, bla machste nach dem schreiben ein increment, prüfe das mal
beim ld (lds).

von Permanentmagnet (Gast)


Lesenswert?

gibts da eine Webseite wo ein Beispiel näher beschrieben ist? Bis jetzt
hab ich nur das benutzt:
http://www.avr-asm-tutorial.net/avr_de/beginner/sram.html

von Florian (Gast)


Lesenswert?

Hi

Kannst du mehr von deinem Programm posten, dann könnte man eher was
sagen.

Gruß Florian

von Florian (Gast)


Lesenswert?

Probiermal so:

ldi r26,low(0x0060)
ldi r27,high(0x0060)

von Permanentmagnet (Gast)


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

von Florian (Gast)


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

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
Noch kein Account? Hier anmelden.