www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik push/pop ins SRAM ???


Autor: UBoot-Stocki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

auf die Gefahr hin, dass Ihr mich jetzt zerfleischt - Ich finde wirklich 
nichts !!!

Frage: Wie kann ich aus einem Register einen Wert im SRAM ablegen zur 
Zwischenspeicherung. Ich suche so eine Art push/pop ins RAM ...


Gruß

Uboot-Stocki

Autor: Johannes Raschke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiß ja nicht, welchen Controller Du benutzt, aber bei meinem 2313 
gibt es push und pop, wie beim x86 auch... Aber meistens dürften doch 
die Register ausreichen, oder?

Autor: mikki merten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@UBoot-Stocki
Klar kann dein TINY26 push und pop wie alle AVR mit internem SRAM. Steht 
auch auf Seite 127 des Datenblattes. Nähere Erläuterungen zu den 
Befehlen findest du im AVR Instruction Set.

Autor: Main666 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe die Frage ein wenig anders verstanden als meine beiden 
Vorredner.
Push Pop ist sehr wohl bekannt aber du willst einen Registerinhalt an 
eine bestimmte Speicherstelle im RAM ablegen, oder ?
Wenn Du ihn von dort aber nur wieder wegpopst gibt es wohl keinen Grund 
nicht den Stack zu verwenden.

Oder liege ich da jetzt falsch ? Bitte die Frage noch ein wenig 
konkretisieren :D


Gruß Main666

Autor: mikki merten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@main666
dann wird's ja noch simpler, dafür gibt's ja die Befehle sts und lds.

Autor: UBoot-Stocki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ähm,

dass es die Befehle push und pop für den Stack gibt ist klar. Ich möchte 
eine Art Applikationsstack implementieren. Den normalen Stack kann ich 
nicht verwenden weil dort ja auch Rücksprungadressen abgelegt werden. In 
einem Unterprogramm würden daher die im Hauptprogramm abgelegten Werte 
nicht mehr zugreifbar sein. Daher die Idee mit dem Applikationsstack.
Nur wie ?

@Johannes:
Also ich habe desöferen das Problem, daß meine Register nicht ausreichen 
bzw. ich "Klimmzüge" machen muss damit sie reichen.

@Mikki:
sts/lds: Sind wohl die Befehle. Nur wo kann man da hin speichern ohne 
was (z.B. den Stack) kaputt zu machen ???

Zu Controllern: Ich Arbeite am liebsten mit ATTiny26 weil der keine 
externen Bauteile braucht - Manchmal auch mit 90S4433 bzw. jetzt Mega8

Gruß und Danke für die Geduld mit meiner unpräziser Frage :-)

Uboot-Stocki

Autor: mikki merten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einen eigenen Applikations-Stack kannst du z.B. mit den 
Index-Registernpaaren X,Y,Z verwalten.
Wenn es allerdings nur darum geht ein paar Werte zu speichern dan reicht 
auch die Kombination LDS/STS und man benutzt die unteren Adressen ab $60 
der SRAM, der Stack wächst ja vom oberen RAM Ende nach unten.

Autor: UBoot-Stocki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

das habe ich nicht verstanden. Mit dem Befehl ST kann ich (abh. vom 
"Zeiger" in Z) in das RAM schreiben, das ist klar.

Im Programm ist der Stack mit:

    ldi temp, RAMEND
    out SPL, temp

auf das RAM-Ende festelegt. Der 4433 hat m.E. 255 Byte RAM, d.h. der 
Stackpointer steht bei $FF und wird kleiner - Auch klar.

Aber warum soll ich dann bei $60 anfangen ? Naiver Weise hätte ich bei 
$00 begonnen ... ?!?!

Gruß

Uboot-Stocki

Autor: mikki merten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der 4433 hat genau wie der TINY26 128 Byte SRAM.
An Adresse 00-1F hex liegen die Register R0-R31 gefolgt vom I/O-Bereich 
20-5F hex. bei einigen größeren MEGAs 162/64/128 geht dieser Bereich bis 
FF hex. Darauf folgt dann das interne SRAM welches somit bei 60 bzw. 100 
hex. beginnt.

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und der Sinn der Sache ist, möglichst viel im RAM unterbringen zu 
können. Datenadressen wachsen von unten (Anfang des RAMs) nach oben, der 
Stack vom RAM-Ende nach unten. Man kann auf diese Weise den gesamten RAM 
nutzen, aber aufpassen: läuft der SP in den Datenbereich, gibts Salat. 
Geschützte Speicherbereiche gibt es nicht, auch kann kein Compiler oder 
Assembler erkennen, ob da ein Konflikt lauert.
Einfach die max. Aufruftiefe von Unterprogrammen incl evtl. push, dazu 
dann noch die ISR (falls nicht verschachtelt, dann kommen die anderen 
ISR auch noch dazu), die die meisten push benutzt, dann hast du die max. 
Stacktiefe und damit weißt du, wieweit du den RAM für Datenspeicherung 
benutzen darfst. In der Simulation sind sog. stack-end-marker recht 
nützlich, da sieht man dann, wie tief der SP tatsächlich mal gekommen 
ist.

Autor: UBoot-Stocki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ähmm,

wer lesen kann ist klar im Vorteil ... Tatsächlich haben der 4433 und 
der Tiny26 nur 128 Byte RAM. Dass die Register 0-31 im RAM liegen hätte 
mir eigentlich klar sein müssen :-] Der IO ist ebenfass dahin gemapped 
... Somit ist auch klar, warum ich bei $60 = 96 anfangen muß. Somit 
bleiben 32 Byte für meine Daten ("Applikationsstack") und den 
Controller-Stack.

Da wird es schon ganz schön eng ... Werde mal damit "rumspielen" ...

Nur so am Rande: Wie kompliziert ist es eigenlich was ins EEPROM zu 
schreiben ? Das könnte mit für Programmkonstanten/Parameter ja auch 
schon weiterhelfen ?!?!?

Gruß

UBoot-Stocki

Autor: Sebastian__ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi @ UBoot-Stocki,

warum bleiben dann mur 32byte?
dein Ram fängt bei $0060 an, und geht bis $0060+128, somit hast du 128 
byte frei nutzbaren Ram.
Du musst halt nur auf den Stack aufpassen damit du nicht in den 
Datenbereich kommst oder, dazu kannst du dir ja ne Adreese anlegen wo du 
dir merkst wo du im Ram aktuell bist und vergleichst diese mit deinem 
SP. Wenn SP und Ram gleich sind oder fast gleich, musst du dir nur ne 
Exception bedingung aussuchen ... vielleicht einen Reset des µC?
Um die x,y,Z Pointer nicht zu verschwenden würde ich mir die ersten 
2-8byte fest für einen Parameter Stack vergeben (startadresse 
,endadresse,pointer),.. es ist übrigens ne gute möglichkeit um an 
subroutinen mit einem Parameter Stak daten zu übergeben.

MfG
Sebastian

PS: es ist ja irrsinn alle 32 register immer sichern zu wollen,.. 
arbeitest du vielleicht bei MS?

Autor: Sebastian__ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.. noch was vergessen,.. das ee is sehr einfach zu lesen bzw. 
schreiben,.. fast einfacher als diese ganze ADC geschiche,.. siehe 
Codesammlung oder Atmel Appnotes. Da findest du genug beispiele.

;************************************************************
;* FUNCTION
;*  EE_write
;* DESCRIPTION
;*  Write to every address in the EEPROM and
EE_write:
    sbic  EECR,1      ;EEWE
    rjmp  EE_write      ;waits until EEPROM ready

    out  EEARH,YH    ;outputs address high
    out  EEARL,YL    ;output address low
    out  EEDR,temp0    ;outputs data
    sbi  EECR,2      ;EEPROM Master Write Enable( EEMWE)
    sbi  EECR,1      ;EEPROM Write Enable(EEWE)
    ret
EE_write_1:
    sbic  EECR,1    ;EEWE
    rjmp  EE_write_1  ;waits until EEPROM ready

    out  EEARH,YH    ;outputs address high
    out  EEARL,YL    ;output address low
    out  EEDR,temp1    ;outputs data
    sbi  EECR,2      ;EEPROM Master Write Enable( EEMWE)
    sbi  EECR,1      ;EEPROM Write Enable(EEWE)
    ret
;************************************************************



;************************************************************


;************************************************************
;* FUNCTION
;* EE_read
;* DESCRIPTION
;*  Reads the  EEPROM and test's that data equals adress
EE_read:
    sbic  EECR,1    ;skip if EEWE clear
    rjmp  EE_read    ;Waits until EEPROM ready
    out  EEARH,YH    ;output address high
    out  EEARL,YL    ;output address low
    sbi  EECR,0      ;set EERE (Read-strobe)
    in  temp0,EEDR    ;inputs data
    ret

EE_read_1:
    sbic  EECR,1    ;skip if EEWE clear
    rjmp  EE_read_1    ;Waits until EEPROM ready
    out  EEARH,YH    ;output address high
    out  EEARL,YL    ;output address low
    sbi  EECR,0      ;set EERE (Read-strobe)
    in  temp1,EEDR    ;inputs data
    ret
;************************************************************

Autor: UBoot-Stocki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Sebastian,

"es ist übrigens ne gute möglichkeit um an subroutinen mit einem 
Parameter Stak daten zu übergeben."

Genau darum geht es. Ich habe ein Unterprogramm, welches verschiedene 
Parametrisierungen braucht. Diese möchte ich im RAM ablegen um Register 
zu sparen ...

Ich arbeite nicht bei MS. Bin ich deshalb gar nicht auf die Idee 
gekommen, alle Register im RAM zu sichern?

Gruß

UBoot-Stocki

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.