Willkommen in unserer Community

Werde Teil unserer Community und registriere dich jetzt kostenlos ...

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

ATtiny4313 SPL SPH RAMEND

Dieses Thema im Forum "Programmierung Flash + Eeprom Memory" wurde erstellt von stinakovits, 22. Mai 2017.

Schlagworte:
  1. stinakovits

    stinakovits Premium Benutzer

    Registriert seit:
    22. April 2013
    Beiträge:
    65
    Zustimmungen:
    5
    Ort:
    Kottingbrunn
    Sprachen:
    Assembler
    Map
    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?
     
  2. Dirk

    Dirk Administrator Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    3.905
    Zustimmungen:
    98
    Ort:
    Mittelhessen, Giessen
    Sprachen:
    C#, Assembler, Pascal, C++, PHP, Java
    Map
    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:
     
  3. stinakovits

    stinakovits Premium Benutzer

    Registriert seit:
    22. April 2013
    Beiträge:
    65
    Zustimmungen:
    5
    Ort:
    Kottingbrunn
    Sprachen:
    Assembler
    Map
    Hi Dirk,

    hehe, hast Recht. Im Definitionsfile ist SPH definiert.
    Hab's mit rein genommen und ein Build erstellen lassen. Sind keine Fehler aufgetreten. Also Passt es.
     
  4. LotadaC

    LotadaC Sehr aktives Mitglied

    Registriert seit:
    22. Januar 2009
    Beiträge:
    2.534
    Zustimmungen:
    29
    Ort:
    Hennigsdorf
    Sprachen:
    BascomAVR, Assembler
    Map
    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...
     
  5. stinakovits

    stinakovits Premium Benutzer

    Registriert seit:
    22. April 2013
    Beiträge:
    65
    Zustimmungen:
    5
    Ort:
    Kottingbrunn
    Sprachen:
    Assembler
    Map
    Hi LotadaC

    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 ....
     
  6. Dirk

    Dirk Administrator Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    3.905
    Zustimmungen:
    98
    Ort:
    Mittelhessen, Giessen
    Sprachen:
    C#, Assembler, Pascal, C++, PHP, Java
    Map
    Ja, dies passt auch nicht ...
    upload_2017-5-22_22-4-3.png
     
  7. stinakovits

    stinakovits Premium Benutzer

    Registriert seit:
    22. April 2013
    Beiträge:
    65
    Zustimmungen:
    5
    Ort:
    Kottingbrunn
    Sprachen:
    Assembler
    Map
    Ich hab's getestet weil ich neugierig war:

    upload_2017-5-22_22-34-10.png

    Stack Pointer Register SPL und SPH werden automatisch gesetzt. Ein initialisieren im Code, so wie in der Doku angegeben, ist nicht notwendig. Initial Value passt.
     
  8. TommyB

    TommyB Premium Benutzer

    Registriert seit:
    17. Mai 2010
    Beiträge:
    1.539
    Zustimmungen:
    40
    Ort:
    127.0.0.1 ;)
    Sprachen:
    C#, Assembler, LunaAVR, VB.Net, Python
    Jupp, war aber mit nem Tiny13 und dem alten Atmel Studio 4.dickemilch. Ist ja auch schon ewig her ;)
     
  9. LotadaC

    LotadaC Sehr aktives Mitglied

    Registriert seit:
    22. Januar 2009
    Beiträge:
    2.534
    Zustimmungen:
    29
    Ort:
    Hennigsdorf
    Sprachen:
    BascomAVR, Assembler
    Map
    Beim Tiny4313 war noch irgendwas mit dem GIFR und den PCIFs in älteren Studio-Versionen falsch...
    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...
     
  10. Dirk

    Dirk Administrator Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    3.905
    Zustimmungen:
    98
    Ort:
    Mittelhessen, Giessen
    Sprachen:
    C#, Assembler, Pascal, C++, PHP, Java
    Map
    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:
     
  11. LotadaC

    LotadaC Sehr aktives Mitglied

    Registriert seit:
    22. Januar 2009
    Beiträge:
    2.534
    Zustimmungen:
    29
    Ort:
    Hennigsdorf
    Sprachen:
    BascomAVR, Assembler
    Map
    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.
     
  12. Dirk

    Dirk Administrator Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    3.905
    Zustimmungen:
    98
    Ort:
    Mittelhessen, Giessen
    Sprachen:
    C#, Assembler, Pascal, C++, PHP, Java
    Map
    Ah jetzt verstehe ich. Gute Frage.

    Wenn man nun das Datenblatt zugrunde legt, sollte es für IO-Register und Arbeitsregister nicht funtionieren ...
    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.
     
  13. LotadaC

    LotadaC Sehr aktives Mitglied

    Registriert seit:
    22. Januar 2009
    Beiträge:
    2.534
    Zustimmungen:
    29
    Ort:
    Hennigsdorf
    Sprachen:
    BascomAVR, Assembler
    Map
    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)
     
    #13 LotadaC, 23. Mai 2017
    Zuletzt bearbeitet: 23. Mai 2017

Diese Seite empfehlen

  • Über uns

    Unsere immer weiter wachsende Community beschäftigt sich mit Themenbereichen rund um Mikrocontroller- und Kleinstrechnersysteme. Neben den Themen Design von Schaltungen, Layout und Software, beschäftigen wir uns auch mit der herkömmlichen Elektrotechnik.

    Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  • Coffee Time

    Unser makerconnect-Team arbeitet hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und unser eigener makerconnekt-Server regelmäßig gewartet wird. Wir nehmen das Thema Datensicherung und Datenschutz sehr ernst und sind hier sehr aktiv, auch sorgen wir uns darum, dass alles Drumherum stimmt!

    Dir gefällt das Forum und die Arbeit unseres Teams und du möchtest es unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft, unser Team freut sich auch über eine Spende für die Kaffeekasse :-)
    Vielen Dank!
    Dein makerconnect-Team

    Spende uns! (Paypal)