mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik XMEGA 128A1U 64A1U mit 4-PORT EBI und SRAM


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Felix H. (masterq)
Datum:
Angehängte Dateien:

Bewertung
1 lesenswert
nicht lesenswert
Hallo,
ich habe gerade ein Projekt abgeschlossen mit dem Four-Port EBI auf dem 
xmega128a1u.
Da die Header fehlerhaft sind, es den Port L nicht gibt und 4PORT EBI 
schlecht dokumentiert ist, war ich nicht sicher ob es funktionieren 
würde.

Es funktioniert!

Folgendenmaßen muss die Header Datei iox128a1u.h modifiziert werden:

Ursprünglich:
/* I/O port Configuration */
typedef struct PORTCFG_struct
{
    register8_t MPCMASK;  /* Multi-pin Configuration Mask */
    register8_t reserved_0x01;
    register8_t VPCTRLA;  /* Virtual Port Control Register A */
    register8_t VPCTRLB;  /* Virtual Port Control Register B */
    register8_t CLKEVOUT;  /* Clock and Event Out Register */
    register8_t reserved_0x02;
    register8_t EVOUTSEL;  /* Event Output Select */
} PORTCFG_t;

Nach der Modifikation:
/* I/O port Configuration */
typedef struct PORTCFG_struct
{
    register8_t MPCMASK;  /* Multi-pin Configuration Mask */
    register8_t reserved_0x01;
    register8_t VPCTRLA;  /* Virtual Port Control Register A */
    register8_t VPCTRLB;  /* Virtual Port Control Register B */
    register8_t CLKEVOUT;  /* Clock and Event Out Register */
    register8_t EBIOUT;
    register8_t EVOUTSEL;  /* Event Output Select */
} PORTCFG_t;

Danach funktiniert der ganze Kram.

Eagle 6.4 Layout und Board

Im Anhang ist mein Board zu finden und das dazugehörige Netzteil. Falls 
jemand beides nachbauen möchte, reicht es beim Supply-Board die 3,3V 
line zu bestücken.
Das Netzteil ist ein von mir entwickeltes Standard Netzteil, welches ich 
erschaffen habe, damit ich praktische netzteillose Testboards nutzen 
kann. Denn das spart Geld, Zeit und Aufwand.

SRAM Board:
Durchkontaktierungen sind von Reichelt, mit 0,6mm Innendurchmesser, 
müssen 0,8 mm gebohrt werden.
Die Durchkontaktierungen müssen so ausgerichtet werden, dass die flache 
Seite unter dem XMega ist und anschließend sehr dünn belötet werden, 
damit der XMEGA noch drauf passt.
SRAM von CSD Elektronics mit 512KB.
PINHEADER empfehle ich ALLE Female 2,54 Rastermaß.
10pol PINHEADER nehme ich immer gewinkelt.
(Siehe Bild)


Netzteil Optional.
Irgendein 3,3V LOW-DROP Linearregler im TO220-3 Gehäuse.
Für die Diode empfehle ich ebenfalls eine mit geringen Spannungsfall.
Sonst kann man das Netzteil nicht mit 5V versorgen.
X1 ist eine Anschlussklemme, und sieht völlig anders aus als im 
Board-Layout:
http://www.pollin.de/shop/dt/NDQ4ODQ1OTk-/Bauelemente_Bauteile/Mechanische_Bauelemente/Steckverbinder_Klemmen/Leiterplatten_Anschlussklemme_XY350.html

Achtung:
nur für A1U nicht für A1-AU. Das sind zwei unterschiedliche Controller!

Grüße,
MasterQ

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Heißt das, dass PORTL eigentlich PORTF ist und somit auch sdram im 8bit 
Modus funktionieren sollte?

Autor: Felix H. (masterq)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So kann man das sagen, in wirklichkeit remapt man den wohl nur.
Und nicht nur sollte sondern auch tut, das habe ich getestet.

Ich wurde nochmal nach der Initialisierung gefragt.
Es gibt ein paar Dinge die zu beachten sind. Ich hoffe die folgende 
Liste ist vollständig.
1. Der Stack darf den Heap nicht überschreiben. Die meisten Makefiles 
Setzen den Stack am RAMEND. Und RAMEND ist in dem Fall das Ende des 
internen Speichers.

zusätzliche Linker/Compiler Optionen könnten so aussehen:
-Wl,--section-start,.data=0x804000,--defsym=__heap_end=0x87ffff

2. Manchmal muss speicher Initialisiert werden bevor das Programm 
anläuft. Das macht C normaler weise automatisch. Jedoch ziemlich früh 
und das führt zu einem Problem, wenn das EBI noch nicht initialisiert 
ist.

Hier ein Codeausschnitt der das EBI früher initialisiert:
void init_ebi(void) __attribute__ ((naked)) __attribute__ ((section (".init0")));

void init_ebi(void)
{
    PORTCFG.EBIOUT = 0b00000001; //0b00000000
    EBI.CTRL = EBI_SRMODE_NOALE_gc | EBI_IFMODE_4PORT_gc;

    EBI.CS0.CTRLA = EBI_CS_MODE_DISABLED_gc;
    EBI.CS1.CTRLA = EBI_CS_MODE_DISABLED_gc;
    EBI.CS2.CTRLA = EBI_CS_MODE_DISABLED_gc;
    PORTH.OUT = 0xFF;
    PORTH.DIR = 0xFF;
    PORTF.DIR = 0xFF;
    PORTK.DIR = 0xFF;
    
    EBI.CS3.CTRLA = EBI_CS_ASPACE_512KB_gc | EBI_CS_MODE_SRAM_gc;
    EBI.CS3.CTRLB = EBI_CS_SRWS_1CLK_gc;
    
    EBI.CS3.BASEADDR = 0;
}

3. Der externe Speicher kann in den meisten Fällen nicht direkt an den 
Liniaren Bereich angrenzen Ohne das ein Teil des Speichers unbenutzbar 
ist.
Das liegt daran das Adressen nicht addiert werden können.
Der Externe Speicher darf also nur an Adressen anfangen die ein 
vielfaches von seiner Größe sind.

2 Möglichkeiten:

Vorgabe:
16 KByte interner Speicher
32 KByte Externer Speicher

Möglichkeit 1:
Hier Konfigurieren wir den Externen Speicher so das er an 0x00 anfangen 
würde. Also das 0 fache seiner eigenen Größe.

Tatsächliche Linare Darstellung des Adressraums:
[16 Kbyte Intern] [16 KByte Extern]
Der Speicher überschneidet sich und man kann nur 16 KByte des Externen 
Speichers nutzen.

Warum?
Um das zu können müsste der Speicher Controller rechnen können:
Man stelle sich vor man möchte auf die Adresse 0x4400 zugreifen (17tes 
KByte).
Nun müsste der Speicher Controller ausrechnen wie er auf diese Adresse 
zugreifen kann. Er müsste 0x4400 - 0x4000 (interner Adressraum 16 KB) 
Rechnen und dann auf diese Adresse (0x0400) auf dem Externen Speicher 
zugreifen.
Das kostet Zeit beim Zugriff und Platz auf dem Chip.
Also rechnet er nicht, sondern Multiplext nur und greift statt dessen 
auf die Adresse 0x4400 auf dem Externen Speicher zu. Somit sind 
0x0-0x3FFF des externen Speichers nicht erreichbar.

Möglichkeit 2:
Hier Konfigurieren wir den Externen Speicher so das er an 0x4000 
anfangen würde. Also das 1 fache seiner eigenen Größe.

Tatsächliche Linare Darstellung des Adressraums:
[16 Kbyte Intern] [16 KByte unbelegt] [32 KByte Extern]

Hier ist der Komplette Speicher erreichbar allerdings liegen 16 KByte 
mitten im Adressraum die man nicht benutzen kann.

Eine mögliche Lösung für das Problem ist, den Stack, der meist mehr 
benutzt wird (zb bei Funktionsaufrufen und für lokale Variablen) am Ende 
des Internen Speichers anlaufen zu lassen (Stack wächst rückwärts) und 
den Heap am Anfang des Externen Speichers loslaufen zu lassen (wächst 
vorwärts).
Allerdings braucht man auf einem µC meist keine 16KB stack und der Heap 
nutzt dann nur den langsameren Externen Speicher.
Ist also nicht Perfekt.

Weiter wäre es Möglich den Heap und den Stack im internen Speicher zu 
belassen, und für weiteren Speicher malloc zu nutzen und dieses am 
Anfang des Externen Speichers zu beginnen oder Adressen für 
Speicherareale welche auf den Externen Speicher sollen selbst 
festzulegen.
Wenn jemand weiß wie man in C festlegt das eine Variable eine Speicher 
Adresse bekommt die größer ist als x oder (RAMEND) wäre ich 
interessiert, gerne mal reinschreiben.

Hier ein Link dazu:
http://www.nongnu.org/avr-libc/user-manual/malloc.html


Ich hoffe das ist verständlich und es gibt nicht allzu viele 
Rechtschreibfehler. Wenn doch, von Rechtschreibfehlern möchte ich nichts 
wissen.

Wenn etwas falsch ist oder besser gemacht werden kann gerne anmerken. 
Ich habe das nur im Rahmen eines Projektes überflogen.


Grüße

MasterQ

Autor: Holger H. (holger-h-hennef) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@Felix H. (masterq)

>Da die Header fehlerhaft sind, es den Port L nicht gibt und 4PORT EBI
Ja das ist immer schon ein Problem Doku+HW zu machen.
Frage:
Kannst du evtl bitte noch ein mini einfach Video Tutorial davon machen ?
Damit wir alle das Teil in Aktion noch erleben.
Fakt:
Wir sind hier mit einem MRF24WBOMB am antesten.

MRF24WBOMB ist ein Wifi-Modem was dir Handy Apps, und Internetkopplung
macht. Und der XMEGA 128 kann man überall kaufen.

Gruss Holger.

Mach weiter so. Hier noch ein Bild von dem Wifi-Modul+CPU.
Ich bin dabei das so zu modden, das man jegliche Xmegas ankoppeln kann.

: Bearbeitet durch User
Autor: Felix H. (masterq)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Morgen Holger,

ich kenne das Modul nicht.
Aber irgendwie scheint mir das was du schreibst, im Bezug auf 4-Port EBI 
Quatsch zu sein.
Falls es dir wirklich um dem 4-Port EBI geht nochmal
xmega128a1 != xmega128a1u

Der xmega128a1 kann kein 4-Port EBI.


Ich weiß auch nicht wovon ich ein Video machen soll?
Man kann den Speicher ja nicht beim Arbeiten sehen... Und auch eine UART 
Ausgabe würde nur wenig erklären.
Oder soll ich vorlesen was ich oben geschrieben habe?
Ich meine, meine Rechtschreibung ist zwar nicht toll, aber Sinn sollte 
es trotzdem machen^^
Und trivial ist es leider einfach nicht. Ich habe schon probiert 
möglichst viele Fachwörter zu umschreiben.
Wenn du etwas konkretes nicht verstehst, kannst du gerne Fragen... Wenn 
ich Zeit finde gebe ich Antwort!

Grüße

MasterQ

Autor: Holger H. (holger-h-hennef) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wenn du etwas konkretes nicht verstehst, kannst du gerne Fragen... Wenn
>ich Zeit finde gebe ich Antwort!
Kannst du mir ein Sceenshot von dem 2 Sheet machen und hier reinstellen
bitte. Oder via *.pdf  bitte. Mein Eagle geht nicht mehr...

Hast du mal versucht einfach mal ein short Project Video zu machen, du 
wirst
erstaunt sein .. Brauch auch nur aus der HandCam gemacht sein, also
nicht cut und Schnickschnack.
Oder eine Slide Show aus Einzelbilder.
------------------------------------------------------------------------ 
-----

>Ich meine, meine Rechtschreibung ist zwar nicht toll, aber Sinn sollte es 
trotzdem
>machen^^ Und trivial ist es leider einfach nicht. Ich habe schon probiert 
möglichst
>viele Fachwörter zu umschreiben.
Ja das liegt in der Natur, die Leute die den Duden im Kopf haben sind ja
die Brain-Zellen voll, Kreativität 0. .  Und sind halt dafür keine maker 
of  Projecte.
############################################################
Der Xmega is für jeden verfügbar, und ich will mal das mit meinem Modul 
testen,
damit habe ich ein XMega Project.
Die Module bekomme ich fast geschenkt, und das Xmega Wifi Project ist 
gebohren.
So einfach is das.
Gruss Holger.
Du bist der, der hier die vertauschung der strucks dokomentiert hat, un 
das ist
Spitze.

Autor: Holger H. (holger-h-hennef) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Felix H. schrieb:
> Man kann den Speicher ja nicht beim Arbeiten sehen... Und auch eine UART
> Ausgabe würde nur wenig erklären.
Speicher ja nicht beim Arbeiten sehen, geht mit dem MRF24WBOMB
und via Wifi in einen Prozess-Visualisierung
Fakt: Wir sind hier mit einem MRF24WBOMB am antesten, da suche
ich halt eine Referenz mit dem man MRF24WBOMB verbinden kann.
So einfach ist das anzukoppeln.
Auch ist die Doku über das Linkerscipt Gold wert.
#################################################
Gruss Holger.

Autor: Franz E. (bkkelch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo MasterQ,

es hat etwas gedauert mit der Antwort, aber mein Board war noch nicht 
fertig. Ich habe Dein Setup mit meinem eigenen Board jetzt getestet und 
es lief Fehlerfrei. Dabei kam ein 512kb SRAM zum Einsatz, das ich mit 0 
Waitstate betreibe.

Vielen dank für die Informationen
Gruss BKKELCH

Autor: Jürgen Bitzer (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier Schaltbild und Software (Bascom) zur Konfiguration des 4-Port-EBI.
Funktioniert bei mir mit einem 512 KB-SRam und einem Epson 
S1D13781-TFT_Controller einwandfrei.
Es stehen dann folgende Leitungen zur Anbindung am ATXMega zur 
Verfügung:
A0 bis A21,
D0 bis D7,
RD,WR,
4 separate Chip-Select's, die einzeln konfigurierbar sind.

Hat mich viel Zeit gekostet, das aus den verworrenen Datasheets 
herauszufinden, funktioniert einwandfrei, rasend schnell ohne Latches.
So können auch alte ISA-Karten direkt an den ATXMega angebunden werden.

Autor: Jürgen Bitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier noch ein selbstentwickeltes Board.
Darauf sind ein ATXMEGA128A1U-AU, 512 KB-SRam und ein S1D13781-TFT 
Controller
per "4-Port-EBI" angebunden...

Der 4-Port EBI funktioniert NUR mit dem ATXMEGA128A1U-AU

http://www.j-bitzer.de/tft.3gp

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.