Forum: Mikrocontroller und Digitale Elektronik twi_routinen


von twianfaenger01 (Gast)


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?
1
// Port B: Ausgabe der Empfangsdaten
2
// Port C: PC1 = SDA -> Stift 15  PC0=SCL -> Stift 14 PCF8574A 
3
// PORT D: Eingabe der Sendedaten
4
#include <avr/io.h>         // Deklarationen
5
#define TAKT 3686400UL      // Systemtakt 3.6864 MHz
6
#define AUSAD 0x70          // Adresse Ausgabeeinheit PCF8574A
7
#define EINAD 0x71          // Adresse Eingabeeinheit PCF8574A
8
#define FAKTOR 44           // Teilerfaktor für 10 kHz Bustakt
9
#define TEILER 1            // Vorteiler TWPS = 1
10
 void init(unsigned char faktor, unsigned char teiler)  // TWI initialisieren
11
 {
12
  TWBR = faktor;            // Bitrate
13
  TWSR = teiler;            // Vorteiler
14
 }
15
 void send(unsigned char adres, unsigned char daten) // Zeichen senden
16
 {
17
  TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);   // Startbedingung
18
  loop_until_bit_is_set(TWCR, TWINT);                  // warte bis fertig
19
  TWDR = adres;                                        // Adresse
20
  TWCR = (1 << TWINT) | (1 << TWEN);                  // senden
21
  loop_until_bit_is_set(TWCR, TWINT);                  // warte bis fertig
22
  TWDR = daten;                                        // Daten
23
  TWCR = (1 << TWINT) | (1 << TWEN);                  // senden
24
  loop_until_bit_is_set(TWCR, TWINT);                  // warte bis fertig
25
  TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);  // Stoppbedingung
26
 }
27
 unsigned char empf(unsigned char adres)            // Zeichen empfangen
28
 {
29
  unsigned char daten;                               // Hilfsvariable
30
  TWCR =  (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); // Startbedingung
31
  loop_until_bit_is_set(TWCR, TWINT);                  // warte bis fertig
32
  TWDR = adres;                                        // Adresse
33
  TWCR = (1 << TWINT) | (1 << TWEN);                  // senden
34
  loop_until_bit_is_set(TWCR, TWINT);                  // warte bis fertig
35
  TWCR = (1 << TWINT) | (1 << TWEN);                  // Empfang starten
36
  loop_until_bit_is_set(TWCR, TWINT);                  // warte bis fertig
37
  daten = TWDR;                                        // Daten abholen
38
  TWCR = (1 << TWINT) | (1 << TWEA) | (1 << TWEN);   // ACK-Impuls senden
39
  loop_until_bit_is_set(TWCR, TWINT);                  // warte bis fertig
40
  TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);  // Stoppbedingung
41
  return daten; 
42
 }
43
 void main (void)             // Hauptfunktion
44
 {
45
  unsigned char awert, ewert; // Zwischenwerte für Test
46
  DDRB = 0xff;                 // Port B gibt Testdaten aus
47
  init(FAKTOR, TEILER);        // TWI Bustakt Initialisierung 
48
  while (1)                   // Arbeitsschleife
49
  {
50
   awert = PIND;              // Testwerte vom Port D eingeben
51
   send(AUSAD, ~awert);       // Komplement senden
52
   ewert = empf(EINAD);       // Empfangsdaten
53
   PORTB = ewert;             // auf Port B ausgeben 
54
  } // Ende  while
55
 } // Ende main

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.