Externes I2C EEPROM am AT90S1200

Gast #114881
Lesenswert?

Möchte externes I2C EEPROM an AT90S1200 anschliessen.
Wenn ich hierfür 2 eigene PortPins spendiere, gibt es dann eine
einfachere Lösung als eine komplette I2C Controller SW zu verwenden.
Die von Atmel vorgeschlagene SW Lösung für I2C belegt die Timer und
geht auch nur an den Timer- und external Interrupt Pins und ich brauch
ja keinen kompletten BUS mit mehreren angeschlossenen ICs sondern nur
ein einziges I2C EEPROM.

Hat Jemand eine Lösung, möglichst in ASM.

P.S.: Hab mich mal durch das I2CEEPROM Datenblatt gewühlt und versucht
die ANsteuerung selbst in ASM zu programmieren. Wurde mir schnell zu
kompliziert und aufwendig.

Danke und ciao
Remo
Gast #114888
Lesenswert?

Hallo

ich wollte mit dem 90s1200 über i2c einen LM75 auslesen.
ich habe das AVR300.asm genommen und diesen aufruf gemacht


  ldi  i2cadr,$90+i2cwr  ; Set device address and write
  rcall  i2c_start    ; Send start condition and address

  ldi  i2cdata,$00    ; Write word address
  rcall  i2c_do_transfer    ; Execute transfer

  ldi  i2cadr,$90+i2crd  ; Set device address and read
  rcall  i2c_rep_start    ; Send repeated start condition and address

  clc
  rcall  i2c_read    ; Execute transfer (read)
  mov  temp5,i2cdata

  sec
  rcall  i2c_read    ; Execute transfer (read)
  mov  zahl3,i2cdata

  rcall  i2c_stop    ; Send stop condition - releases bus


der 1. read befehl bringt mir wie gewünscht die temperatur
beim 2. read befehl solte das bit 7 0,5 grad anzeigen - ich bekomme
aber immer nur eine 0.

was mach ich beim 2. aufruf falsch? - wird der ack falsch gesendet ?
Gast #577250
Lesenswert?

Moin!

Ich habe mir bei Reichelt einige der 4KB Chipkarten gekauft und versuche 
nun, Daten darauf zu speichern. Bislang leider erfolglos :(
Ich benutze einen Mega8. SCL der Karte hängt an Pin 0, SDA an Pin 1 von 
Port B.
Beide Leitungen sind mit einem 10k Pull-up Widerstand versehen.
An Port D hängen ein paar LEDs gemäß dem Tutorial (1k in der Leitung)

Mein Programm soll die LEDs einschalten: 0xFF nach Port D (ich habe + 
der LEDs am controller)
Danach soll 0b10101010 in den EEPROM der Karte geschrieben werden, 
dieses direkt danach ausgelesen werden und nach Port D ausgegeben werden 
-> jede 2. LED sollte ausgehen, wenn alles geklappt hat.

Erst habe ich versucht, nach Datenblatt des EEPROM selber die Routinen 
zu schreiben. Immerhin kam am Oszilloskop was wackelndes an... Soviel 
zum Erfolg ;)
Nun versuche ich die AVR300.asm von oben ^^ zu nutzen.
Leider noch erfolgloser. Diesmal tut sich rein garnichts am Ausgang des 
Controllers. :(

Mein Code entspricht der AVR300.asm. Ich habe lediglich DDRD durch DDRB 
und die entspechenden PINs angepasst.

Außerdem ist dies hier eingefügt:

;-----------------------------------------------------
;**** Interrupt Vectors ****

.org 0x000       ; kommt ganz an den Anfang des Speichers
    rjmp RESET   ; Interruptvektoren berspringen
        ; und zum Hauptprogramm
reti    ;rjmp EXT_INT0   ; IRQ0 Handler
reti    ;rjmp EXT_INT1   ; IRQ1 Handler
reti    ;rjmp TIM2_COMP  ; Timer2 Compare Handler
reti    ;rjmp TIM2_OVF  ; Timer2 Overflow Handler
reti    ;rjmp TIM1_CAPT   ; Timer1 Capture Handler
reti    ;rjmp TIM1_COMPA ; Timer1 CompareA Handler
reti    ;rjmp TIM1_COMPB ; Timer1 CompareB Handler
reti    ;rjmp TIM1_OVF   ; Timer1 Overflow Handler
reti    ;rjmp TIM0_OVF   ; Timer0 Overflow Handler
reti    ;rjmp SPI_STC   ; SPI Transfer Complete Handler
reti    ;rjmp USART_RXC   ; USART RX Complete Handler
reti    ;rjmp USART_DRE   ; UDR Empty Handler
reti    ;rjmp USART_TXC   ; USART TX Complete Handler
reti    ;rjmp ADC   ; ADC Conversion Complete Interrupt Handler
reti    ;rjmp EE_RDY   ; EEPROM Ready Handler
reti    ;rjmp ANA_COMP   ; Analog Comparator Handler
reti    ;rjmp TWSI   ; Two-wire Serial Interface Handler
reti    ;rjmp SPM_RDY   ; Store Program Memory Ready Handler


;LEDs einschalten
ldi temp, 0xFF
out DDRD, temp
out PORTD, temp


RESET:

;init
  rcall i2c_init

;schreiben
  ldi i2cadr, 0b10100000
  rcall i2c_start

  ldi i2cdata, 0x00
  rcall i2c_do_transfer

  ldi i2cdata, 0b10101010
  rcall i2c_write

  rcall i2c_stop

;1 sekunde pause
  rcall wait_1s

;lesen
  ldi i2cadr, 0b10100000
  rcall i2c_start

  ldi i2cdata, 0x00
  rcall i2c_do_transfer

  ldi i2cadr, 0b10100001
  rcall i2c_rep_start

  sec
  rcall i2c_read
;LEDs schalten
  out PORTD, i2cdata

  rcall i2c_stop

loop:

rjmp loop

;----------------------------------------------

danach folgen die vorhandenen Routinen.

Hat jemand vielleicht Beispielcode, den er auf einem Mega8 erfolgreich 
eingesetzt hat? Ich bin für jede Hilfe dankbar.

Schönen Abend noch
Gast #1082707
Lesenswert?

allo

ich wollte mit dem 90s1200 über i2c einen LM75 auslesen.
ich habe das AVR300.asm genommen und diesen aufruf gemacht


  ldi  i2cadr,$90+i2cwr  ; Set device address and write
  rcall  i2c_start    ; Send start condition and address

  ldi  i2cdata,$00    ; Write word address
  rcall  i2c_do_transfer    ; Execute transfer

  ldi  i2cadr,$90+i2crd  ; Set device address and read
  rcall  i2c_rep_start    ; Send repeated start condition and address

  clc
  rcall  i2c_read    ; Execute transfer (read)
  mov  temp5,i2cdata

  sec
  rcall  i2c_read    ; Execute transfer (read)
  mov  zahl3,i2cdata

  rcall  i2c_stop    ; Send stop condition - releases bus


der 1. read befehl bringt mir wie gewünscht die temperatur
beim 2. read befehl solte das bit 7 0,5 grad anzeigen - ich bekomme
aber immer nur eine 0.

was mach ich beim 2. aufruf falsch? - wird der ack falsch gesendet ?




GENAU das ist bei mir auch nur mit einem temp chip vom maxim. erste 
gelesen byte ok, 2. immer null!!

jetzt wollte ich ein eeprom 24cxx beschreiben und lesen. einzelne 
adressen geht prima. benutze ich den sequentiellen read und sagen wir 
les 5 byte aus dann stimmt das erste, alle anderen sind null.

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