Forum: Compiler & IDEs soft i2c slave


von Andre L. (acidali)


Lesenswert?

Hallo,

ich bräuchte Anregungen für eine soft-i2c slave implementierung.

Folgende Problemstellung, habe eine atmega16u2 der mit einer externen 
Gerät zusammenarbeitet, dieses Gerät kann per EEPROM über i2c 
konfiguriert werden.
In einem anderen Projekt habe ich das EEPROM über die TWI Schnittstelle 
eines anderen Atmels "emuliert". Dazu habe ich die Library Martin 
Junghans verwendent.

http://www.jtronics.de/avr-projekte/library-i2c-twi-slave.html

Der neue Atmel atmega16u2 hat jedoch keine TWI Schnittstelle... :(
Habe mich schon durch verschiedenste Foren gegraben und kein Beispiel 
oder Library gefunden...

Außer die von ATMEL bereitgestellte Demo

http://www.atmel.com/System/BaseForm.aspx?target=tcm:26-40217

Atmel AVR154: Software Emulation of TWI Slave Hardware Module
(file size: 77KB, 4 pages, revision A, updated: 03/2012)
This application note describes a Two-wire Interface (TWI) slave 
implementation, in the form of a full-featured driver and an example of 
usage for this driver. Many chips feature a hardware TWI module; others 
have Universal Serial Interface (USI), which can be used in TWI mode. 
This application note discusses the TWI slave driver for devices without 
any of these hardware modules. This driver emulates the hardware TWI 
slave in software hence providing the programmer an easy way of porting 
the code from high end TWI enabled devices to low cost devices.

Problem:
1. Das ist natürlich fürn IAR Compiler
konnte es aber glaube ich portieren.

2. Kann nicht sagen ob ich einen Fehler gemacht habe oder ob die Demo 
scheiße ist weil es nicht läuft!

Hardwarseitig passt alles, Ozi dan und siehe da Master versucht zu 
Adressieren aber ATMEL sendet kein ACK.

Hat einer von euch so etwas schon mal implementiert ?!
Kennt einer von euch noch eine schöne Library / Demo die sowas kann ?

Sonst poste ich mal die portierten ATMEL Demo

lg

von holger (Gast)


Lesenswert?

>Der neue Atmel atmega16u2 hat jedoch keine TWI Schnittstelle... :(

Mal ne ganz blöde Frage: Wieso nimmst du den dann?
Ich halte überhaupt nichts von Schnittstellen die in Software
implementiert werden müssen. Das gibt immer nur Probleme.

von Andre L. (acidali)


Lesenswert?

Nehmen wir mal an das ich den nehmen muss...

Hast noch eine weitere Idee wie ich das Problem lösen könnte ?!

von Stefan++ (Gast)


Lesenswert?

Hallo,

sieh mal "AVR302: Software I2C™ Slave Implementation"
http://www.avrfreaks.net/index.php?module=Freaks%20Tools&func=viewItem&item_id=77
an !!!
Eventuell kannst du es für deine Zwecke abändern !!!

von Peter D. (peda)


Lesenswert?

SW-I2C geht mit dem AVR schlichtweg nicht, zumindest nicht mit 100kHz.
Bei 16MHz hast Du nur 64 Zyklen (4µs) Zeit, um zu reagieren.
In dieser Zeit müssen der I2C-Interrupt und alle anderen Interrupts 
abgearbeitet sein!
Ein MC mit Prioritäten könnte das, indem er dem I2C-Interrupt erlaubt, 
alle anderen zu unterbrechen. Aber die hat der AVR ja nicht.


Auch kann ein MC keine standard I2C-ICs, wie EEPROMs emulieren.
Er muß das SCL strecken, solange er den Interrupt auszuführt.
Bei standard I2C-ICs muß der Master das SCL Strecken nicht behandeln 
können, bei einem MC aber schon, sonst kracht es.


Peter

von Walter S. (avatar)


Lesenswert?

Peter Dannegger schrieb:
> SW-I2C geht mit dem AVR schlichtweg nicht, zumindest nicht mit 100kHz.

so allgemein würde ich das nicht sagen,
kommt ganz drauf an:
ich habe z.B. einen Master der 10x pro Sekunde was von mir will,
d.h. ich mache das ohne Interrupt, warte einfach auf die Anfrage und das 
geht auch bei 8MHz noch schnell genug. Nach der Anfrage habe ich jede 
Menge Zeit meine Messungen/Berechnungen zu machen und dann warte ich 
wieder ...

von Peter D. (peda)


Lesenswert?

Walter S. schrieb:
> so allgemein würde ich das nicht sagen,
> kommt ganz drauf an:

Stimmt.
Wenn die CPU fast nichts zu tun hat, kann sie Slave-I2C machen.
Aber z.B. ne 8-Kanal SW-PWM sieht blöd aus, wenn die CPU grad im I2C 
hängt.

Es gibt ja dieses SW-USB für AVR, da kann der AVR nicht viel mehr 
machen, als mit den IO-Ports klimpern. Andere Interrupts sind nicht 
möglich. Zur Leistungsfähigkeit eines AVR mit HW-USB liegen Welten 
dazwischen.
Und ähnlich ist es bei SW Slave-I2C.


Peter

von Oliver J. (skriptkiddy)


Lesenswert?

Peter Dannegger schrieb:
> Es gibt ja dieses SW-USB für AVR, da kann der AVR nicht viel mehr
> machen, als mit den IO-Ports klimpern. Andere Interrupts sind nicht
> möglich.

Da muss ich dir widersprechen:
1
Interrupt latency:
2
The application must ensure that the USB interrupt is not disabled for 
3
more than 25 cycles (this is for 12 MHz, faster clocks allow longer
4
latency). This implies that all interrupt routines must either have the
5
"ISR_NOBLOCK" attribute set (see "avr/interrupt.h") or be written in
6
assembler with "sei" as the first instruction.
(Quelle: ./vusb-20120109/usbdrv/usbdrv.h)

Gruß Oliver

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.