Ich freue mich, dass ich helfen konnte!
Gruß, Dirk
Werbung
Ich freue mich, dass ich helfen konnte!
Gruß, Dirk
Es gibt doch noch ein kleines Problem : TWBR steht bei mir ja auf dem Minimum,mit der Formel SCL = CPU/(16+2TWBR*4^TWPS) bekomme ich als Ergebnis SCL = 41666,666666... also ungefähr 41500 (macht ja keinen Sinn aufzurunden)
Das Problem hierbei ist,dass das Programm mit einer Stromversorgung durch den Programmer(mySmartUsb Light) funktioniert. Mit einer 9V Batterie(die auf 5V runtergeregelt wird) allerdings nicht. Kann es sein, dass die Frequenz zu niedrig ist und deshabl der Quarz im Programmer mitbenutzt wird? Die LEDs am PCF8574 können über einen Atmega Port problemlos betrieben werden und bei der PCF8574 Schaltung sind sie ja von Vcc nach P0 bzw P1 geschaltet d.h. daran kanns nicht liegen
Geändert von D3nni5 (13.08.2015 um 16:00 Uhr) Grund: Schreibfehler
Welchen Controller benutzt Du? Hängen die TWI Pins auch am Programmer (als SPI Pins), wenn dieser angesteckt ist?
Ich benutze den Atmega32. Die TWI Pins sind nicht mit dem Programmer verbunden
Wie sind die Fuses gesetzt?
Ist ein Schwing-Quartz am ATMEGA32 angeschlossen?
Pull-ups an SDA und SCL sind vorhanden? So 4,7k jeder?
Hast Du ein Oszi oder einen Logikanalyser ? Dann schau Dir mal die I2C Signale an.
Die Fuses sind so gesetzt, dass die interne Frequenz von 1Mhz mit Startuptime : 6 CK + 0ms benutzt wird.
Es ist noch kein Schwing-Quarz angeschlossen. Ich habe aber ein paar 16Mhz Quarze und genügend 22pF Kondensatoren.
Die Pull-ups haben beide 10k ich kann die aber auch noch runtersetzten.
Habe leider keins von beidem.
Der Taster funktioniert allerdings.
Wie lang sind denn Deine I2C Leitungen?
Ich würde den SCL Takt noch mit kleinerer Frequenz probieren, so 10 oder 20 kHz.
Sonnst fällt mir im Moment nix mehr ein.
ich veerwende diesen Code für Arduino C/C++:
Code:#include <Wire.h> #define ADDR_PCF8574 0x30 void setup() { Wire.begin(); writei2cbyte(ADDR_PCF8574, 0xff); //... } void writei2cbyte(int addr, byte data) { Wire.beginTransmission(addr); Wire.write(data); Wire.endTransmission(); delay(5); } uint8_t readi2cbyte(uint8_t addr, uint8_t reg) { uint8_t bdata; Wire.beginTransmission(addr); Wire.write(reg); // target data register number Wire.endTransmission(); Wire.requestFrom(addr, reg); // Request 1 bytes from PCF8574 while(Wire.available() < 1); // Wait for byte to become available bdata = Wire.read(); return(bdata); } //... uint8_t bitmask = readi2cbyte(ADDR_PCF8574, 1); // read all btn states (bitmask) at reg 1 if(bitRead(bitmask,1) {...} else if(bitRead(bitmask,2) {...} //...
Geändert von HaWe (18.08.2015 um 06:58 Uhr)
Lesezeichen