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 ^^
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.
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.
Max D. schrieb: > Da sparst du dir den (inzwischen seltenen) > Eprom. Oder, wenn der Geist (noch) mitspielt, könnte das ein CPLD erledigen.
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.
Der Befehl IN gefolgt von einem SBRC/SBRS. Bei manchen Chips geht auch SBIC/SBIS. Siehe auch: Instruction Set.
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.
:
Bearbeitet durch User
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.
:
Bearbeitet durch User
Hallo, ich habe das vor ein paar Jahren mal so gemacht: http://www.avr.roehres-home.de/logikanalyzer/index.html Ist heute noch im Einsatz, z.Z. bei C64/1541-Basteleien... Gruß aus Berlin Michael
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.