AVR - I²C-Slave

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 26 11 2024  08:50:10      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte


Autor
AVR - I²C-Slave

    







BID = 576065

RFT-Service

Gerade angekommen


Beiträge: 5
 

  


Hallo!

Ich bin neu hier und habe ein kleines Problem, in Sachen I²C-Slave.
Ich habe einige I/O-Expander in einer Steuerung und es ist immer lästig, mehrere davon zu verbauen, weil diese nur 8-Bit-Versionen sind und hatte die Idee, einen AVR-µC die Sache übernehmen zu lassen. Also 16 oder 24Bit wären da schon drin.

Nur habe ich das Problem, dass ich es nicht zusammen gebracht habe, einen I/O-Expander zu simulieren, der über I²C-Bus ansprechbar ist.

Der AVR sollte über die Adresse 196 ansprechbar sein und die nachfolgenden Datenbytes auf den Ports PC und PD des ATMEGA ausgeben.
Vielleicht ist es auch möglich diesen auszulesen über die Adresse 197 und das PORTC und PORTD wird gelesen.

Da ich nur Erfahrungen in Assembler habe, wäre es toll, wenn da jamand eine Lösung hätte.

Ich sag jetzt schon Danke und einen guten Rutsch ins neue Jahr!

BID = 576084

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

 

  

Hallo,

wenn es nicht so wichtig ist, die IO-Zustände zurückzulesen, dann würde ich dir drei Schieberegister (z.B. CD4094) empfehlen. Du kannst den Überlauf des vorherigen Registers an den Dateneingang des nachfolgenden anschließend und dann schlicht und ergreifend deine 24 Bits austakten als wäre es ein großes Register.

Soll allerdings jedes Bit unabhängig von den Nachbarbits gesetzt/gelöscht werden können, kommst du nicht darum, drei Bytes im SRAM als Abbild zu reservieren. Dort würden dann die Bitoperationen durchgeführt und anschließend jeweils der ganze Puffer ausgetaktet.

Soll es dennoch beim I²C bleiben: Schau ins Datenblatt, dort steht, wie du deinen AVR als Slave einstellen kannst!
Hier mal ein Auszug aus einem meiner früheren Programme:



Code :


;I²C-Hardware konfigurieren
clr ar1
out TWBR, ar1 ;Bitratenregister l²schen
out TWSR, ar1 ;Statusregister l²schen, Vorteiler auf 1
ldi ar1, eigene_adresse ;eigene Adresse im I²C-Netzwerk einstellen
out TWAR, ar1
ldi ar1, 1<<TWEA|1<<TWEN|1<<TWIE ;I²C: an; Bestätigung bei Adressierung: an; Interrupt: an
out TWCR, ar1

; hier noch ein Teil aus der ISR, nachdem der µC adressiert wurde

INT_I2C: ;Daten kommen per I²C

;1. Testen, ob gelesen oder gesendet werden soll
rcall teste_TWINT
cpi sk, 0x60 breq i2c_empfangsmodus ;Daten empfangen
cpi sk, 0xA8 breq i2c_lesemodus ;Daten senden
rjmp i2c_fehler ;weder-noch: Fehler aufgetreten

i2c_lesemodus:
;2. Erstes Datenbyte übertragen
out TWDR, value_L ;allererst Pegel des linken Kanals übertragen
ldi iar, 1<<TWEN|1<<TWINT|1<<TWEA ;Meister muss mich ACK antworten
out TWCR, iar
rcall teste_TWINT ;Warten
cpi sk, 0xB8 brne i2c_fehler ;Datenbyte wurde gesendet, ACK wurde empfangen

;3. Letzes Datenbyte übertragen
out TWDR, value_R ;zuletzt Pegel des rechten Kanals übertragen
ldi iar, 1<<TWEN|1<<TWINT ;Meister muss mich NACK antworten
out TWCR, iar
rcall teste_TWINT ;Warten
andi sk, 0xF7 ;0xC8 oder 0xC0 herausmaskieren
cpi sk, 0xC0 brne i2c_fehler ;auf 0xC0 testen (ein eventuelles 0xC8 wurde wegmaskiert)

;4. I²C-Hardware zurücksetzen
ldi iar, 1<<TWEN|1<<TWINT|1<<TWEA|1<<TWIE
out TWCR, iar

;und ISR verlassen
rjmp i2c_sender_fertig

i2c_empfangsmodus:
;2. Datenbyte empfangen und mit ACK bestätigen
ldi iar, 1<<TWEN|1<<TWINT|1<<TWEA
out TWCR, iar
rcall teste_TWINT
cpi sk, 0x80 brne i2c_fehler
in idb1, TWDR

;3. Datenbyte empfangen und mit ACK bestätigen
ldi iar, 1<<TWEN|1<<TWINT|1<<TWEA
out TWCR, iar
rcall teste_TWINT
cpi sk, 0x80 brne i2c_fehler
in idb2, TWDR

;4. letztes Datenbyte empfangen und mit Nicht-ACK bestätigen
ldi iar, 1<<TWEN|1<<TWINT
out TWCR, iar
rcall teste_TWINT
cpi sk, 0x88 brne i2c_fehler
in idb3, TWDR

;5.
Auf Stop warten und Interrupt wieder aktivieren
ldi iar, 1<<TWEN|1<<TWINT|1<<TWEA|1<<TWIE
out TWCR, iar

;das geht hier noch weiter...


Der Beispielkode stammt aus einem digitalen VU-Meter, was ich mal gebaut habe. Kontrolliert wurde es von einem größeren Prozessor. Das Protokoll ist uninteressant, aber man kann vielleicht ein wenig an den Kommentaren erraten, wie es funktioniert.

Zu den einzelnen Registern: mehr im Datenblatt. Achso, nicht alle AVRs können im Slavemodus betrieben werden, aber die größeren können das und die wirst du auch benutzen, für 24 IO-Ports.

_________________

BID = 576088

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika


Offtopic :
@Baldur:

Die Forensoftware verhunzt die Schiebeoperatoren >> und << sowie den bitweisen Oder-Operator |. Dadurch wird der Kode unleserlich bzw. nicht mehr nachvollziehbar.

Achso, hier noch ein vergessene Routine:


Code :

	;Unterprogramm zum Abwarten eines I²C-Ereignisses und zur Rückgabe des Statuskodes

teste_TWINT:
in pt, TWCR
sbrs pt, TWINT
rjmp teste_TWINT
in sk, TWSR
andi sk, 0xF8 ;Statuskode maskieren (unteren drei LSBs -> 0)
ret



_________________

BID = 576116

RFT-Service

Gerade angekommen


Beiträge: 5

Ich habe mir überlegt eventuell diese Beispiel umzumodeln, nur das der Master den Takt ausgibt: http://www.mikrocontroller.net/arti.....ise_2
Weil eben schon 4polige Steuerkabel verlegt sind, fallen die Schieberegister flach.

BID = 576117

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika


Offtopic :
Als Kind hat man mir die Grundlegenden Begrifflichkeiten "Danke" und "Bitte" beigebracht. Scheint aus der Mode zu kommen...


Versteh ich nicht, dein Beispiel zeigt mir genau das, was ich dir oben vorgeschlagen habe mit Schieberegistern, nur dass es hier Eingänge sind.
Wenn die Leitung vierpolig ist, ist doch gut, oder wird der Slave darüber auch versorgt?

Und: Was ist das für ein "Steuerkabel"? Klingt nach langer Leitung, das kann Probleme geben, wenn sie zu lang und deine Pulse zu schnell sind.

_________________

BID = 576181

RFT-Service

Gerade angekommen


Beiträge: 5


Zitat :
DonComi hat am 31 Dez 2008 13:54 geschrieben :


Offtopic :
Als Kind hat man mir die Grundlegenden Begrifflichkeiten "Danke" und "Bitte" beigebracht. Scheint aus der Mode zu kommen...


Versteh ich nicht, dein Beispiel zeigt mir genau das, was ich dir oben vorgeschlagen habe mit Schieberegistern, nur dass es hier Eingänge sind.
Wenn die Leitung vierpolig ist, ist doch gut, oder wird der Slave darüber auch versorgt?

Und: Was ist das für ein "Steuerkabel"? Klingt nach langer Leitung, das kann Probleme geben, wenn sie zu lang und deine Pulse zu schnell sind.



Hallo!

Sorry, hatte vergessen meinen Browser zu aktualisieren und habe deinen Code leider nicht gesehen. Sicher bedanke ich mich dafür. Nun muss ich den etwas durchschauen und testen obs bei mir läuft.


Zurück zur Seite 1 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 20 Beiträge im Durchschnitt pro Tag       heute wurden bisher 1 Beiträge verfasst
© x sparkkelsputz        Besucher : 182401771   Heute : 1546    Gestern : 7426    Online : 473        26.11.2024    8:50
11 Besucher in den letzten 60 Sekunden        alle 5.45 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0380010604858