Forum: Mikrocontroller und Digitale Elektronik Schneller Controller mit externem Memory Interface


von Peter S. (cbscpe)


Lesenswert?

Gibt es so etwas wie einen Atmega1280 aber schneller? Was ich brauche 
ist ein externes Memory Interface und möglichst viele IO Pins (ca. 44) 
mit genügend Flash (das aktuelle Program belegt im Moment 32kbyte Flash) 
und einem grosszügigen RAM (die aktuelle Anwendung benötigt ca. 5kbyte 
RAM). Die Eingänge müssen 5V Tolerant sein.

Dass das Timing des Externen Memory Interface bei hohen 
Geschwindigkeiten sportlich ist ist in diesem Fall kein Problem, ich 
verwende es um als IO Expander Programmierte CPLDs (7ns Propagation) 
anzusprechen, die sind also noch lange nicht am Anschlag.

Im Moment verwende ich den Atmega1280 aber bei gewissen Interrupt Events 
wären 20-30% mehr Performance sehr hiflreich.

von Thorsten (Gast)


Lesenswert?

Hi
Es gibt lpc546xx haben ein externer Speicher Interface, das mit 100 MHz 
läuft. M4 180Mhz. der ist 5V tolerant.


Wenn's noch schneller sein soll, imx1060 kann 166Mhz und hat sogar einen 
kleinen PLA drin, evtl braucht man dann den cpld nicht mehr. Der Haken 
ist, dass es den Chip nur im bga Gehäuse gibt. m7 600Mhz und mehr. aber 
nur 3.3V, also nix für den TO.

Grüße
 Thorsten

von 1000V Dc (Gast)


Lesenswert?

> Im Moment verwende ich den Atmega1280 aber bei gewissen Interrupt Events
> wären 20-30% mehr Performance sehr hiflreich.

Das erreicht man aber durchaus durch Optimierung des eigenen 
Programmcodes. Sobald du ein bisschen  mehr machst als ein Flag im 
Interrupt zu manipulieren, wird relativ viel code produziert (Register 
sichern,push und Pop aufm Stack etc.), welcher die Interruptlaufzeit 
dann massiv erhöht. Zeig doch mal so ein Interruptcode...

von Datargnan (Gast)


Lesenswert?

STM32 hat 5V Tolerante Eingänge (steht im Datenblatt welche).
Allerdings würde ich hier statt Speicherinterface-Aufwand eher Aufwand 
in Schutzschaltungen oder externe Levelshifter investieren...


Es macht doch in Zeiten von ARM Cortex-M wenig Sinn wegen ein paar KB 
externen Speicher anzubinden.
So ziemlich jeder ARM Cortex hat mehr RAM als Du brauchst - nimm einfach 
einen mit 32 - 64K RAM und 256K Flash und gut ist.

von Sebastian S. (amateur)


Lesenswert?

Reicht Dir denn kein Controller mit mehr internem Speicher.
Die Zeiten von 2K internem RAM sind mittlerweile vorbei.

von Axel S. (a-za-z0-9)


Lesenswert?

Datargnan schrieb:
>
> Es macht doch in Zeiten von ARM Cortex-M wenig Sinn wegen ein paar KB
> externen Speicher anzubinden.

Will der TE ja eigentlich auch nicht. Die ganze Frage ist mal wieder ein 
schönes Beispiel für ein XY-Problem. Was der TE eigentlich braucht, 
ist ein schnelles, paralleles Interface. Zur Zeit mißbraucht er das 
Businterface eines ATMega1280 für diesen Zweck. Und weil dieses 
Interface ursprünglich für den Anschluß von externem Speicher vorgesehen 
ist, glaubt er jetzt, er müsse nach einem Speicherinterface fragen.

Was natürlich Blödsinn ist. Die größeren Cortexe haben reihenweise 
Speicherinterfaces für bspw. SDRAM. Nur nützen die ihm gar nichts.

von Datargnan (Gast)


Lesenswert?

Axel S. schrieb:
> Was natürlich Blödsinn ist. Die größeren Cortexe haben reihenweise
> Speicherinterfaces für bspw. SDRAM. Nur nützen die ihm gar nichts.


Die können i.d.R. (bei STM32) auch SRAM und normale parallele 
Busteilnehmer.

von Peter S. (cbscpe)


Lesenswert?

Hier was in so einem interrupt etwa passiert
1
;--------------------------------------------------------------------------
2
;
3
;  UART 2  -  SLUB
4
;
5
rxc2_isr:                ; USART2 = SLUB
6
;
7
  in    isreg, SREG        ; Save Status
8
  lds    qbushigh, UCSR2A    ; Get Status
9
  lds    qbuslow, UDR2      ; And Character
10
  lds    itemp, rcsrlb      ; Get RCSR
11
  sbrc  itemp, 7        ; Is there still a character in RBUF
12
  sbr    qbushigh, (1<<DOR2)    ; if yes we have a data overrun 
13
  sbr    itemp, (1<<7)      ; Set  DR  
14
  sts    rbufhb, qbushigh    ; Store RBUF
15
  sts    rbuflb, qbuslow
16
  sts    RCSRB, itemp      ; Set DR
17
  sts    rcsrlb, itemp
18
  out    SREG, isreg        ; 
19
  reti
20
;
21
;  Read  RCSR
22
;
23
readrcsrb:
24
  lds    qbuslow, rcsrlb
25
  sts    DATAL, qbuslow
26
  sts    DATAH, zero        ; Upper byte always read as zero
27
  pop    zh
28
  pop    zl
29
  lds    itemp, CLRINT0
30
  out    SREG, isreg
31
  reti
32
33
csr_isr:
34
  in    isreg, SREG
35
  push  zl
36
  push  zh
37
  lds    zl, STATUS
38
  bst    zl, LB          ; Remember if lower byte is not written
39
  andi  zl, 0x3F
40
  clr    zh
41
  subi  zl, low(-DATIOtable)
42
  sbci  zh, high(-DATIOtable)
43
  ijmp
44
45
46
DATIOtable:
47
.
48
.
49
50
  rjmp  readrcsrb
51
  rjmp  readrbufb
52
  rjmp  readxcsrb
53
  rjmp  readxbufb
54
55
.
56
.

Das ganze kommuniziert mit dem Q-Bus einer PDP-11 und emuliert nicht 
mehr verfügbare Hardware.

Zwischen dem Bus und dem MCU sitzt das CPLD und die Bus Transceiver. Das 
externe Memory Interface benutze ich weil da die Umschaltung der 
Datenrichtung des Datenports integriert ist und ich so einfach mit dem 
CPLD Daten austauschen kann, das spart extrem viele Pins zwischen CPLD 
und MCU und entsprechend auch IO Pins auf dem MCU. Ich glaube einige PIC 
haben für so etwas einen Parallel Slave Port.

Ein weiterer Vorteil des externen Memory Interface ist, dass es eine 
Ausführungseinheit bildet. D.h. Lesen und Schreiben von CPLD register 
können nicht durch einen Interrupt unterbrochen werden. Wenn ich das 
alles von Hand mache (Port Richtung ändern, Register Adresse setzen, 
Daten austauschen) dann muss ich immer die Interrupts abschalten wenn 
ich im Hauptprogram CPLD register lesen oder schreiben will.

Externen Speicher will ich eben nicht anschliessen. Der Atmega1280 hat 
mit 8kbyte internem RAM mehr als genug für meine Anwendungen.

Wie gesagt, es funktioniert im Moment alles Bestens. Der Nachteil ist 
eher, dass ich mehrere Hardwareversionen habe, je nach dem welches 
Interface emuliert wird. Es wäre nett wenn ich ein universelles 
Interface hätte, das ich dann einfach durch umprogrammieren der MCU in 
die verschiedenen Interfacekarten "verwandeln" kann. Aber universeller 
bedeutet meist auch längere Interrupt Routinen und auch sonst etwas mehr 
Software overhead. Eine kurze Abschätzung hat ergeben, dass ich eben gar 
nicht so viel mehr Performance brauche (eben diese 20-30%).

von 1000V Dc (Gast)


Lesenswert?

zl und zh in einem Doppelregister zu sichern spart  2x mal push und 2 x 
pop.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.