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
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
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
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....
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
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 ?
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.