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ß
Vielleicht hilft dieser Link Dir weiter.
Gruß
Peter
http://alternatezone.com/electronics/images/dsoa_cct.gif
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.