ATtiny4313 SPL SPH RAMEND

stinakovits

Mitglied
22. Apr. 2013
90
6
8
Kottingbrunn
Sprachen
  1. Assembler
Hallo zusammen,

hab grad ein Brett vor'm Kopf :oops:

Ich möchte mal den Stack an's SRAM Ende legen. Dafür gibt's das Stack Pointer Register SPL. Das SRAM endet bei RAMEND, welches mit 0x15f definiert ist. In's SPL passen aber nur 8 Bit, also 0xFF rein. Mir fehlt das SPH. Das gibt es laut Dokumentation gar nicht. Kann doch nicht sein?
 
Hi Manfred,

gute Frage :D

Möglicherweise ist ein Fehler im Datenblatt, bei dem kleineren Tiny2313 ist nur ein SPL vorhanden. Das reicht auch, weil hier RAMEND bei 0xDF liegt.
Eventuell wurde das Datenblatt hier für den neueren 4313 nicht richtig überarbeitet.

Wenn du das Definitionsfile für den 4314 verwendest, ist SPH wahrscheinlich vorhanden. Probiere es mal aus.

Dirk :ciao:
 
SPH sollte I/O-Adresse 0x3E sein.. RAMEND ist beim Tiny4313 0x015F, also 0x01 in SPH, und 0x5F in SPL.
Der Tiny initialisiert die beiden Register selbst beim Reset mit diesen Werten (= initial value).

Leider ist die Dokumentation des 2313A/4313 (immer noch) sehr ... lückenhaft aus der des Tiny2313 zusammenkopiert. Teilweise fehlen dann die entsprechenden Registerdefinitionen im Atmel Studio bzw in der entsprechenden Simulator-Basis.

Du verwendest Assembler und ein recht aktuelles Studio, korrekt?
Wenn Du ein fast leeres Programm (NOP) compilierst, müßte anschließend bei dependencies oder so die automatisch inkludierte Definitionsdatei einsehbar sein -> schau mal, ob da SPH existiert/definiert wird (wahrscheinlich nicht).
Ich habe außerdem noch irgendwas mit dem Power Reduction Register und den externen IRQs im Hinterkopf (AFAIR PCINT und die ExtInt).
Bin der Meinung, daß ich diesbezüglich sogar mal dem Support gemeldet hatte - das aktuelle Datenblatt bei ATMEL und(!!) Microchip ist aber immer noch Revision "B" von 2011...
(AFAIR gabs bei irgend'ner Studio-Version auch mal'n Unterschied zwischen dem Assembler und dem Assembler2 innerhalb desselben Studios - gibts hier sicher noch irgendwo 'n Thread zu... @TommyB ? erinnerst Du Dich?)

Edit: Grml... zu langsam getippt...
 
Hi LotadaC

Der Tiny initialisiert die beiden Register selbst beim Reset mit diesen Werten (= initial value).
Hab es inzwischen auch gelesen. Die Definition im Code kann ich mir sparen. Geht automatisch.

Ja, ich verwende Assembler. Halte mich gerne in der untersten Ebene der Maschine auf ;) Bin halt ein Undergroundboy :D
Das Studio ist aktuell. Vor 2 Wochen installiert weil inzwischen neuer PC ....
 
Leider ist die Dokumentation des 2313A/4313 (immer noch) sehr ... lückenhaft aus der des Tiny2313 zusammenkopiert.
Ja, dies passt auch nicht ...
This Stack space in the data SRAM must be defined by the program before
any subroutine calls are executed or interrupts are enabled. The Stack Pointer must be set to
point above 0x60.

upload_2017-5-22_22-4-3.png
 
(AFAIR gabs bei irgend'ner Studio-Version auch mal'n Unterschied zwischen dem Assembler und dem Assembler2 innerhalb desselben Studios - gibts hier sicher noch irgendwo 'n Thread zu... @TommyB ? erinnerst Du Dich?)
Jupp, war aber mit nem Tiny13 und dem alten Atmel Studio 4.dickemilch. Ist ja auch schon ewig her ;)
 
Beim Tiny4313 war noch irgendwas mit dem GIFR und den PCIFs in älteren Studio-Versionen falsch...
Hab es inzwischen auch gelesen. Die Definition im Code kann ich mir sparen. Geht automatisch.
Die I/O-Register werden beim Reset in jedem Controller auf ein initial value geladen (außer Lese-Bits, klar) - früher war das immer 0x00, alle halbwegs modernen AVR laden meist sinnigere Werte vor (zB auch beim UART).

@Dirk wegen Deinem Zitat: kann ein POP denn den Inhalt eines I/Os auslesen/könnte ein Call wirklich einen Wert in ein I/O schreiben (den Sinn jetzt mal dahingestellt)?
(also verhält sich der Stackzugriff intern tatsächlich wie ein LD/ST?)
((könnte man damit sogar in Rechenregister Pushen/Poppen?))
Im Simulator läßt sich der SP zwar auf diese Werte setzen, incrementiert/dekrementiert korrekt, aber gepushte Werte werden nicht in die Register geschrieben... ob das im Chip auch so ist, hab ich noch nicht getestet...
 
@Dirk wegen Deinem Zitat: kann ein POP denn den Inhalt eines I/Os auslesen/könnte ein Call wirklich einen Wert in ein I/O schreiben (den Sinn jetzt mal dahingestellt)?
(also verhält sich der Stackzugriff intern tatsächlich wie ein LD/ST?)
((könnte man damit sogar in Rechenregister Pushen/Poppen?))
Im Simulator läßt sich der SP zwar auf diese Werte setzen, incrementiert/dekrementiert korrekt, aber gepushte Werte werden nicht in die Register geschrieben... ob das im Chip auch so ist, hab ich noch nicht getestet...

Soweit ich weiß, kann man POP und PUSH nur auf die Register 0..31 anwenden. Der Assembler müsste eigentlich dann auch warnen, wenn man dies nicht einhält. Ich habe nun schon ewig kein Assembler Projekt mehr verwendet, vielleicht hat sich ja etwas bei neueren AVR Mikrocontrollern geändert. :hmmmm:

Dirk :ciao:
 
Nein, sorum ist's klar...
Push und Pop haben ja je zwei Parameter. Einer ist das zu Pushende/Poppende Register, und das ist im Opcode als 5-Bit-Konstante mitverschlüselt wird -> die 32 Recheregister.

Der zweite, indirekte Parameter ist die Adresse, auf die der Stackpointer gerade zeigt, und das sollte irgendwo im SRAM (hier konkret 0x0060..0x1015F) sein. Meine Frage war jetzt was geschieht, wenn der Pointer auf Adressen kleiner 0x0060 (->IO-Register), oder gar kleiner 0x0020 (->Rechenregister) zeigt.
Ein Push müßte ja dann das IO/Rechenregister beschreiben, ein Pop dieses laden. Im Simulator kann man aber nur das korrekte dekrementieren/inkrementieren von SPH:SPL beobachten.
 
Ah jetzt verstehe ich. Gute Frage.

Wenn man nun das Datenblatt zugrunde legt, sollte es für IO-Register und Arbeitsregister nicht funtionieren ...
The Stack Pointer must be set to point above 0x60.

Ich vermute, dass sich der MC auch so verhält, wie beim Simulator. Das könnte man aber auch mal direkt testen.
Wenn SP unter 0x60 kommt, dann "knallt" es auf gedenfall, wenn man Subroutinen oder Interrups nutzt. Frage ist, was wird dann beim ret/reti in den PC geschrieben, bei einer 0 gibts wenigstens einen Start beim Reset Vektor, was aber keinem Reset entspricht.

Ich vermute mal über PUSH und POP auf den Bereich unter 0x60 zugreifen wäre nur eine "halbe Sache" wenn das mit dem PC nicht funktioniert oder sinnvoll ist ... insofern wird die Adressierung bestimmt auch tatsächlich nicht unterstützt und man muss selber dafür sorgen, dass der SP nicht unter 0x60 kommt.
 
Wie gesagt: im Simulator (6er Studio) kommen die gePUSHten Inhalte nicht im I/O-Space/Rechenregister an; gePOPt wird immer 0x00.
Und eigentlich sollte sich der Simulator bei den neuen Studios korrekt verhalten.
Ob sich für sowas 'ne sinnige Anwendung finden lassen würde, interessiert mich (derzeit) nicht - mir gehts nur um das grundsätzliche Hardware-Verständnis. Und da siehts so aus, als wenn die Stackoperationen anders mit den remappten Speicherbereichen umgehen als indirektes Load/Store.

Edit: Wenn Stackzugriffe auf Adressen kleiner 0x60 im Nirvana landen, ist das quasi verschenkter Adressraum... ok, bei 96 Adressen ist das nicht so viel, aber es gibt ja auch AVR mit extended I/O, und da wärens dann 256 Adressen...
(die haben dann aber sicher auch mehr als 1Byte-viel SRAM)
 
Zuletzt bearbeitet:

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)