[Atmega32+TWI_Eeprom] Langzaam

Pagina: 1
Acties:

  • Virgil
  • Registratie: November 2001
  • Laatst online: 01-04 20:21

Virgil

We're not alone

Topicstarter
Ik ben al een tijdje bezig met de atmel mega32 microcontroller, om hierop een extern geheugen aan te sluiten. Door middel van de Two Wire Interface. Ook wel bekend als I2C.

Het probleem is, dat de interrupt set actie:
C:
1
2
3
4
while (!(TWCR & (1<<TWINT)));

/* TWCR = Twi control register */
/* TWINT = TWI Interrupt */

heel lang duurt. Oftewel, de Atmel krijgt pas heel laat de interrupt binnen van de geheugenchip.

De geheugenchip die ik gebruik is de 24LC64. En in principe zou de geheugenchip bij het binnenkrijgen van een start, meteen een interrupt moeten geven. Dit gebeurd echter niet.

Ik heb geprobeerd de bitrate en de prescaler te veranderen. Alleen heeft dit niet geholpen.

Het probleem is dus, dat de actie waarin hij blijft hangen na elke TWI-actie uitgevoerd moet worden. Om zo zeker te zijn dat het geheugenchipje, of 'de device' klaar is met zijn actie.

Hoe zou ik dit op kunnen lossen? En waarom zou het zo lang duren voordat de TWI daadwerkelijk gestart is? Ik weet het niet. De verbindingen met het chipje zijn helemaal goed. En van storing lijkt geen sprake. Er wordt immer gecontroleerd mbv "cDummy" of het ook echt gestart is of niet.

De relevante code:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* Main functie */

void main (void)
{
  lcd_init();
  TWI_init(10, 0);
  
  lcd_data("1Start Test");
  
  cDummy = TWI_start();
  
  if((cDummy != 0x08) && (cDummy != 0x10))
    lcd_data("2Niet gestart");
  else
    lcd_data("2Gestart!");
  
  TWI_stop(); 

  while(1);
}

C:
1
2
3
4
5
6
char TWI_start(void)
//uses TWI_action to generate a start condition, returns status code
{   //TWI_action writes the following command to TWCR: (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
    return TWI_action(1<<TWSTA);
    //return values should be 0x08 (start) or 0x10 (repeated start)
}

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
char TWI_action(char command)
//starts any TWI operation (not stop), waits for completion and returns the status code
//TWINT and TWEN are set by this function, so for a simple data transfer just use TWI_action(0);
{   //make sure command is good
    TWCR = (command|(1<<TWINT)|(1<<TWEN));
    lcd_data("1TWI_action 2");
    //wait for TWINT to be set after operation has been completed
    while(!(TWCR & (1<<TWINT)))
    {
      lcd_data("2waiting...");
    }
    //return status code with prescaler bits masked to zero
    lcd_data("1TWI_action 3");
    return (TWSR & 0xF8);
}

De complete sourcecode kan hier gevonden worden.

Ik was heel, heeeel vroeger SeRRveR


  • farlane
  • Registratie: Maart 2000
  • Nu online
Zou het kunnen zijn dat je zelf de pinnen blijft aansturen zodat de geheugenchip ze niet kan manipuleren ?

Kijk eens met een scope op de draden.

[ Voor 17% gewijzigd door farlane op 30-03-2005 13:05 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • LittleWan
  • Registratie: Februari 2003
  • Laatst online: 13-03 18:21
Ik ken niets van de atmega maar uit je code zie ik dat de twi interface niet softwarematig geschreven is.
misschien ligt het aan je interrupts? moet je die niet aanzetten of zo?

http://www.sillevl.be - blog http://www.sillevl.be/blog - flickr http://www.flickr.com/sillevl