MEGA88 mit 24C256

Gast #1104957
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???
Persönliche Seite #1104969
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
#1105034
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
Gast #1105042
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?
Persönliche Seite #1105060
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
Gast #1105087
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.
Gast #1105173
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?
Persönliche Seite #1105184
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
Gast #1105719
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?
Gast #1106551
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren