1 | #define AD7705_CS_OUT() sbi(DDRD,5) // CS an PD5 auf Ausgabe setzen
|
2 | #define AD7705_CS_LOW() cbi(PORTD,5) // CS an PD5 low setzen
|
3 | #define AD7705_CS_HIGH() sbi(PORTD,5) // CS an PD5 high setzen
|
4 | #define AD7705_DRDY (PIND & 0x40)// 0100 0000 PD6: test for DRDY
|
5 |
|
6 | BYTE data_h, data_l; // 2 bytes = zusammen 16bit
|
7 | BYTE dummy;
|
8 | unsigned int data;
|
9 |
|
10 | delay_ms(1000); // warte bis AD7705 sicher eingeschwungen
|
11 |
|
12 | AD7705_CS_HIGH(); // 125ns HI
|
13 |
|
14 | // SPI: Takt etc.
|
15 | SPCR = (0<<SPIE)|(0<<SPE)|(0<<DORD)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA)|(1<<SPR1)|(1<<SPR0);
|
16 | sbi(SPSR,SPI2X); // 250kHz: 4MHz muesste auch gehen lt. Datenblatt S.8
|
17 | // 4us-Takt zu sehen. 250kHz ok.
|
18 |
|
19 | USART_Tx_msg(PSTR("\nSPI programmiert\n")); // Meldung ausgeben
|
20 |
|
21 | // 0x20 schreiben in command register
|
22 | // active channel Ain1(+)/Ain1(−), next operation write to clock register
|
23 | AD7705_CS_LOW(); // CS low vor Schreiben SPI
|
24 | sbi(SPCR,SPE); // SPI aktiv schalten
|
25 | SPDR = 0x20; // put byte 'out' in SPI data register for output
|
26 | // 0010 0000 write clock register, normal, CH0
|
27 | while(!(SPSR & (1<<SPIF))); // wait for transfer complete, poll SPIF-flag
|
28 | dummy = SPDR; // read value in SPI data reg.
|
29 | // Byte nicht weiter genutzt
|
30 | cbi(SPCR,SPE); // SPI deaktiv schalten
|
31 | AD7705_CS_HIGH(); // CS hi nach Schreiben SPI
|
32 |
|
33 | USART_Tx_msg(PSTR("0x20 ausgegeben\n")); // Meldung ausgeben
|
34 |
|
35 | // 0x0C schreiben in clock register
|
36 | // master clock enabled, 4.9512MHz clock, set output rate to 50Hz
|
37 | AD7705_CS_LOW(); // CS low vor Schreiben SPI
|
38 | sbi(SPCR,SPE); // SPI aktiv schalten
|
39 | SPDR = 0x0C; // put byte 'out' in SPI data register for output
|
40 | // 0000 1100 teilt 4.9MHz durch 2, 50Hz
|
41 | while(!(SPSR & (1<<SPIF))); // wait for transfer complete, poll SPIF-flag
|
42 | dummy = SPDR; // read value in SPI data reg.
|
43 | // Byte nicht weiter genutzt
|
44 | cbi(SPCR,SPE); // SPI deaktiv schalten
|
45 | AD7705_CS_HIGH(); // CS hi nach Schreiben SPI
|
46 |
|
47 | USART_Tx_msg(PSTR("0x0C ausgegeben\n")); // Meldung ausgeben
|
48 |
|
49 | // 0x10 schreiben in command register
|
50 | // active channel Ain1(+)/Ain1(−), next operation write to setup register
|
51 | AD7705_CS_LOW(); // CS low vor Schreiben SPI
|
52 | sbi(SPCR,SPE); // SPI aktiv schalten
|
53 | SPDR = 0x10; // put byte 'out' in SPI data register for output
|
54 | // 0001 0000 Wahl setup register
|
55 | while(!(SPSR & (1<<SPIF))); // wait for transfer complete, poll SPIF-flag
|
56 | dummy = SPDR; // read value in SPI data reg.
|
57 | // Byte nicht weiter genutzt
|
58 | cbi(SPCR,SPE); // SPI deaktiv schalten
|
59 | AD7705_CS_HIGH(); // CS hi nach Schreiben SPI
|
60 |
|
61 | USART_Tx_msg(PSTR("0x10 ausgegeben\n")); // Meldung ausgeben
|
62 |
|
63 | // 0x40 schreiben ins setup register
|
64 | // gain=1, bipolar, buffer off, clear FSYNC, self calibration
|
65 | AD7705_CS_LOW(); // CS low vor Schreiben SPI
|
66 | sbi(SPCR,SPE); // SPI aktiv schalten
|
67 | SPDR = 0x44; // put byte 'out' in SPI data register for output
|
68 | // 0100 0100 self calib CH0, no buff, unipol, FSYNC start
|
69 | while(!(SPSR & (1<<SPIF))); // wait for transfer complete, poll SPIF-flag
|
70 | dummy = SPDR; // read value in SPI data reg.
|
71 | // Byte nicht weiter genutzt
|
72 | cbi(SPCR,SPE); // SPI deaktiv schalten
|
73 | AD7705_CS_HIGH(); // CS hi nach Schreiben SPI
|
74 | // CS wegnehmen bevor DRDY ausgewertet: vgl. S.32
|
75 |
|
76 | USART_Tx_msg(PSTR("0x44 ausgegeben\n")); // Meldung ausgeben
|
77 |
|
78 | while (AD7705_DRDY); // warten bis fertig
|
79 |
|
80 | USART_Tx_msg(PSTR("data ready \n")); // Meldung ausgeben
|
81 |
|
82 | // Datenwerte einlesen
|
83 | while (1){
|
84 | // 0x38 schreiben ins command register -> Daten auslesen
|
85 | // set next operation for 16 bit read from data register
|
86 | AD7705_CS_LOW(); // CS low vor Schreiben SPI
|
87 | sbi(SPCR,SPE); // SPI aktiv schalten
|
88 | SPDR = 0x38; // put byte 'out' in SPI data register for output
|
89 | // 0011 1000 spreche Datenregister an, lesend
|
90 | while(!(SPSR & (1<<SPIF))); // wait for transfer complete, poll SPIF-flag
|
91 | dummy = SPDR; // read value in SPI data reg.
|
92 | // Byte nicht weiter genutzt
|
93 | cbi(SPCR,SPE); // SPI deaktiv schalten
|
94 | AD7705_CS_HIGH(); // CS hi nach Schreiben SPI
|
95 |
|
96 | USART_Tx_msg(PSTR("0x38 ausgegeben -> data anfordern\n")); // Meldung
|
97 | // warte auf Daten
|
98 | while (AD7705_DRDY); // warten bis fertig
|
99 |
|
100 | USART_Tx_msg(PSTR("data ready \n")); // Meldung ausgeben
|
101 |
|
102 | AD7705_CS_LOW(); // CS low vor Schreiben SPI
|
103 | sbi(SPCR,SPE); // SPI aktiv schalten
|
104 | SPDR = 0x00; // put byte 'out' in SPI data register for output
|
105 | while(!(SPSR & (1<<SPIF))); // wait for transfer complete, poll SPIF-flag
|
106 | data_h = SPDR; // read value in SPI data reg.
|
107 | SPDR = 0x00; // put byte 'out' in SPI data register for output
|
108 | while(!(SPSR & (1<<SPIF))); // wait for transfer complete, poll SPIF-flag
|
109 | data_l = SPDR; // read value in SPI data reg.
|
110 | cbi(SPCR,SPE); // SPI deaktiv schalten
|
111 | AD7705_CS_HIGH(); // CS hi nach Schreiben SPI
|
112 |
|
113 | USART_Tx_msg(PSTR("data_h:")); // Meldung ausgeben
|
114 | USART_Tx_int(data_h);
|
115 | USART_Tx_msg(PSTR("\n")); // Meldung ausgeben
|
116 | USART_Tx_msg(PSTR("data_l:")); // Meldung ausgeben
|
117 | USART_Tx_int(data_l);
|
118 | USART_Tx_msg(PSTR("\n")); // Meldung ausgeben
|
119 |
|
120 | data= ((((unsigned int)data_h) << 8) | (unsigned int)data_l);
|
121 | USART_Tx_msg(PSTR("\nADC-Wert: ")); // Meldung ausgeben
|
122 | USART_Tx_int(data);
|
123 | USART_Tx_msg(PSTR("\n")); // Meldung ausgeben
|
124 | }
|