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