Forum: Mikrocontroller und Digitale Elektronik Externes I2C EEPROM am AT90S1200


von remo (Gast)


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

von Tobi (Gast)


Angehängte Dateien:

Lesenswert?

die atmel appnote die ich hier noch ausgegraben hab (ist nicht mehr auf
der site) benutzt keine ints oder timer. keine ahnung ob die läuft aber
schaus dir mal an

von Quark (Gast)


Lesenswert?

Hi,
genau das möchte ich auch gerne machen,
habe mir extra nur serielle EPROMS besorgt,
weil ich nicht wusste wie/ob es ohne Timer geht.
Danke für Frage und Antwort.

Grüße

Quark

von bluemole (Gast)


Lesenswert?

Falls das avr300 nicht laufen sollte habe ich einen selbst geschriebenen
i2c bus ohne timer auf meiner Festplatte neben an.
Sag bescheid, falls Du ihn noch brauchst....

von Ingo Henze (Gast)


Lesenswert?

Also das AVR300 läuft prima, hab ich schon auf einem Tiny12 und Mega8
verwendet.
Man muß nur unbedingt bei TWI_init den Hinweis im Kommentar des
Funktionskopfes beachten :-)

Gruß
Ingo

von Tobi (Gast)


Angehängte Dateien:

Lesenswert?

hab die eigentliche appnote auch noch gefunden. s.anhang

von remo (Gast)


Lesenswert?

Danke für die Hilfe.
Remo

von Condor (Gast)


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 ?

von kitesurfer1404 (Gast)


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

von groovie (Gast)


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.

von Electronicfox (Gast)


Lesenswert?

Ich habe das selbe Problem: 
Beitrag "AVR300.asm + EEPROM = Problem"

Nur verwende ich hier den ATMEGA168. Meine File läuft zwar jetzt, nur 
muss ich immer wieder Adresse - Subdata - Daten schicken, obwohl mir es 
sequentiell lieber wäre. Aber auch bei mir war immer nur das erste Byte 
richtig und die anderen Null.

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.