Forum: Mikrocontroller und Digitale Elektronik AVR: Port wiederholt schnellstmöglich auslesen?


von Lasse (Gast)


Lesenswert?

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

von Max D. (max_d)


Lesenswert?

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 ^^

von N. A. (hannilein)


Lesenswert?

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.

von Max D. (max_d)


Lesenswert?

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.

von N. A. (hannilein)


Lesenswert?

Max D. schrieb:
> Da sparst du dir den (inzwischen seltenen)
> Eprom.

Oder, wenn der Geist (noch) mitspielt, könnte das ein CPLD erledigen.

von Lasse (Gast)


Lesenswert?

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.

von Amateur (Gast)


Lesenswert?

Der Befehl IN gefolgt von einem SBRC/SBRS.
Bei manchen Chips geht auch SBIC/SBIS.
Siehe auch: Instruction Set.

von Konrad S. (maybee)


Lesenswert?

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
von holger (Gast)


Lesenswert?

>aber 64k RAM und 20MHz sind schonmal dicke ausreichend.

Es gibt keinen AVR mit 64kB RAM.

von Lasse (Gast)


Lesenswert?

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 ;).

von Martin S. (led_martin)


Lesenswert?

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

von Thomas E. (thomase)


Angehängte Dateien:

Lesenswert?

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
von Michael U. (amiga)


Lesenswert?

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

von Thomas W. (Gast)


Lesenswert?

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?

von Lasse (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.