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:
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:
De complete sourcecode kan hier gevonden worden.
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