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
>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.
Nehmen wir mal an das ich den nehmen muss... Hast noch eine weitere Idee wie ich das Problem lösen könnte ?!
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 !!!
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
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 ...
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.