Adressierproblem Atmega16a über I2C an ADC

OP #1896056
Lesenswert?

Moin,

versuche mich gerade mittels Datenblatt vom Atmega16a und ADS1110 ADC an 
der I2C Kommunikation lang zu hangeln.

Habe jetzt nur das Problem, dass anscheinend der Schreibzugriff und die 
Konfiguration von dem ADC Klappt. Würde dann gerne die 2 Bytes aus dem 
Outputregister des ADC in den µC laden und da hab ich nun das Problem, 
dass er vermutlich bei dem Lesezugriff auf den ADC hängen bleibt. Hab es 
mir gerade mal auf dem Oszilloskop angeguckt. Der µC sendet wohl immer 
wieder die "Lese"Adresse vom ADC und bekommt darauf kein ACK.

Die 7-Bit Adresse vom ADC ist 1001 000 . Da es ja nicht viel Variation 
bei der Adresse gibt ( R/W-Bit - 0/1) weiß ich leider nicht weiter.

Programm:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3

4
#define ADC_SCHREIBEN 0x90
5
#define ADC_LESEN  0x91
6
#define BITFAKTOR 20
7
#define TEILER 1
8
unsigned char Data_TWI[1]={0};
9

10

11

12
void init(unsigned char bitfaktor, unsigned char teiler)
13
{
14
  DDRA = 0xff;
15
  TWBR = bitfaktor;                   // Bitfaktor für Bitrate in TWBR Register schreiben
16
  TWSR = teiler;                    // Teiler für Berechnungsformel in TWSR Register schreiben
17
}
18

19

20
void conf_send(unsigned char adres_write)          // Konfiguration an ADC senden
21
{
22
  unsigned char configuration = 0x04;          //Konfigurationsbyte für den ADC
23
  
24
  TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);   // Startbedingung
25
  
26
  loop_until_bit_is_set(TWCR, TWINT);          // warten bis Interrupt kommt (Start eingeleitet)
27

28
  TWDR = adres_write;                  // Laden der ADC Adresse(schreiben) ins TWI Datenregister
29

30
  TWCR = (1 << TWINT) | (1 << TWEN);          // Senden 
31

32
  loop_until_bit_is_set(TWCR, TWINT);          // warten bis Interrupt kommt
33

34
  TWDR = configuration;                // Laden des Konfigurationsbyte in das TWI Datenregister
35

36
  TWCR = (1 << TWINT) | (1 << TWEN);          // Senden 
37

38
  loop_until_bit_is_set(TWCR, TWINT);          // warten bis Interrupt kommt
39

40
  TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);  // Ende einleiten
41
}
42

43

44

45

46
void read_adc(unsigned char adres_read)
47

48
{
49
  int i = 0;
50

51
  
52
  
53
  TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);   // Startbedingung
54

55
  loop_until_bit_is_set(TWCR, TWINT);          // warten bis Interrupt kommt (Start eingeleitet)
56

57
  TWDR = adres_read;                  // Laden der ADC Adresse(lesen) ins TWI Datenregister
58

59

60
  TWCR = (1 << TWINT) | (1 << TWEN);          // Senden 
61

62
  //PORTA = 0x01;  
63

64
  loop_until_bit_is_set(TWCR, TWINT);          // warten bis Interrupt kommt
65

66
  //PORTA = 0x04;
67
  
68
  TWCR = (1 << TWINT) | (1 << TWEN);          // Empfang starten
69

70
  
71
  while (i <=1) {  
72

73
  loop_until_bit_is_set(TWCR, TWINT);          // warten bis Interrupt kommt 
74

75
  Data_TWI[i]=TWDR;
76

77
  TWCR = (1 << TWINT) | (1 << TWEA) | (1 << TWEN);   // ACK-Impuls senden
78

79
  
80
  
81
  loop_until_bit_is_set(TWCR, TWINT);
82

83
  i++;
84
  
85
  }
86

87
  
88
  
89
  TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);  // Stoppbedingung
90

91
  i = 0;
92
}
93

94

95

96
  int  main(void)                    //Hauptfunktion
97

98
{
99

100
  sei();
101

102
  init(BITFAKTOR,TEILER);
103

104
  conf_send(ADC_SCHREIBEN);
105
  
106
  while (1)
107
  {
108

109
  read_adc(ADC_LESEN);
110
  
111
  }
112

113
return 0 ;
Persönliche Seite #1896216
Lesenswert?

Lt. Datenblatt ist die Bezeichnung ADS1110 für die I2C-Adresse noch 
nicht aussagefähig genug. Es gibt acht verschiedene Expemplare. Welche 
Markierung hat der IC? Deine Adresse gilt für die Markierung ED0

Sind deine I2C-Routinen nachgewiesen funktionsfähig mit einem anderen 
I2C-IC? Wenn nicht dann vielleicht im Zwischenschritt eine bewährte 
Library benutzen z.B. die I2C-Master-Library von Peter Fleury. Adresse 
steht im TWI-Artikel im Wiki. Und dann vielleicht nur mal versuchen den 
Status auszulesen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren