Forum: Mikrocontroller und Digitale Elektronik I2C master libraryVON pfleury [Fehlersuche]


von D a v i d K. (oekel) Benutzerseite


Lesenswert?

Hi,
ich verwende gerade die überarbeitete LIB von Frank und habe Probleme 
beim Schreiben auf dem I2C. (Atmega88 mit internen 8Mhz)

Dabei habe ich die Adresse mittels Suchroutine ermittelt/validiert und 
komme bei meinem China-I2C-2-HD44780-Adapter (4-Bit Modus only - siehe 
Bucht)
auf die 125 bzw. 0x7D.
- 4k7 als Pullup auf beiden Leitungen.
- Belegung vom PCF8574X zum LCD geprüft (aber das Problem liegt wohl 
eher davor)

Da der Prozessor genau zwischen diesen beiden Zeilen einfriert:
i2c_init();
//bis hier und nicht weiter...
lcd_init();

Oder noch genauer:
i2c_start_wait(LCD_I2C_DEVICE+I2C_WRITE);//(nicht mal bis hier, wenn 
!=0x7D)
//bis hier und nicht weiter...(mit 0x7D)
i2c_write(data);

Liegt es fast auf der Hand, dass ich folgendes Problem haben könnte:
Beitrag "Re: I2C am ATMega88"

Doch ich arbeite mit der C-Version und nicht mit Assembler und finde 
einfach die beiden "SDA_PORT"  & "SCL_PORT" oder ähnliche nirgends in 
der Lib.

Wo liegt mein Denkfehler? Der Port müsste doch irgendwo in der LIB 
definiert oder verwendet worden sein??

osterliste Grüße Oekel

: Bearbeitet durch User
von D a v i d K. (oekel) Benutzerseite


Angehängte Dateien:

Lesenswert?

Da Frank das Bsp. ja auf dem Atmega8 laufen hatte, bin ich gerade das 
folgende Dokument am durchstöbern.

Atmega 8 Vektor:
18 0x011 TWI

Atmega88 Vektor:
25 0x018 TWI

nur wo meine Änderungen im Code Anwendung finden, habe ich noch immer 
nicht auf dem Schirm :(

von Falk B. (falk)


Lesenswert?

@D a v i d K. (oekel)

>ich verwende gerade die überarbeitete LIB von Frank und habe Probleme

Frank? Soso . . .

>Dabei habe ich die Adresse mittels Suchroutine ermittelt/validiert und
>komme bei meinem China-I2C-2-HD44780-Adapter (4-Bit Modus only - siehe
>Bucht)
>auf die 125 bzw. 0x7D.

Glaub ich nicht ganz.

in i2clcd.h steht

1
#define LCD_I2C_DEVICE      0x4E        /**< 8 bit address of port expander, bit#0 must be zero */

https://www.mikrocontroller.net/articles/Port-Expander_PCF8574#I.C2.B2C_Kommunikation

Der PCF8574A hat den Adressraum 0x70 + A[2:0]*2 + R/W
Gültige 8-Bit Adressen sind also

0x70
0x72
0x74
0x76
0x78
0x7A
0x7C
0x7E

>i2c_start_wait(LCD_I2C_DEVICE+I2C_WRITE);//(nicht mal bis hier, wenn
>!=0x7D)
>//bis hier und nicht weiter...(mit 0x7D)
>i2c_write(data);

Dann scheint keiner auf deine Adresse 0x7D zu antworten.

>Liegt es fast auf der Hand, dass ich folgendes Problem haben könnte:
>Beitrag "Re: I2C am ATMega88"

Was bei dir so alles auf der Hand liegt . . . .?

>Doch ich arbeite mit der C-Version und nicht mit Assembler und finde
>einfach die beiden "SDA_PORT"  & "SCL_PORT" oder ähnliche nirgends in
>der Lib.

Logisch, denn diese Lib arbeitet mit den I2C Modul des AVR, dabei sind 
die Pins SDA/SCL fest vorgegeben, also muss man sie auch nicht 
einstellen.

von D a v i d K. (oekel) Benutzerseite


Lesenswert?

Falk B. schrieb:
> @D a v i d K. (oekel)
>
>>ich verwende gerade die überarbeitete LIB von Frank und habe Probleme
>
> Frank? Soso . . .

Sorry Falk, so oft schon geschrieben und dann doch den Namen vertauscht.

>
1
> #define LCD_I2C_DEVICE      0x4E        /**< 8 bit address of port 
2
> expander, bit#0 must be zero */
3
>

Den Wert hatte ich auch überschrieben...
Seltsam, dass er mir mittels
1
void findTWI(){
2
for(uint8_t i = 0; i<255; i++){
3
    uint8_t ret = i2c_start(DevHD44780+I2C_READ);
4
    if ( ret ) {
5
      /* failed to issue start condition, possibly no device found */
6
      i2c_stop();
7
      }else {
8
      ret = i2c_readNak();
9
      i2c_stop();
10
      blinkSlow();
11
    }
12
    
13
}
14
blinkFast();
15
}
 Adresse 0x7D auswertet. (Schon sch... wenn man keinen richtigen 
Debug-Port hat)

> 
https://www.mikrocontroller.net/articles/Port-Expander_PCF8574#I.C2.B2C_Kommunikation
>

> Logisch, denn diese Lib arbeitet mit den I2C Modul des AVR, dabei sind
> die Pins SDA/SCL fest vorgegeben, also muss man sie auch nicht
> einstellen.

Gut, auf dieser Basis werde ich die
> Gültige 8-Bit Adressen sind also....
Noch mal durchgehen. Hoffe es läuft dann. (Werde berichten)

Hatte die i2c-lib schon öfters verwendet und bisher nie Probleme. Es 
fehlt wie immer wohl einfach nur an der Übung. :(

von Falk B. (falk)


Lesenswert?

@ D a v i d K. (oekel)

>Seltsam, dass er mir mittels

>void findTWI(){
>for(uint8_t i = 0; i<255; i++){
>    uint8_t ret = i2c_start(DevHD44780+I2C_READ);

Tja, hier liegt das Problem. Zur Adresse wird der I2C_READ addiert.

0x7D+1=0x7E

Richtigerweise sollte es eigentlich heißen.

i2c_start(DevHD44780 | I2C_READ);

Dann passiert sowas nicht. Ich weiß, das ist in der Lib so drin. Wenn 
man sich an den Hinweis hält und nur gerade Adressen angibt, dann passt 
das auch.

> Adresse 0x7D auswertet. (Schon sch... wenn man keinen richtigen
>Debug-Port hat)

Es gibt schlimmeres.

von D a v i d K. (oekel) Benutzerseite


Lesenswert?

Falk B. schrieb:

> 0x7D+1=0x7E

Passt! Ich danke dir für die Anmerkungen. Nun kann ich doch noch raus 
das Wetter genießen!

Wo lag mein Problem abgesehen von dem +1:

Hab mir den Chip nicht genau genug angeschaut und das "A" in PCF8574A 
übersehen.
Folgefehler: Habe mir nur KURZ-Datenblätter angeschaut, wo ich dann mit 
A3=A4=0 nur auf die 0x4E kam.
Folglich war ich völlig verwirrt mit der großen Abweichung von der 
Testschleife zum Datenblatt und habe weitläufigere Fehler gesucht.

Grüße Oekel

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.