Forum: Mikrocontroller und Digitale Elektronik MEGA88 mit 24C256


von Silver69 (Gast)


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

von Lasse S. (cowz) Benutzerseite


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

von Michael U. (amiga)


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

von Silver69 (Gast)


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?

von Lasse S. (cowz) Benutzerseite


Lesenswert?

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

von Silver69 (Gast)


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.

von hans (Gast)


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

von Lasse S. (cowz) Benutzerseite


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

von Silver69 (Gast)


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?

von Lasse S. (cowz) Benutzerseite


Lesenswert?

Hi,

ja, ich hab was ins TWBB Register geschrieben, das kann ich aber auch 
auskommentieren und es funktioniert trotdem. Hier der runtergebrochene 
Code:
1
; Send Start-Condition
2
ldi rt, (1<<TWINT) | (1<<TWEA) | (1<<TWEN) | (1<<TWSTA)
3
out TWCR, rt
4
5
; Wait
6
twi_wait_loop:
7
in rt, TWCR
8
sbrs rt, TWINT
9
rjmp twi_wait_loop
10
11
; Send TWI-Statusregister
12
in rt, TWSR
13
andi rt, 0b11111100
14
sendreg rt

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

Gruß, Lasse

von Silver69 (Gast)


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?

von Silver69 (Gast)


Lesenswert?

Hast du Pin 1 (A0) & 2 (A1) auch auf Masse gelegt?

von Silver69 (Gast)


Lesenswert?

ganzheimlichvonderhinterneneckemeltentu

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

handrunternehmundganzleisedenraumvelass

von daniel (Gast)


Lesenswert?

http://www.atmel.com/dyn/resources/prod_documents/doc2545.pdf
Seite 210, dort ist alles haarklein beschrieben

von Silver69 (Gast)


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.

1
rjmp TWIStart
2
3
TWISent:    
4
        sts TWCR, r16
5
wait1:
6
        lds r16,TWCR
7
        sbrs r16,TWINT
8
        rjmp wait1
9
        lds r16,TWSR
10
        andi r16, 0xF8
11
ret      
12
        
13
TWIStart:    ldi r16,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
14
        
15
        rCall TWISent
16
        cpi r16, 0x08      
17
        brne ERROR
18
19
ppp:      ldi    r16, 0        ;Device ???? = 0 => Alled Devices werden angesprochen? (laut DB)
20
        sts   TWDR, r16
21
22
        ldi   r16, (1<<TWINT) |(1<<TWEN)
23
        
24
        rcall TWISent
25
        
26
        rcall USARTSent        ;R16 = NACK = 0X20
27
        
28
        cpi r16, MT_SLA_ACK     ;<==============
29
        
30
        
31
        brne error      
32
33
        
34
        ldi r16,'S'
35
        Rcall USARTSent
36
37
38
39
        rjmp MLOOP  
40
41
error:
42
43
        ldi r16,'E'
44
        Rcall USARTSent
45
46
47
48
  
49
MLOOP:
50
51
      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?

von Lasse S. (cowz) Benutzerseite


Lesenswert?

Hi,

sende ihm lieber mal die richtige Adresse.

Lg, Lasse

von Hmm... (Gast)


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...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.