Forum: Mikrocontroller und Digitale Elektronik Keine Daten aus AD7793


von Andreas R. (blackpuma)


Lesenswert?

Hallo Leute,

wie vieleicht schon der eine oder andere gesehen hat baue ich mir eine 
Schaltung zum Messen eines PT1000. Die Platine ist fertig und ich habe 
es an meinem PIC test Board angeschlossen. Leider bekomme ich keine 
Daten aus dem Chip. Vielleicht fällt euch bei meinem Code was auf.
1
#include <p18f46k20.h>
2
#include <usart.h>
3
#include <delays.h>
4
#include <spi.h>
5
#include <stdlib.h>
6
7
8
/* Definitions */
9
#define BAUD 9600
10
#define CLK 8000000
11
#define UREF 1,17
12
#define ADSTEPS 16777216
13
#define STEPRANGE (UREF/ADSTEPS)
14
15
/**/
16
void getVREF();
17
18
signed char WriteSPI(  unsigned char data_out )
19
{
20
    SSPBUF = data_out;
21
    while( !SSPSTATbits.BF);
22
    return SSPBUF;
23
}
24
25
void getsSPI( unsigned char *rdptr, unsigned char length )
26
{
27
  while ( length )                // stay in loop until length = 0
28
  {
29
    *rdptr++ = getcSPI();         // read a single byte
30
    length--;                     // reduce string length count by 1
31
  }
32
}
33
34
void getVREF()
35
{
36
    unsigned char byte[3];
37
    unsigned long int result = 0;
38
    char buffer[24];
39
40
    // Setup AD7793
41
    PORTCbits.RC0 = 0;      // Chip select
42
43
    putcSPI( 0x28 );        // 00101000 Write IO Register
44
    putcSPI( 0x02 );        // 00000010 210uA an IOUT1 und IOUT2
45
46
    putcSPI( 0x10 );        // 00010000 Write conf register
47
    putcSPI( 0x03 );        // 00000011 BiasOff, gain 2
48
    putcSPI( 0x92 );        // 10000010 int ref, buf on, CH anin3
49
50
    putcSPI( 0x08 );        // 00001000 Write mode register
51
    putcSPI( 0x20 );        // 00100000 single conversation
52
    putcSPI( 0x05 );        // 00001010 16,7 Hz fADC
53
    
54
    while( PORTCbits.SDI );
55
    putcSPI( 0x58 );        // 01011000 Read data register
56
    getsSPI( byte, 3 );
57
58
    result = (unsigned long int)byte[2] * 256 * 256 + (unsigned long int)byte[1] * 256 + (unsigned long int)byte[0];
59
    ultoa( result, buffer );
60
    putsUSART( buffer );    // send back A/D value
61
62
    PORTCbits.RC0 = 1;      // Chip deselect
63
}
64
65
66
void main( void )
67
{
68
    OpenUSART(USART_TX_INT_OFF &
69
            USART_RX_INT_OFF &
70
            USART_ASYNCH_MODE &
71
            USART_EIGHT_BIT &
72
            USART_BRGH_HIGH,
73
            77);
74
    
75
    OpenSPI( SPI_FOSC_64, MODE_00, SMPEND );
76
77
    TRISCbits.TRISC0 = 0;       // output, CS
78
    TRISDbits.TRISD7 = 0;       // output
79
    TRISCbits.TRISC4 = 1;       // input
80
81
  while( 1 )
82
  {
83
     // Blinklicht
84
     PORTDbits.RD7 = 0;
85
     Delay10KTCYx(100);
86
     PORTDbits.RD7 = 1;
87
     Delay10KTCYx(100);
88
89
     getVREF();
90
91
  }
92
}

von Andreas R. (blackpuma)


Lesenswert?

Hallo nochmal,

Ich habe mich jetzt mehr als einen Tag damit herumgeärgert und bin noch 
immer nicht drauf gekommen was da nicht funktioniert. Ich habe den Code 
ein wenig umgeschrieben aber es funktioniert nach wie vor nicht.

Nach dem Auslesen mit putcSPI( AD_DATAREG_READ ); steht immer etwas 
falsches in den Registern. Die meisten Register sind um 1 erhöht.
1
#include <p18f46k20.h>
2
#include <usart.h>
3
#include <delays.h>
4
#include <spi.h>
5
#include <stdlib.h>
6
7
/* Definitions */
8
#define BAUD 9600
9
#define CLK 8000000
10
#define UREF 1,17
11
#define ADSTEPS 16777216
12
#define STEPRANGE (UREF/ADSTEPS)
13
14
#define AD_IOREG_WRITE      0b00101000      //
15
#define AD_IOREG_READ       0b01101000      // 
16
#define AD_STATUSREG_READ   0b01000000
17
#define AD_CONFREG_WRITE    0b00010000
18
#define AD_CONFREG_READ     0b01010000      // 
19
#define AD_MODEREG_WRITE    0b00001000
20
#define AD_MODEREG_READ     0b01001000
21
#define AD_DATAREG_READ     0b01011000      // 
22
23
/**/
24
void getVREF();
25
void getCHECK();
26
void ADreset();
27
28
signed char WriteSPI(  unsigned char data_out )
29
{
30
    SSPBUF = data_out;
31
    while( !SSPSTATbits.BF);
32
    return SSPBUF;
33
}
34
35
void getsSPI( unsigned char *rdptr, unsigned char length )
36
{
37
  while ( length )                // stay in loop until length = 0
38
  {
39
    *rdptr++ = getcSPI();         // read a single byte
40
    length--;                     // reduce string length count by 1
41
  }
42
}
43
44
void ADreset()
45
{
46
    PORTCbits.RC0 = 0;      // Chip select
47
    putcSPI( 0xFF );
48
    putcSPI( 0xFF );
49
    putcSPI( 0xFF );
50
    putcSPI( 0xFF );
51
    PORTCbits.RC0 = 1;      // Chip deselect
52
    Delay1KTCYx(7);         // wait 500 us
53
}
54
55
void getVREF()
56
{
57
    unsigned char byte[3];
58
    unsigned long int result = 0;
59
    char buffer[24];
60
61
    // Setup AD7793
62
    PORTCbits.RC0 = 0;      // Chip select
63
    Delay1KTCYx(14);       // Wake up time 1 ms
64
65
    /* write ioreg */
66
    putcSPI( AD_IOREG_WRITE );      // write IO Register
67
    putcSPI( 0x02 );                // 210uA at IOUT1 and IOUT2
68
69
    putcSPI( AD_CONFREG_WRITE );    // 00010000 Write conf register
70
    putcSPI( 0x01 );                // 00000000 BiasOff, gain 1
71
    putcSPI( 0x82 );                // 10000010 int ref, buf off, CH anin3
72
73
    putcSPI( AD_MODEREG_WRITE );    // 00001000 Write mode register
74
    putcSPI( 0x20 );                // 00100000 single conversation
75
    putcSPI( 0x0A );                // 00001010 16,7 Hz fADC
76
77
    PORTCbits.RC0 = 1;
78
79
    PORTCbits.RC0 = 0;
80
    Delay1KTCYx(14);       // Wake up time 1 ms
81
82
    while( PORTCbits.SDA );         // wait till RDY is low
83
    putcSPI( AD_DATAREG_READ );     // 
84
    byte[2] = ReadSPI();
85
    byte[1] = ReadSPI();
86
    byte[0] = ReadSPI();
87
88
    PORTCbits.RC0 = 1;      // Chip deselect
89
90
    result = (unsigned long int)byte[2] * 256 * 256 + (unsigned long int)byte[1] * 256 + (unsigned long int)byte[0];
91
    ultoa( result, buffer );
92
    putsUSART( buffer );    // send back A/D value
93
}
94
95
/* getCHECK is now working */
96
void getCHECK()
97
{
98
    unsigned char byte[3];
99
    char buffer[24];
100
101
    // Setup AD7793
102
    PORTCbits.RC0 = 0;      // Chip select
103
    Delay1KTCYx(14);       // Wake up time 1 ms
104
105
    /* read ioreg */
106
    putcSPI( AD_IOREG_READ );        // 01101000 Read IO Register
107
    byte[2] = ReadSPI();
108
109
    itoa( (unsigned int)byte[2], buffer );
110
    putrsUSART( "\nIOREG: " );
111
    putsUSART( buffer );    // send back 
112
113
    /* read conf reg */
114
    putcSPI( AD_CONFREG_READ );        // 00010000 read conf register
115
    byte[2] = ReadSPI();
116
    byte[1] = ReadSPI();
117
    
118
    itoa( (unsigned int)byte[2], buffer );
119
    putrsUSART( "\nCONFREG: " );
120
    putsUSART( buffer );    // send back
121
    itoa( (unsigned int)byte[1], buffer );
122
    putsUSART( buffer );    // send back
123
124
    /* read mode reg */
125
    putcSPI( AD_MODEREG_READ );        // 00010000 read conf register
126
    byte[2] = ReadSPI();
127
    byte[1] = ReadSPI();
128
129
    itoa( (unsigned int)byte[2], buffer );
130
    putrsUSART( "\nMODEREG: " );
131
    putsUSART( buffer );    // send back
132
    itoa( (unsigned int)byte[1], buffer );
133
    putsUSART( buffer );    // send back
134
135
    PORTCbits.RC0 = 1;      // Chip select
136
}
137
138
void main( void )
139
{
140
    /* 9600, */
141
    OpenUSART(USART_TX_INT_OFF &
142
            USART_RX_INT_OFF &
143
            USART_ASYNCH_MODE &
144
            USART_EIGHT_BIT &
145
            USART_BRGH_HIGH,
146
            77);
147
148
    /* SPI idle is high, FOSC/64,  */
149
    OpenSPI( SPI_FOSC_64, MODE_11, SMPEND );
150
    
151
    TRISCbits.TRISC0 = 0;       // RC0/CS - output
152
    TRISDbits.TRISD7 = 0;       // D7 - output (LED)
153
    TRISCbits.TRISC4 = 1;       // RC4/SDI - input
154
    TRISCbits.TRISC5 = 0;       // RC5/SDO - output
155
    TRISCbits.TRISC3 = 0;       // RC3/CLK - output
156
    TRISDbits.TRISD0 = 1;       // Taster - input
157
    TRISDbits.TRISD1 = 1;       // Taster - input
158
159
    ADreset();
160
161
  while( 1 )
162
  {
163
     // Blinklicht
164
     PORTDbits.RD7 = 0;
165
     Delay10KTCYx(100);
166
     PORTDbits.RD7 = 1;
167
     Delay10KTCYx(100);
168
169
     if( !PORTDbits.RD0 )
170
     {
171
         Delay1KTCYx(14);       // Wake up time 1 ms
172
         while( !PORTDbits.RD0 );
173
         getVREF();
174
     }
175
176
     if( !PORTDbits.RD1 )
177
     {
178
         Delay1KTCYx(14);       // Wake up time 1 ms
179
         while( !PORTDbits.RD1 );
180
         getCHECK();
181
     }
182
  }
183
}

Bitte um Hilfe!

von Purzel H. (hacky)


Lesenswert?

Diese Wandler verlangen leider, dass man das Datenblatt zeile fuer Zeile 
liest, so umsetzt und auch mit einem Oszilloskop kontrolliert.

Jede Flanke muss im timing stimmen. Die Reihenfolge der Register muss 
stimmen, einfach alles.
Ja. man kann Tage raushauen ... deswegen bleibt man nachher bei genau 
diesem Typ.

von Andreas R. (blackpuma)


Lesenswert?

Gibt es da was das man noch beachten müsste? Ich habe Codebeispiele 
gesehen und auch verwendet. Ich kann ja alle Register beschreiben und 
auch auslesen. Wenn ich allerding das Datenregister auslese dann 
verändert sich der Inhalt der Register.

von i-Troll (Gast)


Lesenswert?

Teilweise ist das Signaltiming eines einzelnen Registers schon 
eigenwillig.

von Andreas R. (blackpuma)


Lesenswert?

Soooooo.... Nach ein paar Tagen quälerei mit diesem Teil spuckt der 
endlich Daten aus die stimmen.

Das Teil ist wirklich sehr eigensinnig. Mit dem C Routinen von Analog 
Devices hat es endlich funktioniert.

von Andreas (Gast)


Lesenswert?

Hallo,
Ich quäle mich auch mit dem Ding rum...
Wo hast du die C Routinen von AD denn gefunden?

Gruß,
Andreas

von Andreas (Gast)


Lesenswert?

Hallo,

Das weiß ich jetzt leider nicht mehr genau. Aber ich denke ich habe sie 
aus dem Datenblatt bzw. App Note vom AD7793.

BG
Andreas

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.