Forum: Mikrocontroller und Digitale Elektronik Welcher AD-Wandler µC ?


von Martin (Gast)


Lesenswert?

Hallo!

Ich versuche hier sowas wie einen Osciloskop zu bauen.
Soweit klappt alles, nur bislang habe ich als AD-Wandler den internen
AD-Wandler des ATMega8 verwendet.
Bei mir kommt er nur auf lächerliche 2ksps. Laut dem Datenblatt können
es eh höstens 15ksps sein, das ist viel zu langsam.
Ich möchte aber eine Abtastrate von 1MHz haben, so das sich Signale bis
100-200kHz gut darstellen lassen und ein ATMega8 dies zu verarbeiten
schafft.

Nun ist meine Frage, kann mir jemand aus eigener Erfahrung irgendein
AD-Wandler µC empfehlen ?
Ich denke da an sowas wie AD6640(der ist eigentlich viel zu gut) also:
-schafft 1MSPS
-8 bit auflösung(6bit ginge auch)
-lässt sich relativ leicht mit dem Mikrocontroller koppeln
(also hat einen 8bit-Port als Ausgang, keine serielle übertragung)

Übrigens, weiss jemand wie schnell in der Praxis ein PORT (z.b PORTB)
am ATMega8 ausgelesen werden kann (angenommen 16MHz Taktfrequenz) ?

Wäre dankbar für jede Hilfe.

von dave (Gast)


Lesenswert?

Kannst du Assembler?

IN (Port in Register lesen) 1 Takt
Bit Setzen/Löschen SBI/CBI 2 Takte
Ins RAM speichern 2 Takte
OUT (z.B. ins UART-Register) 1 Takt

von luchs2a (Gast)


Lesenswert?

nabend

schau mal auf die seite von maxime da kann man schön suchen lassen.
sowas wie du habe ich auch vor und dort auch schon gesucht, wenn du was
dazu ausgearbeitet hast könntest du es ja mal posten  wäre interessant.


danke

Mischa

ps für alle die gleich wieder mosern von wegen langsam .... .
1. es ist ein anfang
2. wäre es ne möglichkeit auf nem analogen oszi langsamere vorgänge
sichtbar zu machen  und mal was zu speichern

von Martin (Gast)


Lesenswert?

Danke für die Antworten.

@dave
Das ist die schöne Theorie. Bei kleinen Frequenzen ist das sicher so.
Aber wenn ich jetzt versuche ein Port 255 mal in 255µs auszulesen
dann ist es vielleicht nicht mehr so z.B wegen Kapazitäten an den
Eingängen.Vielleicht muss man deshalb noch ein NOP dazwischen setzen.

@Mischa
Ich bin gerade dabei, vielleicht ist was bei den max... Bausteinen
dabei was die Anforderungen erfüllt, nicht zu teuer ist, und auch
erhältlich.
>wenn du was dazu ausgearbeitet...
Ja mach ich, ich muss nur das Ganze (Quellcode, Schemen) irgendwie
sortieren und für andere Menschen verständlich machen.

von Alex (Gast)


Lesenswert?

Falls es richtig schnell sein soll nimm nen DSP, die schaffen bis in den
MSample/s Bereich bei z.T. 14 Bit Auflösung. Wird aber mit dem Basteln
halt etwas schwieriger. Dafür ist die Signalweiterverarbeitung mit
hoher  Geschwindigkeit gewährleistet.

von Martin (Gast)


Lesenswert?

Hallo.

Ich habe jetzt geeigneten AD-Wandler gefunden, TDA8703.
Der AD-Wandler wird an PORTD angeschlossen, und von da werden die Daten
ausgelesen.
Nun habe ich aber folgende Frage, lässt sich an dieser Schleife etwas
optimieren:
loop:
  ;CLK für den AD-Wandler
  sbi PORTB,CLK ;2
  ;Ergebnis in den r16 Register einlesen
  in temp,PIND ;1
  ;und im SRAM speichern
  st x+,temp  ;2
  ;CLK zurücksetzen
  cbi PORTB,CLK  ;2
  inc r0  ;1
  cpse r0,temp2 ;1-3
  rjmp loop ;2

@Mischa
Wenn du noch Interesse hast, hier ist so zimmlich alles was bis jetzt
ausgearbeitet habe:
http://www1.kielnet.net/home/marc.in/pc-oszilloskop/

von dave (Gast)


Lesenswert?

Wenn du dir 2 Register bereitlegst, das einmal mit Clock High und einmal
Low gefüllt ist, kannste 2 Takte sparen.
Außerdem würdeste eins sparen, wenn du in r0 oder egal wo den Wert von
temp2 reinspeicherst und mit SUBI r0, 1 immer erniedrigst (oder DEC),
danach ein BRNE.. SUBI (DEC) kostet 1, BRNE beim RJMP 2, macht 3.

von A.K. (Gast)


Lesenswert?

sbi/sbi durch out mit entsprechend präparierten Registern ersetzen.

Schleife ist auch überflüssig wenn genug Platz im ROM. Einfach den Code
entsprechend oft hintereinander schreiben.

=> 5 Takte pro Sample.

von Martin (Gast)


Lesenswert?

Danke für die Optimierungstips.

@dave
Wenn ich das mit BRNE richtig verstehe dann könnte es so aussehen:
mov r0,temp2 ;Anzahl der Schleifendurchläufe in r0
loop:
     ....
     ....
     dec r0
     brne r0 ; wenn r0 bei 0 angekommen ist, wird rjmp übersprungen
     rjmp loop

@A.K.
Das ist mir etwas zu unflexibel, die Anzahl der Schleifendurchläufe
soll variabel sein.

von luchs2a (Gast)


Lesenswert?

superst ! ich abs noch nicht richtig durchforstet weil ich nich an
meinem rechenr bin aber bis hier kann ichnur sagen danke   ich lads mir
nächste woche  danke schonmal

Mischa

von A.K. (Gast)


Lesenswert?

loop:
     ....
     ....
     dec r0
     brne loop

von Martin (Gast)


Lesenswert?

>brne r0 ; wenn r0 bei 0 angekommen ist, wird rjmp übersprungen
>rjmp loop
Mein Gott, was hab ich da fürn Blödsinn geschrieben.
Danke A.K.

@Mischa
Erschreck dich nur nicht, obwohl ich versucht habe in das ganze Projekt
ein wenig Ordnung hinein zu bringen, kann es auf den ersten Blick
verwirrend wirken.
Und an kann zwar schon Signalverlauf beobachten, es gibt auch noch viel
zu tun.
Und damit du nicht überrascht bist, PC-Software ist für Linux.

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.