Hallo!
Ist es möglich ein EEPROM 24C256 an den Mega88 anzuschließen, und
mittels TWI zum "laufen" zu bekommen? Oder sind die beiden inkompatibel
zueinander?
Eine Frage zum anschließen habe ich:
Müssen SDA und CLA vom EEPROM direkt an den SDA und CLA Pins des Mega88
angeschlossen werden, natürlich über Pullups (4k7) oder müssen diese
gekreuzt werden. Also: SDA vom EEPROM an CLA vom Mega88 und CLA vom
EEPROM an SDA vom Mega88?
Ich sitze schon seit fast einer Woche, in jeder freien Minute über diese
5 Codezeilen:
twistart1: LDS r16,TWCR ;In den Besispielen steht hier IN
5
sbrs r16, TWINT ;In TWINT steht hier: 0b000100100 soll = 0b1xxxxxxx
6
rjmp twistart1 ;und deshalb ist hier die Endlosschleife perfekt!!
7
8
9
ldi r17,'R'
10
rcall usartsent
11
12
13
loop33:
14
rjmp loop33
Dies stammt aus dem Mega88 Datenblatt, und es sollte ein "START
condition" gesendet werden.
Was mache ich falsch? Ist es überhaupt möglich das so zum laufen zu
bringen???
Hallo
hast du das TWI initialisiert (Taktrate eingestellt)? Das sollte
allerdings gar nicht mal so entscheidend sein.
Wichtiger ist:
Ersetze OUT und IN nicht einfach mit irgendwelchen anderen Befehlen, das
hat schon so seine Richtigkeit ;)
Zu den Anschlüssen:
Nach meinem Datenblatt hat das 24C256 nur SDA und SCL, kein CLA. Die SDA
und SCL müssen direkt an die entsprechenden Anschlüsse vom
Mikrocontroller angeschlossen werden. Auch, wenn TWI/I²C schon
hardwaremäßig im AVR drin ist, lohnt es sich, wenigstens grob zu wissen,
wie das funktioniert...
Gruß, Lasse
Hallo,
das hat schon völlig richtig ersetzt, die Register liegen beim Nega88
außerhalb des mit In/Out erreichbaren Bereiches.
Die Frage nach der Takteinstellung und der maximalen Geschwindigkeit des
EEPROM ist dagegen durchaus angebracht.
Wenn der "überfahren" wird, wird er kaum auf SDA und SCL sinnvoll
reagieren können und das muß er, damit ein erfolgreiches START erkannt
wird.
Gruß aus Berlin
Michael
Ich musste OUT un IN durch STS und LDS ersetzen da sonst das AVR STudio
einen Fehler bringt: Operand 1 out of range: 0xbc.
MIt dem CLA habe ich mich wohl verguckt. Auch in meinem Datenblatt steht
SCL. Angeschlossen habe ich MEGA88 SDA an EEpprom SDA und MEGA88 SCL an
EEPROM SCL. Sollte dann ja passen.
TWI initialisiert habe ich allerdings nicht. Habe ich bisher auch noch
nie was darüber gelesen. Wie funktioniert das?
Hi,
dann ist es wirklich interessant, dass im Datenblatt ein nicht
funktionierendes Beispiel steht...
Verwunderlich ist aber auch folgende Zeile:
1
sbrs r16, TWINT ;In TWINT steht hier: 0b000100100 soll = 0b1xxxxxxx
Da einmal nicht TWINT, sondern TWCR ausgelesen wird und du als Wert 9
Bits angibst. Würde besser passen, wenn die erste Null nicht da wäre.
(Löst nur leider dein Problem auch nicht ;))
Gruß, Lasse
OK, da hab ich mich um eine Null verzählt, also von links her eine "0"
streichen.
Ich habe auch gerade ein neues EEProm eingesetzt (man weiß ja nie).
Resultat ist das gleiche.
Ich wundere mich auch, dass das nicht klappt, und weiß auch gar nicht
mehr wo ich den Fehler suchen soll. Womöglich hat auch noch nie jemand
einen Mega88 mit einem externen EEprom erweitern wollen.
Hi,
ich benutze gerade ein 24C64, ohne größere Probleme. Allerdings mit
einem Mega8, kann es sein, dass dein Fehler doch in den STS und LDS
Zeilen liegt?
Gruß, Lasse
Mein Code hat derweil fast 1000 Zeilen. Bisher hat es mit den STS und
LDS noch nie Probleme gegeben. Das mit dem STS statt OUT und LDS statt
IN habe ich auch von jemand im Forum hier.
Hast du in Assembler programmiert? Dann zeig doch mal deinen TWI Code?
Oder genauer gefragt: Hast du etwas ins Register TWBR (Bit Rate)
geschrieben?
Hast du Irgendwelche Initialisierungs-Aufgaben erledigt?
JA, genau so ist es bei mir auch. außer mit dem STS statt OUT. Und bei
mir bleibt er in der Schleife hängen, weil TWINT Bit nie "1" wird... :-(
Kann es eventuell etwas damit zu tun haben, dass ich den Mega88 mit
1.8432 MHz tackte?
Hallo!
Ja also die Beschreibung aus dem Datenblatt kenne ich mittlerweile schon
fast auswendig, was aber nicht heißen soll dass ich alle verstehe was da
so geschrieben steht.
Seit dem die Pullup-Widerstände etwas größer sind (4k7 und 10k; leider
hatte ich keine 2 gleichen da) geht es nun etwas voran. Aber leider nur
etwas.
Hab mal eben in der Code-Sammlung etwas gestöbert. Anscheinend hat Hagen
hierfür schon mal ein kleines Assembler-Modul geschrieben:
Beitrag "Hardware TWI,I²C, I²C EEPROM"
Hab das jetzt nicht näher angeschaut, aber anscheinend haben die Lib
etliche Leute erfolgreich am laufen. Der Code sollte sich auf den
Atmega88 portieren lassen.
Nebenbei scheint es etliche TWI-Routinen im Polling-Betrieb zu geben,
eine Routine für Interrupt-Betrieb scheint noch niemand gepostet zu
haben...