Moin!
Folgendes Problem: Mit einem AVR moechte ich ein Port-Register PinX
ueber einen Zeitraum von wenigen Millisekunden so oft wie moeglich
auslesen und die Bytes sequentiell im RAM ablegen, um diese dann
anschliessend in Ruhe auszuwerten. Auf einen bestimmten Controller habe
ich mich noch nicht festgelegt, mal sehen was die Bastelkiste noch
hergibt, aber 64k RAM und 20MHz sind schonmal dicke ausreichend.
Geschrieben wird in Assembler.
Bisher wuerde ich den Port mit IN einlesen und anschliessend mit PUSH
auf den Stack schieben. Kostet soweit 3 Zyklen, wenn ich die Befehle
kopiere bis der Programmspeicher voll ist. Wenn ich mit einer Schleife
arbeite, sind's schonmal 4 Zyklen plus noch ein paar zusaetzlich alle
256 Durchgaenge. Dadurch wird die Samplerate unregelmaessig, es sei denn
ich baue gleich noch ein paar NOPs mit ein, was wieder ein paar Zyklen
kostet.
Man kann ja die Hardware-Register teilweise auch direkt ohne IN
ansprechen. Daher habe ich so ein bisschen die Hoffnung, dass es
eventuell eine Moeglichkeit gibt so ein Port-Register direkt (ohne Umweg
ueber ein Arbeitsregister) in den Speicher zu kopieren und den Pointer
weiterzuzaehlen. Mit ST scheint es nicht zu funktionieren - gibt es da
sonst noch eine andere Moeglichkeit?
Vielen Dank schonmal,
Lasse
Du könntest mal (wenn du bei AVR bleiben möchtest) in Richtung der
xMegas schielen. Die haben nämlich einen herrlichen Hardware DMA. Der
kopiert auf Befehl die Daten in deinem Speicher wild durch die Gegend ^^
N. A. schrieb:> Warum µC? Dein Vorhaben kann man auch mit einer Statemachine im> EPROM> und einem RAM erledigen. Nur zum Auslesen und Verwursten braucht man> einen µC.
Wenn du den Weg wählst, dann kannst du auch mit nem Binärzähler und nem
Ram-Baustein hantieren. Da sparst du dir den (inzwischen seltenen)
Eprom.
Ich wollt's der einfachheit halber mit nur einem AVR machen, ausserdem
habe ich davon noch ein paar vorraetig, ein STK500 und ausreichend
Grundwissen dazu :). Klar gibt's geeignetere Architekturen, aber soviel
Aufwand moechte ich hier nicht treiben - lieber das Maximum aus dem
Vorhandenen rausholen.
Lasse schrieb:> das Maximum aus dem> Vorhandenen rausholen.
Das ist aber dann weit von
Lasse schrieb:> aber 64k RAM und 20MHz sind schonmal dicke ausreichend
entfernt.
Wie wär's mit 74HC165 und F-RAM mit SPI (z.B. FM25V20). 256kByte bei
5MByte/s könnten erreichbar sein.
holger schrieb:> Es gibt keinen AVR mit 64kB RAM.
Ja, stimmt :(. Auch nur mit externem RAM.
Amateur schrieb:> Der Befehl IN gefolgt von einem SBRC/SBRS.
Die Beiden brauchen auch schon 2-3 Zyklen bei einem Skip.
Konrad S. schrieb:> Das ist aber dann weit von>> aber 64k RAM und 20MHz sind schonmal dicke ausreichend> entfernt.
Deswegen hatte ich ja gehofft mit einem Trick auf 1/2 Taktfrequenz zu
kommen. Mit 4 Zyklen bin ich dann halt bei 5MHz, das ginge schon, aber
mehr ist immer besser ;).
Lasse schrieb:> Ich wollt's der einfachheit halber mit nur einem AVR machen, ausserdem> habe ich davon noch ein paar vorraetig, ein STK500 und ausreichend> Grundwissen dazu :).
Dann könntest Du die Arbeit ja verteilen. Nimm 5 AVRs, versorge die aus
einer Taktquelle, z.B. einen 20Mhz Quarzoszillator, sychronisiere sie
unter Verwendung der ICP-Eingänge taktgenau, und lasse sie dann
umschichtig das Byte abtasten. Port lesen und im RAM ablegen alle 5
Taktzyklen sollte auch in Schleifen mit konstanter Rate gehen. Du must
es nur schaffen, den Vorgang bei jedem weiteren Controller je einen
Taktzyklus später zu starten. Durch den gemeinsamen Takt bleibt die
Synchronität ja erhalten (Ungewollte Resets, und Programmfehler mal
ausgeschlossen). Dann hast Du die gewünschten 20MHz, und mit 5
ATmega1284 hättest Du soger mehr als 64k RAM.
Auf den Stack würde ich die Daten nicht legen, ein ST X+, R16 braucht
auch nicht mehr Taktzyklen, und legt die Daten, schön der Reihe nach,
ins RAM.
Falls Du keinen Quarzoszillator hast, ich habe auch schon 3 AVRs, die
nahe beieinander sind, mit einem normalen Quarz, mit dem selben Takt
betrieben. Ist aber ein Trick, den ich nur für eine Bastel-Schaltung
nehmen würde. Dort bleibt die Synchronität aber über Stunden erhalten.
Das könnte auch ein interessanter Ansatz für einen einfachen
Logic-Analyser sein!
Mit freundlichem Gruß - Martin
Max D. schrieb:> Wenn du den Weg wählst, dann kannst du auch mit nem Binärzähler und nem> Ram-Baustein hantieren. Da sparst du dir den (inzwischen seltenen)> Eprom.
Nicht ein RAM, sondern acht.
8 x 23K256 von Microchip. Das sind 32K SPI-RAM mit 8 Pins. Davon 8 Stück
parallel. Für jedes Bit eines. Konfigurieren, Takt(bis 20MHz) drauf,
fertig.
Falls notwendig kann man die Daten mit einem Latch zwischenspeichern.
Mit fallender Flanke ins Latch, mit steigender Flanke ins RAM.
Lasse schrieb:> um diese dann> anschliessend in Ruhe auszuwerten.
Danach kann man die Daten aus den RAMs in aller Ruhe über einen Port in
den Controller einlesen, verarbeiten, zum PC schicken oder sonstwas
damit veranstalten.
mfg.
Lasse schrieb:> Folgendes Problem: Mit einem AVR moechte ich ein Port-Register PinX> ueber einen Zeitraum von wenigen Millisekunden so oft wie moeglich> auslesen und die Bytes sequentiell im RAM ablegen, um diese dann> anschliessend in Ruhe auszuwerten.
Jeder bessere Logik Analysator für unter 10€ (z.B. ebay 121300301611)
schiebt dir die Daten von einem Port mit 24MHz Abtastrate auf den PC.
Was willst du da mehr als 10 min drüber nachdenken?
Ich konnte meinen "Informationsbedarf" soweit reduzieren, dass ein
einfacher Periodenzaehler ausreicht:
1
hi: sbic PIND, PD5
2
rjmp hi
3
lo: sbis PIND, PD5
4
rjmp lo
5
inc cnt
6
rjmp hi
Damit kann ich einen Flankenwechsel alle 3 Takte erkennen und alle 6
Zyklen ist eine Periode dazugezaehlt. Die Routine wird dann regelmaessig
vom Timer-Interrupt unterbrochen, um den gezaehlten Wert direkt per LEDs
oder Display dazustellen -> komplett ohne PC, daher der "Aufwand". Somit
sind 16-20MHz schnell genug und RAM ist auch kein Problem mehr.
Vielen Dank nochmal an alle!