T.Assies
Ik zie dingen die je nooit voor mogelijk hield. Ik maak ze mogelijk. Ik kan je pijn en lijden laten zien. In tegenslag vind ik hoop, in de verhalen die ik hoor inspiratie. Ik kan je veel vertellen. Wat ik doe? Ik ontdek. Mijn wereld is jouw wereld.
Hallo,
Ik ben bezig om een 24C256 eeprom te gebruiken voor opslag van data, ik maak gebruik van een 16F877A met de ingebouwde I2C bus. Ik heb van microchip een grote presentatie gevoden over het implementeren van I2C maar ik krijg de code met geen mogelijkheid werkend.. Vandaar mijn vraag..
De SCL en SDA van de EEPROM en de PIC zitten aan elkaar met pullups van 2,2 K Ohm. Als output aan de pic heb ik 2 ledjes en 2x DAC (Die werken goed), en de output daarkan kan ik in X/Y mode op de scoop mooi zien.
Wat ik doe: Ik schrijf een byte weg in het geheugen van het EEPROM en probeer die weer uit te lezen.. Hetgeen wat eruit komt is echter niet hetzelfde wat er in gaat..
Ik doe het als volgt:
-start
-Adres van de rom sturen incl Write bit
-Wacht op ACK
-Stuur de MSB's van het geheugen adres
-Wacht op ACK
-Stuur de LSB's
-Wacht op ACK
-Stuur de data
-wacht op ack
-stop
Het lezen:
-start
-adres met write bit
-wacht op ACK
-MSB sturen
-wacht op ACK
-LSB sturen
-Wacht op ACK
-RESTART
-Adres met read bit
-wacht op ACK
-vang de data op
-stuurt een NACK
-en een STOP
Lijkt mij de juiste manier, staat ook uitgebreid beschreven in de datasheet en de presentatie van microchip.. maar toch wil het niet en ik heb op dit moment geen flauw idee meer wat er nu fout kan zitten.
Dit is de code die ik gebruik:
Momentje komt zo online
Heeft iemand enig idee wat ik fout zou kunnen doen..?
Edit:
Dit is de code:
http://members.chello.nl/g.assies/I2Ctest.asm
Ik heb nog steeds geen idee wat er fout zit, er komen geen I2C fouten.. alles doet het zoals het zou moeten doen maar toch werkt het niet!!
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
-t'was zever'
[Bericht gewijzigd door free_electron op ]
T.Assies
Ik zie dingen die je nooit voor mogelijk hield. Ik maak ze mogelijk. Ik kan je pijn en lijden laten zien. In tegenslag vind ik hoop, in de verhalen die ik hoor inspiratie. Ik kan je veel vertellen. Wat ik doe? Ik ontdek. Mijn wereld is jouw wereld.
Op 7 juni 2006 20:09:24 schreef free_electron:
bij het lezen is het address ZONDER write bit !!!!kzal sebiet eens naar die code kijken.
Je hebt 2 manieren van lezen: Lezen vanaf het huidige adres, dan moet je idd gewoon het adres + readbit geven
En je hebt Lezen vanaf willekeurige locatie, dan doe je eerst een dummywrite naar dat adres om de interne pointer daar heen te laten wijzen, en daarna een restart en adres + read bit
Dat is voor zover ik het uit de datasheet heb begrepen!
Edit bij deze, uit de datasheet:
T.Assies
Ik zie dingen die je nooit voor mogelijk hield. Ik maak ze mogelijk. Ik kan je pijn en lijden laten zien. In tegenslag vind ik hoop, in de verhalen die ik hoor inspiratie. Ik kan je veel vertellen. Wat ik doe? Ik ontdek. Mijn wereld is jouw wereld.
zie hieronder
[Bericht gewijzigd door T.Assies op ]
T.Assies
Ik zie dingen die je nooit voor mogelijk hield. Ik maak ze mogelijk. Ik kan je pijn en lijden laten zien. In tegenslag vind ik hoop, in de verhalen die ik hoor inspiratie. Ik kan je veel vertellen. Wat ik doe? Ik ontdek. Mijn wereld is jouw wereld.
Na enige tijd had ik eigenlijk weer tijd en zin hiervoor dus ik ben weer verder gegaan, helaas zonder resultaat. Ik begin bijna de denken dat een PIC uit principe niet samenwerkt met een EEPROM van atmel 
In de datasheet staat ipv I2C 'two wire protocol', maar voor zover ik weer is het enige verschil hiertussen dat de naam I2C niet gevoerd mag worden zonder veel geld te betalen. In het protocol zag ik verder geen verschil..
Ik heb al een andere EEPROM geprobeerd maar hetzeflde resultaat dus ik ga er niet vanuit dat ze allebei kapot zijn.
In de datasheet staat dat deze not recommand is voor nieuwe ontwerpen.. maar waarom staat er niet? En aangezien ik ze al heb wil ik ze toch graag gebruiken..
Op dit moment vraag ik me vooral of of het probleem (de 2 communiceren niet goed) kan liggen aan de verschillen tussen I2C en 'two wire protocol' of dat ik op de een of andere manier te snel communiceer ofzo? (dat zou de pic zelf moeten timen allemaal..)
Heeft iemand toevallig voorbeeld code van I2C eeproms voor mij?
/edit: Ik heb even ledjes aan en uit laten gaan op bepaalde punten in het programma, En alles loopt vast wanneer de START verzonden moet worden voor het lezen.. Normaal als de pic klaar is met een bepaalde conditie versturen wordt er een flag geset. Behalve bij de start van het lezen..
Ik dacht eerst dat dit zou duiden dat het schrijven niet voltooid is. Maar het programma blijft gewoon in een loop pollen dus dat kan niet verklaren waarom het programma nooit meer verder komt..
Het kan misschien betekenen dat de stopconditie niet goed wordt ontvangen? Maar wat kan er niet goed gaan aan het verzenden van een start conditie? Misschien dat de eeprom de lijn laag houdt. Maar dat is ook niet het geval. Terwijl de pic nog aan het wachten is tot de startconditie verzonden is zijn beide lijnen hoog. Ik snap er nu helemaal niets meer van!
Iemand een heldere opmerking?
shit quote ipv edit.. dan die hierboven maar verwijderen..
T.Assies
Ik zie dingen die je nooit voor mogelijk hield. Ik maak ze mogelijk. Ik kan je pijn en lijden laten zien. In tegenslag vind ik hoop, in de verhalen die ik hoor inspiratie. Ik kan je veel vertellen. Wat ik doe? Ik ontdek. Mijn wereld is jouw wereld.
T.Assies
Ik zie dingen die je nooit voor mogelijk hield. Ik maak ze mogelijk. Ik kan je pijn en lijden laten zien. In tegenslag vind ik hoop, in de verhalen die ik hoor inspiratie. Ik kan je veel vertellen. Wat ik doe? Ik ontdek. Mijn wereld is jouw wereld.
Even een hele grote schop:
Nu ik voor een ander project weer een I2C eeprom gebruik kwam ik weer bij deze code terecht. En ik ben erachter wat er fout is gegaan. In de Read en Write lus lees ik de variablen E_ADDR en E_DATA in, die het adres en de data bevatten. Maar die variablen staan in Bank0 en op dat moment zit ik in Bank1.. Daar liep alles op vast..
Ik schrijf deze reply maar zodat iemand die via de search op dit topic uitkomt er miscshien wat aan heeft!