AVR - I²C-Slave Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte
Autor |
|
|
|
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.
|
|
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
|