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.
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.
Mein Atmega32 Board hat ähnlich wie der Arduino die Pfostenstecker davon gehen dann je zwei Steckbrücken mit 14,5cm Länge zu SCL und SDA. Das mit den niedrigeren Frequenzen werd ich mal ausprobieren
Edit : Das mit den niedrigeren Frequenzen scheint auch nicht zu funktionieren
Geändert von D3nni5 (13.08.2015 um 20:13 Uhr)
Poste doch Deinen Code nochmal.
Eine Vermutung wäre, dass der ATMEGA32 bei der Spannungsversorgung über den Programmer immer in die Brown-Out-Detection und damit in den Reset geht.
Entschuldige, dass ich jetzt erst anworte. Ich habe die Tage noch an einem anderen Projekt gearbeitet und vergessen nochmal hier reinzuschauen.
Der Code sieht folgendermaßen aus:
Code:#define F_CPU 1000000UL #include <avr/io.h> #include <util/delay.h> unsigned char ReadData(void) { TWCR = (1<<TWINT) | (1<<TWEN); while (!(TWCR & (1<<TWINT))); return TWDR; } int main(void) { unsigned char input; DDRB = 0x01; PORTB = 0x01; TWBR = 0x01;; TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); while(!(TWCR & (1<<TWINT))); TWDR = 0b01000000; TWCR = (1<<TWINT) | (1<<TWEN); while (!(TWCR & (1<<TWINT))); TWDR = 0b11111100; TWCR = (1<<TWINT) | (1<<TWEN); while (!(TWCR & (1<<TWINT))); _delay_ms(1000); TWDR = 0b00000100; PORTB = 0x00; TWCR = (1<<TWINT) | (1<<TWEN); while (!(TWCR & (1<<TWINT))); TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO); while(1) { TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); while (!(TWCR & (1<<TWINT))); TWDR = 0b01000001; TWCR = (1<<TWINT) | (1<<TWEN); while (!(TWCR & (1<<TWINT))); input = ReadData(); TWCR = (1<<TWINT) | (1<<TWEN); while (!(TWCR & (1<<TWINT))); TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO); if (input & 0b00000100) { PORTB = 0x01; } else { PORTB = 0x00; } } }
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)
Ich habe gerade eben einen 16Mhz Quarz mit entsprechend zwei 22pF Kondensatoren an den Atmega gelötet und es hat direkt funktioniert. Es scheint so als hätte der Atmega tatsächlich den Quarz des Programmes verwenden.
@HaWe
Danke für die Antwort, auch wenn sich das Problem gerade gelöst hat.
aber gern, n.p.
ich muss zu meiner Schande auch gestehen, dass ich nur ein Rudiment gepostet habe. Nur der Vollständigkeit und Richtigkeit halber, falls andere sich daran versuchen, habe ich den Code oben jetzt in der korrekten Version gepostet!
vG
Helmut
Lesezeichen