Forum: Mikrocontroller und Digitale Elektronik Ansteuerung ADC0820 mit Atmega


von Daddel (Gast)


Lesenswert?

Liebe Community,

ich benötige zur Erfassung analoger Signale einen ADC, damit ich diese 
mit einem ATmega weiterverarbeiten kann. Als ADC kommt der Baustein 
ADC0820 zum Einsatz, da er wesentlich schneller ist, als die 
integrierten Konverter des Atmegas.

Nun zu meiner Frage:

Wie genau erfolgt die Ansteuerung des Bausteins? Hat da schon jemand 
Erfahrung?

Aus dem Datenblatt meine ich folgende Informationen zu beziehen:

- Unterstützung 2er Modi: Ich möchte WR-RD-Modus verwenden, da ich so 
mit besonders wenig Steuerleitungen auskomme. -> PIN MODE auf 1.
- CS\ und RS\ können konstant auf Low sein. Der ADC ist dann im 
Dauerbetrieb.
- WR\ ist der einzige Steuereingang den ich benötige! RICHTIG?
--> Immer wenn WR\ seine steigende Flanke hat, wird ein neuer Analogwert 
konvertiert. Nach 800ns, spätenstens 1300ns steht der Wert an den 
digitalen Ausgängen zur Verfügung. Der Wert bleibt solange am Ausgang 
erhalten, bis die nächste steigende Flanke an WR\ erfolgt.
--> WR muss min. 500ns auf Low sein.

- INT\ kann mir anzeigen, dass Daten am Ausgang zur Verfügung stehen, 
bzw. gültig sind. Benötigen tue ich ihn jedoch nicht, wenn ich die 
1300ns abwarte, oder?

Die Infos sind im Wesentlichen von den Seiten 10, 12 und 13 des 
Datenblatts.

Kann man das so machen?

Vielen Dank im Voraus!!

Gruß

von Peter W. (pe_wi)


Lesenswert?

Vielleicht hilft dieser Link Dir weiter.


Gruß
       Peter


http://alternatezone.com/electronics/images/dsoa_cct.gif

von Horst S. (Gast)


Lesenswert?

Hi Daddel,

ich hab beide Varianten aus dem Datenblatt im Angebot, leider nur in 
Assembler, ich hoffe Du kommst klar.


Ich habe mich letztens mal an einer Stereo-Ultraschallanalyse versucht.
Die Wandlerroutine einmal im RD-Mode:
1
//ADC 0820 READ MODE 
2
GetAD:
3
  //Start Left channel
4
  cbi _SFR_IO_ADDR(PORTB), ADL_RD
5
  //Start right channel
6
  cbi _SFR_IO_ADDR(PORTD), ADR_RD
7
  
8
  //Wait for left channel complete (INT line)  
9
GetAD_Left_Loop:
10
  sbic _SFR_IO_ADDR(PINB), ADL_INT
11
  jmp GetAD_Left_Loop
12
13
14
  //Wait for right channel complete (INT line)  
15
GetAD_Right_Loop:
16
  sbic _SFR_IO_ADDR(PIND), ADR_INT
17
  jmp GetAD_Right_Loop
18
  
19
20
21
  //set data left channel to RAM
22
  in d0, _SFR_IO_ADDR(PINA)
23
  st X+, d0  
24
25
  //set data right channel to RAM
26
  in d0, _SFR_IO_ADDR(PINC)
27
  
28
  
29
  st X+, d0  
30
  
31
32
33
  // Reset RD lines
34
  sbi _SFR_IO_ADDR(PORTB), ADL_RD 
35
  sbi _SFR_IO_ADDR(PORTD), ADR_RD // Reset RD line
36
  
37
38
  ret

Kleine Benennungslegende dazu:
- d0= Register r16, das kommt noch aus meiner 68000er-Zeit
- ADL_/ADR_: linker/rechter Wandler
- _RD/_WR/_INT: So benannte Signale des 0820

ADL_RD ist also z.B. die RD-Leitung des linken Wandlers.


Hat mir so etwa 7 Samples/ 40KhZ-Welle gebracht.



Der RD-WR Mode ist allerdings deutlich schneller (12 Samples/ 
40KhZ-Welle) und trotzdem die Beschreibung mit Untermodi schon etwas 
umfangreicher ist, wird die Ansteuerung eigentlich um nix komplizierter.
1
//ADC 0820 READ-WRITE MODE (STAND ALONE)
2
GetAD_WR_Mode:
3
4
  //SET WR LINE LOW FOR AT LEAST 600ns
5
  //Start Left channel
6
  cbi _SFR_IO_ADDR(PORTB), ADL_WR //2
7
  //Start right channel
8
  cbi _SFR_IO_ADDR(PORTD), ADR_WR //2
9
10
        //Fill up 600 ns at 20MHz
11
  nop
12
  nop
13
  nop
14
  nop
15
  nop
16
  nop
17
  nop
18
  nop
19
20
  //Trigger up Left channel
21
  sbi _SFR_IO_ADDR(PORTB), ADL_WR //2
22
  //Trigger up right channel
23
  sbi _SFR_IO_ADDR(PORTD), ADR_WR //2
24
25
  
26
  //Wait for left channel complete (INT line)  
27
GetAD_WR_Mode_Left_Loop:
28
  sbic _SFR_IO_ADDR(PINB), ADL_INT
29
  jmp GetAD_WR_Mode_Left_Loop
30
31
32
  //Wait for right channel complete (INT line)  
33
GetAD_WR_Mode_Right_Loop:
34
  sbic _SFR_IO_ADDR(PIND), ADR_INT
35
  jmp GetAD_WR_Mode_Right_Loop
36
37
38
  //set data left channel to RAM
39
  in d0, _SFR_IO_ADDR(PINA)
40
  st X+, d0  
41
42
  //set data right channel to RAM
43
  in d0, _SFR_IO_ADDR(PINC)
44
  st X+, d0  
45
46
  ret

Wenn Du nur einen Wandler hast, wird's noch ein wenig fixer (weniger 
Befehle). Ggf. kannst Du weiter optimieren, wenn Du das Wegschreiben der 
Daten erst in der Warteschleife des nächsten Lesens machst.

Warum willst Du auf die INT-Leitung verzichten?

von (unknown) (Gast)


Lesenswert?

hi to all friend

one question :

in write/read mode , is used RD line????? and why??????

thanks.

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.