| 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 | }
 |