Forum: Mikrocontroller und Digitale Elektronik I2C mit Atmega8 zu PCF8574P Portexpander


von Michael G. (groebar)


Lesenswert?

Hallo an alle, ich habe folgendes Problem:
Um mich in die I2C-Materie einzuarbeiten habe ich einen Testaufbau mit 
einem Atmega8L-8PU (angeschlossen über USB-programmer an den PC) und dem 
PCF8574P Portexpander aufgebaut.
An den Portexpander sind nur Dioden angeschlossen, also nur ein/aus.

Das (Haupt-)Programm sieht folgendermaßen aus:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <D:\Projekt\_AVR\_Bibliotheken\delay.h>
4
#include <D:\Projekt\_AVR\I2C_25122012\original Example\i2cmaster.h>
5
6
7
#ifndef F_CPU
8
#define F_CPU 16000000
9
#endif
10
11
#define ADDR 0x20            //Adresse vom I/O Portexpander PCF8574P
12
13
14
15
void I2C_write(uint8_t DATA);
16
17
void long_delay(uint16_t ms)        //Warteschleifenfunktion
18
{  for(; ms>0; ms--) _delay_ms(1);
19
}
20
21
22
int main(void)
23
{  cli();
24
    i2c_init();
25
    sei();                 // now enable interrupt
26
  
27
  uint8_t i=0,DATA=0;
28
while(1)                            
29
  {  
30
      DATA=i;
31
      if((DATA|i)>=127)
32
      i=0;
33
      i++;
34
      I2C_write(DATA);
35
      long_delay(100);      //Verzögerung bis die Nächste Zahl geladen wird.      
36
37
  }
38
}
39
40
41
void I2C_write(uint8_t DATA)
42
{  
43
    i2c_start(ADDR+I2C_WRITE);
44
    i2c_write(DATA);  
45
    i2c_stop();  
46
}



Ich hoffe das haut jetzt mit der Formatierung hin ^^
Beim Programm dabei sind noch die "i2cmaster.h" und "twimaster.c".
Das ganze habe ich von hier:
http://www.jtronics.de/avr-projekte/library-i2c-twi-master.html
Wenn gewünscht häng ich die Dateien nochmal dran!

Und bitte nicht böse sein dass ich das nicht selber geschrieben habe, 
ich hab das ganze auf softwarebasis funktionierend, bis unser Lehrer mir 
sagte dass das Blödsinn ist, und das beim Atmega sowieso mit der 
Hardware geht -.-
Naja, wie auch immer, Problem ist, dass so wie das Programm ist nichts 
passiert.

Ich hab SCL und SDA oszillographiert, aber die bleiben die ganze Zeit 
auf 5V.
Die Frage ist jetzt ob ich einen blöden Fehler gemacht habe, oder ob 
irgendwas anderes sein kann!

Ich würde mich über Antworten sehr freuen,

Viele Grüße und noch einen schönen Feiertag,

Groebar



PS:
Frequenz der CPU ist auf 1000000 eingestellt, und ich arbeite mit dem 
AVRStudio4!

Auszug aus dem twimaster.c:
1
/* I2C clock in Hz */
2
#define SCL_CLOCK  1000    //400000 vorher
3
4
5
/*************************************************************************
6
Initialisierung I2C-BUS-Interface, nur einmal!
7
*************************************************************************/
8
void i2c_init(void)
9
{
10
  /* initialize TWI clock: 100 kHz clock, TWPS = 0 => prescaler = 1 */
11
  
12
  TWSR = 1;                         /* no prescaler */
13
  TWBR=125;
14
}

von i2c (Gast)


Lesenswert?

ohne, dass ich den Quelltext angeguckt habe:

Wie sieht der Aufbau elektrisch aus? (Schaltplan?)

Sind Pullups gegen Vcc auf der SDA und SCL?
Weil die I2C-Devices können die Leitungen nur auf Masse ziehen.

von Hans Peter B. (Gast)


Lesenswert?

Der PCF8574 hat die Device-Grund-Adresse 0x40H (A5 ist fix auf "1") und 
nicht auf 0x20 wie der PCA8574
Hans Peter

von Michael G. (groebar)


Lesenswert?

@ i2c:
Pullups sind da, ich geh vom µC auf eine Extraplatine mit dem 
Portexpander, und dort sind die Pullupwiderstände verdrahtet. 
(Durchgemessen)
Danke ^^

@Hans Peter:

Mist, vielen vielen Dank, so ein Datenblatt zu lesen ist schon ziemlich 
schwer ^^ und dann auch noch 0100 umzuwandeln ^^

Wie gesagt, versuch ich morgen noch, aaber müsste dann auf der 
BusLeitung nicht trotzdem etwas passieren?
Diese ist wie gesagt unberührt auf High gewesen...

Danke und gute nacht,

Michael

von Hans Peter B. (Gast)


Lesenswert?

Was hast du nun für eine CPU-Freq, 16MHz wie in der define-Zeile im 
Hauptprogramm festgelegt oder 1MHz wie weiter unten beschrieben?
Weiter würde ich, bei 1MHz  den SCL_CLK um den Faktor ca 4 erhöhen, dann 
stimmt deine Berechnung des TWBR-Wert, allerdings ohne 4-fachen 
PRESCALER. Also TWSR=0.
Hans Peter

von Michael G. (groebar)


Lesenswert?

Oh mein Gott, vielen vielen vielen vielen Dank!
Ich hab jetzt beides einzeln gemacht, nur die Adresse ändern, und dann 
mit der SCL_Clock und TWPS Änderung von dir Hans Peter B.

Hat beides funktioniert!
Vielen Dank an alle!

Blöder Fehler, aber naja :D

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.