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:
register8_tVPCTRLA;/* Virtual Port Control Register A */
7
register8_tVPCTRLB;/* Virtual Port Control Register B */
8
register8_tCLKEVOUT;/* Clock and Event Out Register */
9
register8_tEBIOUT;
10
register8_tEVOUTSEL;/* Event Output Select */
11
}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
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:
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:
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
@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.
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
>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.
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.
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
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.
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