Ansteuerung ADC0820 mit Atmega

Gast #3917469
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ß
Gast #3948426
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?

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.