mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik External Memory bei ATmega8515 (mit SJA1000)


Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
Ich möchte einen SJA1000 mit einem ATmega8515 koppeln.

Hardwaremäßig sollte alles passen (benutze eine bestehende Platine).
Mein Problem ist die Ansteuerung des Speichers vom SJA1000. Ich komme da 
mit dem Datenblatt nicht ganz klar.
Muss ich als Offset jetzt 0x0260 oder 0x1100 oder 0x8000 nehmen? Wie 
müssen die Bits im SFIOR und EMCUCR gesetzt sein?

Lesezugriff will ich wie im Datenblatt so machen:
uint8_t result;

CS_Control(interface, 0);// CS low
_delay_ms(1);

unsigned char *p = (unsigned char *) (OFFSET + 2);
result = *p;

_delay_ms(1);
CS_Control(interface, 1); // CS high


Danke schonmal für eure Antworten!
Flo

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es weiß doch bestimmt jemand hier, es hat nur noch nicht der richtige 
gelesen :)
Ich brauch nur nen Tipp, an welcher Adresse ich den externen Speicher 
ansprechen kann.
Danke!

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch mal push :)
Bin immer noch nicht weiter mit meinem Problem. Der SJA läuft immer noch 
nicht :(

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich kenne zwar den SJA1000 nicht und habe nur kurz ins dessen Datenblatt 
geschaut:

er hat ja wohl nur 256 Byte Adressbereich (A0-A7). Wenn Du ihn also an 
das Memoryinterface des 8515 hängst und es nur einschaltest, dann taucht 
er eben alle 256 Byte wieder von vorn auf, weil ja die oberen Adressen 
nicht dekodiert werden.
Wenn weiter nichts an das Memoryinterface ran soll kannst Du den Port 
von A8-A15 umprogrammieren und als normalen Port nutzen.

Die Zuordnung its in der Tabelle im Datenblatt des Mega8515, habe ich 
jetzt nicht zur Hand.

Wenn das Timings des SJA1000 zum Mega8515 passt, kannst Du auch CS des 
SJA an A8 legen, dann mußt Du es nicht getrennt schalten. Ein Zugriff 
auf 0x0000,
ßx0200, 0x0400 usw. selektiert ihn dann über A8 = L.

Den Bereich von 0x0000 bis 0x025F kannst Du dazu nicht nutzen, da liegt 
das interne Ram. Du kannst also erst ab 0x300 (getrennter CS-Pin) oder 
ab 0x400 mit CS an A8 benutzen.

Nach dem Datenblatt ist die längste Wartezeit bei RD Low to Data Output, 
das sollte also eigentlich auch bei 16MHz AVR-Takt und CS an A8 ohne 
Wait States gehen.

Doch noch schnell das Datenblatt des des Mega8515 befragt:
In MCUCR nur SRE auf 1,
EMCUR kann komplett 0 bleiben, wenn der SJA als einziges am 
Memoryinterface hängt.
XMM0, XMM1, XMM2 kannst Du entweder alle auf 1 setzen, dann nur 8 Bit 
Adresse und CS muß zu Fuß gesteuert werden oder XMM2 und XMM1 auf 1 und 
CS an A8, dann ist PC2..7 noch frei verfügbar.

PS: ich beziehe mich natürlich auf die Anschlußweise eines SJA1000 an 
einen Mega8515, wenn ich den da dranlöten wollte.
Wie Deine Platine verdrahtet ist und ob es da Abweichungen gibt, mußt Du 
wohl selbst rausfinden...

Gruß aus Berlin
Michael

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
Danke für die Erklärung.
Mein CS liegt auf einem anderen Pin und ich ziehe den manuell im 
Programm low.
Die Register habe ich eingestellt wie Du geschrieben hast.
Wie spreche ich jetzt den Speicher vom Programm aus an?

Habe es jetzt so probiert:
#define CAN_BASE    0x300

uint8_t result;

CS_Control(interface, 0);// CS low
_delay_ms(1);

unsigned char *p = (unsigned char *) (OFFSET + 2);
result = *p;

_delay_ms(1);
CS_Control(interface, 1); // CS high

Damit will ich das Status Register auslesen.
Aber ohne Erfolg...

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Hardwaremäßig sollte alles passen (benutze eine bestehende Platine).

Und wie sieht der Schaltplan aus ?
Michael hat das doch ziemlich gut erklärt.
Wenn du den Memory mapped angeschlossen hast
fehlt dir möglicherweise nur ein simpler Adressdecoder.

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

zur C-Source kann ich wenig sagen, programmiere nur ASM und da wäre es 
eben nur

.equ CAN_PORT = PORTC ; C natürlich nur, wenn CS an PORTC dranhängt...
.equ CAN_CS   = PC0   ; Pin wo CS dranhängt

.equ CAN_BASE = 0x300

cbi CAN_PORT,CAN_CS
nop                   ; viel warten ist laut Datenvlatt nicht nötig.
lds r16,CAN_BASE+2    ; Inhalt von 0x0302 in r16 holen als Beispiel
nop
sbi CAN_PORT,CAN_CS

Gruß aus Berlin
Michael

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also der ist memory mapped angeschlossen.
Ich weiss nur nicht, in welchem Adressbereich ich den ansprechen kann??
0x0260, 0x0300, 0x1100 oder 0x8000?
Woher weiß der ATmel, wann ich auf den externen Speicher will?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Flo wrote:

> Woher weiß der ATmel, wann ich auf den externen Speicher will?

Ganz einfach.
Wenn Du das externe Memoryinterface enabled hast und auf eine Adresse 
außerhalb des internen Memory zugreifst, wird das automatisch nach 
extern ausgeführt.

Wenn das der einzige Chip am Memorybus ist, kannst Du /CS einfach 
ständig auf Low lassen.

Die Pins AD0..7, /RD, /WR und ALE des AVR mußt Du direkt mit dem SJA1000 
verbinden.

Wichtig ist ALE, damit das Adreßlatch im SJA1000 funktioniert!


Peter

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jo, angeschlossen ist alles korrekt.
Aber mit welcher Adresse erreiche ich Byte 1 im SJA1000??
Wo hört das interne Memory des 8515 auf? Ich weiß, steht im Datenblatt. 
Aber damit komme ich nicht klar bzw. es funktioniert nicht.
Deshalb kann mir bitte jemand die Adresse sagen, damit ich sicher sein 
kann?
Danke!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
0xFF00 ... 0xFFFF sollte immer klappen.


Peter

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah, damit klappts!
Danke für eure Antworten. Habe wieder viel gelernt :)

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.