Forum: Mikrocontroller und Digitale Elektronik AVR Studio, externer SRAM & ATmega 128.


von AVRli (Gast)


Lesenswert?

Hallo,

nachdem ich nun endlich den SRAM am ATMEL dran hab würde ich den auch
gerne nutzen... nun RTMF gemacht und folgenes gemacht.

;---Extended SRAM---
  ldi wrH,(1<<SRE)        ;enable XRAM interface
  out MCUCR,wrH
  ldi wrH,0          ;no waitstate
  sts XMCRA,wrH
  ldi wrH,(1<<XMBK)        ;BusKeeper ON!, volle 60kb
  sts XMCRB,wrH

Tcho und nun dachte ich das ich meine Variablen einfach vergrößern
kann.

.equ BUF_SIZE = 40960

.dseg
ramB_STREAM:    .Byte BUF_SIZE


Nun sagt das AVR Studio bei dem compilieren...

[.dseg] 0x000100 0x00a766      0  42598  42598    4096 1040.0%  OVER


Das hatte ich mir ganz anders vorgestellt ;-)
Nun weiß ich nicht ob es überhaupt funktioniert... :-(

Hat jemand nen Tip?
Vielen Dank im Voraus!

MfG AVRli...

von Michael U. (Gast)


Lesenswert?

Hallo,

ja funktioniert so, ich habe auch noch nicht rausgefunden, wo ich dem
AVR-Studio-Assembler mitteilen kann, daß es externes Ram gibt...

Gruß aus Berlin
Michael

von A.K. (Gast)


Lesenswert?

Du teilst zwar der Maschine mit, dass mehr RAM da ist, aber nicht dem
Studio.

Siehe Project/Configuration Options/Memory Settings.

von JojoS (Gast)


Lesenswert?

lt. Asm Doku fehlt eine .org Anweisung, guck mal in die Hilfe zu dieser
Anweisung:

DSEG                ; Start data segment

.ORG 0x120           ; Set SRAM address to hex 120
variable: .BYTE 1    ; Reserve a byte at SRAM adr. 0x120

von Michael U. (Gast)


Lesenswert?

Hallo,

@A.K.

gibt es nicht bei meinem Assembler-Projekt, gibt nur die
Assembler-Options.

Bei GCC-Projekten kann ich ihm Speicher ansagen...

Gruß aus Berlin
Michael

von AVRli (Gast)


Lesenswert?

Danke für die Antworten,

nun ich glaub das Teil arbeitet hier noch nicht richtig.
Das Programm semmelt ständig ab... kram mal eben mein Oszi raus mal
sehen ob man was sieht ob der Chip überhaupt angesprochen wird.

Ist ein 62C5181024...

Ich verwende nur ASM also ganz "primitiv". :-D

MfG AVRli...

von AVRli (Gast)


Lesenswert?

:-/

Also ich hab nun mehrmals die Verdrahtung gecheckt, am PIN PG2 Zappelt
es wie verückt. Soweit ok wenn ich das Datenblatt richtig verstanden
habe.

Aber nun kommt es... ich sehe das was im externen SRAM abgelegt wird,
leider schmiert das Programm noch immer mal wieder ab.

Das verstehe ich nicht ganz, vielleicht doch ein bischen warten?

Verwende ein SRAM mit 70ns Zugriffzeit und 8MHz Takt am ATMEL...

Gruß AVRli...

von AVRli (Gast)


Lesenswert?

Puhh lange genug hats gedauert,

rennt soweit erstmal, nur der kleine Schönheitsfehler mit der
falschenAnzeige im AVR Studio.

Wenn man das nun noch anpassen könnte das wäre super.

Achja und der Grund warum es hier nicht lief war diesmal kein HW Fehler
sondern die "Zauberzeilen" heißen ja jetzt...

  ldi wrH,High(XRamEnd)
  out sph,wrH
  ldi wrH,Low(XRamEnd)
  out spl,wrH            ;Stack initialisiert

...und NICHT...

  ldi wrH,High(RamEnd)
  out sph,wrH
  ldi wrH,Low(RamEnd)
  out spl,wrH            ;Stack initialisiert

...denn nun findet der ATMEL den weg vom Stack auch zurück.... :-D

MfG AVRli...

von Hannes L. (hannes)


Lesenswert?

Du willst doch nicht etwa den Stack ins externe SRAM legen?
Der Stack muss nicht am Ende des RAM-Bereiches liegen, Du kannst auch
den Bereich hinter dem Stack als RAM für Variablen (und Arrays) nutzen.
Denn die XMEM-Zugriffe sind langsamer als die Zugriffe auf internes
SRAM, das würde ich dem Stack nicht antun.

...

von Michael U. (Gast)


Lesenswert?

Hallo,

genau, Stack auf das interne Ramende, Begin meine Reservierungen an den
Anfang des externen Ram.


  ldi wrH,High(RamEnd)
  out sph,wrH
  ldi wrH,Low(RamEnd)
  out spl,wrH            ;Stack initialisiert

.dseg

.org BEGIN_XRAM         ; weiß jetzt nicht, wo der beim Mega128
anfängt

MEINE_BUFFER:  .byte xyz

Meist lege ich größere Buffer auf glatte Grenzen, dann kann man oft
Rechnerei mit dem Low-Byte sparen, wenn es ohnehin Vielfache von 256
Byte sind.
Dazu gibt es ja .org schließlich. ;)

Gruß aus Berlin
Michael

von Läubi (Gast)


Lesenswert?

Wegen der Anzeige... ggf kanst du dir ja ein "eigenes" Device machen?
Ich glaub Studio holt sich die Daten einfach aus den XML files, da
kannste dann ja deinen Extraspeicher eintragen :)

von AVRli (Gast)


Lesenswert?

Danke für Eure Hilfe,

ich glaub nun hab ich's gerafft ;-)
Also mein Buffer kommt in den EXT SRAM mit...

.org 0x1100
ramB:    4096

und der Stack doch ins intern SRAM mit...


  ldi wrH,High(RamEnd)
  out sph,wrH
  ldi wrH,Low(RamEnd)
  out spl,wrH            ;Stack initialisiert


in der DeviceDatei "...\AvrAssembler2\Appnotes\m128def.inc"
habe ich die Einträge gefunden...

#pragma AVRPART MEMORY PROG_FLASH 131072
#pragma AVRPART MEMORY EEPROM 4096
#pragma AVRPART MEMORY INT_SRAM SIZE 4096
#pragma AVRPART MEMORY INT_SRAM START_ADDR 0x100


Wie groß ist den "INT_SRAM SIZE" nun wenn man einen 64k Externen SRAM
dran hat? Könnte man dann dort ändern... ;-)

Gruß AVRLi...

von AVRli (Gast)


Lesenswert?

Ach eins noch... blöde Frage warscheinlich aber was ist mit dem
Waitstate? Wann weiß man das man den einschalten muß und wann nicht?

Kann man sich das ausrechnen? Hab nun 8MHz CPU Takt und nen Speicher
mit 70ns Zufriffszeit.

Gruß AVRli...

von Läubi (Gast)


Lesenswert?

70ns sollten für bis zu 14Mhz ohne Waitstates passen.
Du kannst die "Megaherze" relativ leicht ausrechen über
1/(Zugriffszeit in ns * 10^-3) wenn ich mich jezt nicht vertan habe.

64kx8 SRAM= 64.000 bytes (mußt im DB gucken obs 64k bits oder 64kx8
sind, im erstenfalle vorher durch 8 teilen)
Also INT_SRAM SIZE=644096

von Michael U. (Gast)


Lesenswert?

Hallo,

Zugriffszeit ausrechnen geht schon. Datenblatt des Rams nehmen und
Zugriffsdiagramme für Lese- und Schreibzugriff suchen.
Datenblatt des AVR nehmen und Zuklusdiagramm des externen
Speicherinterfaces suchen. Beides solange sinnend anstarren, nis man zu
verstehen beginnt, was die da jeweils wollen. ;) Sollte ein Scherz sein!
:)

Zykluszeit des AVR beim gegebenen Takt berechnen (1/Takt in MHz gibt
µs), also 1/8 = 0,125 µs oder 125nS. Jetzt kann man im AVR-Diagramm die
jeweiligen konkreten Zeiten (Daten-Vorhaltezeit bis /RD oder /WR oder
/CE, Datenhahtezeit nach /RD, /WR, /CE, Adresshaltezeit usw. usw.
ausrechnen und mit der Tabelle des Herstellers vergleichen. Solange
ALLE Zeiten kleiner als max und größer als min vom Hersteller, stimmt
alles. Das ist die "ganz ordentliche" Methode. Zum Überschlag reicht
es, die Zyklus-Zeit als Vergleich zu nehmen.
Bei 16MHz wären es nur 62,5ns, das wäre also bei einem 70ns-Ram sehr
knapp.
Stimmt aber auch nur teilweise, weil das Ram-Interface des AVR mehrere
Systemtakte für einen Zyklus benötigt...

So, genug Verwirrung gestiftet. :)

Gruß aus Berlin
Michael

von AVRli (Gast)


Lesenswert?

Hi und Danke!

So sieht schon gut aus! ;-D

@Michael
Das ist doch mal eine Aussage lieber zu genau als "muste mal im DB
gucken". Es gibt Sachen da macht es keinen Unterschied ob ich da
reinschaue oder nicht, die Zusammenhänge müßen einem klar sein, das sid
sie jetzt! Die Fausformel sag mir das ich also nichts zu befürchten hab
und wenn ich mal höher wie 8 MHz gehe heist es evtl. aufpassen.


qLäubi
Ich hab im ASM file nun eine Zeile eingetragen...
gleich nach dem include....

.nolist
.include "m128def.inc"
.list
#pragma AVRPART MEMORY INT_SRAM SIZE 65536

Nun zeigt das AVR Studio die Speicherausnutzung wieder "ordendlich"
an ob der Wert stimmt kann ich nicht 100%tig sagen...
bei 4k intern stand ja 4096 drin.

Bin der Meinung gelesen zu haben das man den internen RAM nicht mehr zu
100% utzen kann. Bin mir aber auch nicht ganz sicher bei der Aussage.

MfG AVRli...

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.