www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik twi_routinen


Autor: twianfaenger01 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ihr experten!

Möchte grade ein pcf8574f über i2C ansprechen.
Master ist n atmega32.
Leider funzt dies nicht so, wie ich es mir vorstelle, siehe 
Benutzercode:
Und zwar möcht ich Werte von PIND auf diese ausgeben (auf pcf8574f sind 
LEDs angehängt), hab den Quellcode ausm Buch des verlages oldenbourg 
herausgenommen! Interessant wäre, von woher ich die Konstanten wie 
slaveadresse,... bekäme und ob dies richtig konfiguriert ist?
// Port B: Ausgabe der Empfangsdaten
// Port C: PC1 = SDA -> Stift 15  PC0=SCL -> Stift 14 PCF8574A 
// PORT D: Eingabe der Sendedaten
#include <avr/io.h>         // Deklarationen
#define TAKT 3686400UL      // Systemtakt 3.6864 MHz
#define AUSAD 0x70          // Adresse Ausgabeeinheit PCF8574A
#define EINAD 0x71          // Adresse Eingabeeinheit PCF8574A
#define FAKTOR 44           // Teilerfaktor für 10 kHz Bustakt
#define TEILER 1            // Vorteiler TWPS = 1
 void init(unsigned char faktor, unsigned char teiler)  // TWI initialisieren
 {
  TWBR = faktor;            // Bitrate
  TWSR = teiler;            // Vorteiler
 }
 void send(unsigned char adres, unsigned char daten) // Zeichen senden
 {
  TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);   // Startbedingung
  loop_until_bit_is_set(TWCR, TWINT);                  // warte bis fertig
  TWDR = adres;                                        // Adresse
  TWCR = (1 << TWINT) | (1 << TWEN);                  // senden
  loop_until_bit_is_set(TWCR, TWINT);                  // warte bis fertig
  TWDR = daten;                                        // Daten
  TWCR = (1 << TWINT) | (1 << TWEN);                  // senden
  loop_until_bit_is_set(TWCR, TWINT);                  // warte bis fertig
  TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);  // Stoppbedingung
 }
 unsigned char empf(unsigned char adres)            // Zeichen empfangen
 {
  unsigned char daten;                               // Hilfsvariable
  TWCR =  (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); // Startbedingung
  loop_until_bit_is_set(TWCR, TWINT);                  // warte bis fertig
  TWDR = adres;                                        // Adresse
  TWCR = (1 << TWINT) | (1 << TWEN);                  // senden
  loop_until_bit_is_set(TWCR, TWINT);                  // warte bis fertig
  TWCR = (1 << TWINT) | (1 << TWEN);                  // Empfang starten
  loop_until_bit_is_set(TWCR, TWINT);                  // warte bis fertig
  daten = TWDR;                                        // Daten abholen
  TWCR = (1 << TWINT) | (1 << TWEA) | (1 << TWEN);   // ACK-Impuls senden
  loop_until_bit_is_set(TWCR, TWINT);                  // warte bis fertig
  TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);  // Stoppbedingung
  return daten; 
 }
 void main (void)             // Hauptfunktion
 {
  unsigned char awert, ewert; // Zwischenwerte für Test
  DDRB = 0xff;                 // Port B gibt Testdaten aus
  init(FAKTOR, TEILER);        // TWI Bustakt Initialisierung 
  while (1)                   // Arbeitsschleife
  {
   awert = PIND;              // Testwerte vom Port D eingeben
   send(AUSAD, ~awert);       // Komplement senden
   ewert = empf(EINAD);       // Empfangsdaten
   PORTB = ewert;             // auf Port B ausgeben 
  } // Ende  while
 } // Ende main

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.