mikrocontroller.net

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


Autor: Marius W. (wittkus)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <avr/io.h>
#include <avr/interrupt.h>

#define ADC_SCHREIBEN 0x90
#define ADC_LESEN  0x91
#define BITFAKTOR 20
#define TEILER 1
unsigned char Data_TWI[1]={0};



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


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

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

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

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

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

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

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

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




void read_adc(unsigned char adres_read)

{
  int i = 0;

  
  
  TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);   // Startbedingung

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

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


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

  //PORTA = 0x01;  

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

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

  
  while (i <=1) {  

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

  Data_TWI[i]=TWDR;

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

  
  
  loop_until_bit_is_set(TWCR, TWINT);

  i++;
  
  }

  
  
  TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);  // Stoppbedingung

  i = 0;
}



  int  main(void)                    //Hauptfunktion

{

  sei();

  init(BITFAKTOR,TEILER);

  conf_send(ADC_SCHREIBEN);
  
  while (1)
  {

  read_adc(ADC_LESEN);
  
  }

return 0 ;

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.