Forum: Mikrocontroller und Digitale Elektronik Adressierproblem Atmega16a über I2C an ADC


von Marius W. (wittkus)


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 ;

von Stefan B. (stefan) Benutzerseite


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.

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.