Erstmal vielen Dank Klebwax und Sternthaler für eure Geduld und Ausdauer.
	
		
			
			
				Soo schwer ist 
I2C nicht. Ich benutze dazu keine Libraries, die "paar" Zeilen mach ich selber ...
			
		
 
	 
 Klar, das ist der richtige Ansatz. Bisher hatte ich die Anleitungen dazu in der Dokumentation von Fleury undoder von Atmel schon nach den ersten Zeilen wegen massiven Nichtverstehens weggelegt. Sorry. Das hatte mir schon vor vielen Monaten Schwierigkeiten gemacht - damals konnte ich nie schnellere I2C-Taktraten als 100 kHz störungsfrei fahren :-/ Hier bin ich mittlerweile mit so ner Art full speed (ok ok, da gibts natürlich Bremser vom Slave) störungsfrei *lichtblick*
Grundlagen: Dokumentation zum mega1284 : 8272D–AVR–05/12 und die verwendete Bibliothek von PFleury : i2cmaster.zip
Euer Entgegenkommen nutze ich mal noch mehr aus und versuche mal langsam mein Nicht-Verständnis abzubauen. Es fängt ja schon mit der von mir verwendeten Bibliothek an (Peter Fleurys I2C Master library).
	Code:
	Erklärung in der Dokumentation zur Bibliothek (siehe obigen Link "... Master lib..") :
unsigned char i2c_start     (      unsigned char      addr      )      
Issues a start condition and sends address and transfer direction.
Parameters:
        addr     address and transfer direction of I2C device
Return values:
        0     device accessible
        1     failed to access device 
Hier die Startsequenz, stimmt im Wesentlichen mit der Dokumentation zum mega1284 überein.
/*************************************************************************    
  Issues a start condition and sends address and transfer direction.
  return 0 = device accessible, 1= failed to access device
*************************************************************************/
unsigned char i2c_start(unsigned char address)
{
    uint8_t   twst;
    // send START condition
    TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
    // wait until transmission completed
    while(!(TWCR & (1<<TWINT)));
    // check value of TWI Status Register. Mask prescaler bits.
    twst = TW_STATUS & 0xF8;
    if ( (twst != TW_START) && (twst != TW_REP_START)) return 1;
    // send device address
    TWDR = address;
    TWCR = (1<<TWINT) | (1<<TWEN);
    // wail until transmission completed and ACK/NACK has been received
    while(!(TWCR & (1<<TWINT)));
    // check value of TWI Status Register. Mask prescaler bits.
    twst = TW_STATUS & 0xF8;
    if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) return 1;
    return 0;
}/* i2c_start */
/*************************************************************************
 Hier fehlt >für mich< schon mal der Wert für TW_STATUS. In der Atmeldokumentation steht dazu TWSR z.B. auf Seite 220 bei Check value of TWI Status Register :
	Code:
	if ((TWSR & 0xF8) != START)
ERROR();
 und pfleury schreibt dazu
	Code:
	    // check value of TWI Status Register. Mask prescaler bits
    twst = TW_STATUS & 0xF8;
 In myfile.lls finde ich dazu:
	Code:
	    // check value of TWI Status Register. Mask prescaler bits.
    twst = TW_STATUS & 0xF8;
     25c:    80 91 b9 00     lds    r24, 0x00B9
     260:    88 7f           andi    r24, 0xF8    ; 248
    if ( (twst != TW_START) && (twst != TW_REP_START)) return 1;
     262:    88 30           cpi    r24, 0x08    ; 8
     264:    21 f0           breq    .+8          ; 0x26e <i2c_start+0x22>
     266:    80 31           cpi    r24, 0x10    ; 16
     268:    11 f0           breq    .+4          ; 0x26e <i2c_start+0x22>
     26a:    81 e0           ldi    r24, 0x01    ; 1
     26c:    08 95           ret
 und weiter oben:
	Code:
	void i2c_init(void)
{
  /* initialize TWI clock: 100 kHz clock, TWPS = 0 => prescaler = 1 */
  
  TWSR = 0;                         /* no prescaler */
     240:    10 92 b9 00     sts    0x00B9, r1
  TWBR = ((F_CPU/SCL_CLOCK)-16)/2;  /* must be > 10 for stable operation */
     244:    8c e0           ldi    r24, 0x0C    ; 12
     246:    80 93 b8 00     sts    0x00B8, r24
}/* i2c_init */
     24a:    08 95           ret
 Und da setzts bei mir aus - ob das TWIStatusregister TWSR richtig angegeben ist. Und .. ich finde in den Quellen kein define für das TWSR . . .
Einfach wäre es jetzt im fleury-code das TWI_TW_STATUS durch TWSR zu ersetzen. Aber es wäre eben experimentelle Softwareentwicklung :-/
Danke im Voraus!
Nachtrag:
in der m1284def.inc steht bei "... TWI ..." nur:
	Code:
	; TWSR - TWI Status Register
.equ    TWPS0    = 0    ; TWI Prescaler
.equ    TWPS1    = 1    ; TWI Prescaler
.equ    TWS3    = 3    ; TWI Status
.equ    TWS4    = 4    ; TWI Status
.equ    TWS5    = 5    ; TWI Status
.equ    TWS6    = 6    ; TWI Status
.equ    TWS7    = 7    ; TWI Status
 
						
					
Lesezeichen