www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MEGA88 mit 24C256


Autor: Silver69 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
       ldi r16,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN) ;= 0b10100100
      STS TWCR,r16                    ;In den Besipielen steht hier OUT

twistart1:  LDS r16,TWCR                    ;In den Besispielen steht hier IN      
        sbrs r16, TWINT              ;In TWINT steht hier: 0b000100100 soll = 0b1xxxxxxx
          rjmp twistart1                  ;und deshalb ist hier die Endlosschleife perfekt!!
      

        ldi r17,'R'
      rcall usartsent


loop33:
      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???

Autor: Lasse S. (cowz) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Silver69 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Lasse S. (cowz) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

dann ist es wirklich interessant, dass im Datenblatt ein nicht 
funktionierendes Beispiel steht...

Verwunderlich ist aber auch folgende Zeile:
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

Autor: Silver69 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier wird zwar kein EEProm sondern ein PCF angesteuert.
Aber die Routinen sind simpel in BASIC (sollte gut umsetzbar sein).

http://www.roboternetz.de/wissen/index.php/TWI_Praxis

und die Theorie gibt es auch

http://www.roboternetz.de/wissen/index.php/TWI

gruß hans

Autor: Lasse S. (cowz) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Silver69 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Lasse S. (cowz) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ja, ich hab was ins TWBB Register geschrieben, das kann ich aber auch 
auskommentieren und es funktioniert trotdem. Hier der runtergebrochene 
Code:
; Send Start-Condition
ldi rt, (1<<TWINT) | (1<<TWEA) | (1<<TWEN) | (1<<TWSTA)
out TWCR, rt

; Wait
twi_wait_loop:
in rt, TWCR
sbrs rt, TWINT
rjmp twi_wait_loop

; Send TWI-Statusregister
in rt, TWSR
andi rt, 0b11111100
sendreg rt

Dann gibt er mir über das Macro "sendreg" 0x08 aus, genau wie er's auch 
soll.

Gruß, Lasse

Autor: Silver69 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Silver69 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du Pin 1 (A0) & 2 (A1) auch auf Masse gelegt?

Autor: Silver69 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ganzheimlichvonderhinterneneckemeltentu

Ich habe falsche Pullup Widerstände eingelötet, anstatt 4k7 4,7 Ohm. 
Hoffe ich komme jetzt zurecht.

handrunternehmundganzleisedenraumvelass

Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.atmel.com/dyn/resources/prod_documents/...
Seite 210, dort ist alles haarklein beschrieben

Autor: Silver69 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

rjmp TWIStart

TWISent:    
        sts TWCR, r16
wait1:
        lds r16,TWCR
        sbrs r16,TWINT
        rjmp wait1
        lds r16,TWSR
        andi r16, 0xF8
ret      
        
TWIStart:    ldi r16,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
        
        rCall TWISent
        cpi r16, 0x08      
        brne ERROR

ppp:      ldi    r16, 0        ;Device ???? = 0 => Alled Devices werden angesprochen? (laut DB)
        sts   TWDR, r16

        ldi   r16, (1<<TWINT) |(1<<TWEN)
        
        rcall TWISent
        
        rcall USARTSent        ;R16 = NACK = 0X20
        
        cpi r16, MT_SLA_ACK     ;<==============
        
        
        brne error      

        
        ldi r16,'S'
        Rcall USARTSent



        rjmp MLOOP  

error:

        ldi r16,'E'
        Rcall USARTSent



  
MLOOP:

      RJMP MLOOP


Da wo der Pfeil ist, empfange ich nun aber kein ACK (0x18) sondern ein 
NACK (0x20). AN was kann es liegen, dass ich ein NACK empfange?

Autor: Lasse S. (cowz) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

sende ihm lieber mal die richtige Adresse.

Lg, Lasse

Autor: Hmm... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.