Forum: Mikrocontroller und Digitale Elektronik Crashkurs in Sachen I²C-Bus


von Alex (Gast)


Lesenswert?

I²C-Bus mit AT90S2343 oder AT90S1200 ist mir noch gänzlich unbekannt.
Erst 2 Projekte hatte ich gemacht mit I²C. Ich wollte mir mal was
zusammenbauen das so aussehen sollte:

Ein PCF8574 hat 8 Eingänge, jeweils LOW-Aktiv. Der gibt die Befehle an
den AT90S2343 oder AT90S1200. Der widerum steuert meinen Display (Siehe
Anhang mit PCF8576 als Treiber) einen PCF8574, X24C04, PCF8583 und einen
TDA7313 an.

P0=+
P1=-
P2=set
P3=standby
P4=Loudness/Normal
P5=Stereo/Mono/Spatial Stereo/Spatial Mono
P6=Reset
P7=Kanalumschaltung

Für Set stelle ich mir folgendes vor:
Bässe = bAE
Höhen = HOE
Balance = bAL
Lautstärke=LAU
Fader = FAd
Uhrzeit Stunde = HO
Uhrzeit Minuten = In

Im Display Wird neben den SET-Angaben auch die Ziffern 0 bis 9 bei der
Uhrzeit 00 bis 59 angezeigt. Mit + und - wird justiert. Später wird die
Uhrzeit angezeigt. Alle Daten sollten im X24C04 gespeichert werden.

Der zweite PCF8574 schaltet (LOW-Aktiv).
P0=Mono
P1=Stereo
P2=Spatial Stereo
P3=Spatial Mono
P4=Standby
P5=Kanal1-LED*
P6=Kanal2-LED*
P7=Kanal3-LED*

*Der Kanal wird im TDA7313 umgeschaltet, an den Ports hängen nur die
Status-LEDs.

Ist dies möglich das zu machen? Ich selbst komme nicht weiter.
Helfen würde es mir, wenn mir jemand sagt wie man den µC sagt, er solle
den jeweiligen IC das ausführen lassen.

von Markus_8051 (Gast)


Lesenswert?

Hi Alex,

also ich kann Dir aus eigener Erfahrung sagen, daß der I2C-Bus für die
Abfrage einer Tastatur sehr langsam ist. Das mag gehen, wenn man nur
ein paar Tastendrücke benötigt, um einen Betriebsmodus zu wechseln,
aber z.B. die Uhrzeit darrüber über +/- Tasten einzustellen macht
keinen Spaß!

Leider kenne ich den AT90S2343 oder AT90S1200 nicht, aber hast Du da
nicht noch ein paar Portpins frei? Oder Du legst die Tasten über Dioden
an schon benutzte Portpins. Die gemeinsame Rückleitung der Taster
steuerst Du dann über einen freien Protpin an.

Die Ausgaben über I2C (auch Display) ist schnell genug. Hier könnte ich
Dir aber höchsten mit 8051-Assembler Librarys helfen.

Gruß,
Markus_8051

von Andreas Hesse (Gast)


Lesenswert?

Hallo,

AVR-Ansteuerungsroutinen für den  I2C Bus gibt es für Assembler, C und
Bascom: Könnte ich Dir zumailen.
(PCF8754 und Display habe ich selbst mal versucht).
Die Timing Aspekte könnten problematisch werden.

Ausserdem sollte man (zumindest für Hochsprachen) einen Controller mit
RAM nehmen. I2C sollte aber auch auf dem 1200er laufen.(Atmels
application Note war glaube ich für den 1200er).
Ich würde aber Eingänge auch direkt vom AVR lesen.

Gruss
Andreas

von Alex (Gast)


Angehängte Dateien:

Lesenswert?

Also so müsste es gehen.
Könnt ihr mir die AVR-Ansteuerungsroutinen zusenden. Wäre echt eine
Hilfe.

von Dirk (Gast)


Lesenswert?

Hi,

Wieso moechtest du alles ueber diese teuren I/O Expander machen?
Nimm doch gleich lieber ein groesseren AVR. (mehr I/O's und Flash)

Die 8 Tasten (in der Zeichnung) wuerde ich als Keymatrix schalten und
ueber eine Diode an den ext. INT des AVR's haengen. (Beispiel bei
Atmel als Appnote)

Irgendwie sieht die Zeichnung wie ein Abbild aus einem billigen Toyota
Radio aus.

Falls du mehr I/0's brauchen solltest kannst du lieber als Eingang
z.B. 74HC165 und als Ausgang 74HC595 nehmen und diese per SPI
ansteuern.

Mfg

Dirk

von Dirk (Gast)


Lesenswert?

Hi,

hab noch was vergessen ... mit einem anderen AVR z.B. Mega8 o. Mega16
koenntest du auch noch den PCF8583 weglassen. Diese Avr's bieten die
Moeglichkeit ueber den Timer2(asynchronen Mode) und einem 32,xxxkhz
Quarz eine Uhr zuprogrammieren.

Mfg

Dirk

von Ralph Dillhardt (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

habe ein paar Routinen für den PCF8593 rausgekramt. den Verwende ich
öfter, sollte zumindest in der Programmierung Identisch sein.

Gib mir mal ne Info, wie weit du gekommen bist.

Viel Glück

Gruss
Ralph

von Ralph Dillhardt (Gast)


Angehängte Dateien:

Lesenswert?

Und siehe da,

ein paar Testroutinen zum 24LC65 habe ich auch noch gefunden.

Die I2C-Master-Routinen für die Prozessoren AT90S2343 oder AT90S1200
kannst du der Application Note AVR300 von Atmel entnehmen.

Bis bald.
Ralph

von Günter (Gast)


Lesenswert?

Hallo Ralph

Ich habe hier mitgelesen und dabei Deine I²C-Routinen 'entdeckt'

Für ein Projekt (Modelleisenbahn) kann ich diese I2C-Routinen
bestens gebrauchen.
Deine Programme sind übrigens sehr gut strukturiert und dokumentiert.

Da ich aber nicht gerade ein ASM-Experte bin, hierzu eine kurze
Frage:

>rcall i2c_start <------------      ;I2C Start Condition
>ldi i2c_buffer, 0b10100000      ;Slave addresse
>rcall i2c_write <------------      ;Write Slave address

Wo und wie findet das Programm diese Unterprogramm-Routinen?
-------------------------------------------------------------

Kannst Du mir weiterhelfen ?

Gruß

Günter

von Andreas Hesse (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

hier ist code für ein PCF8576 basiertes Display.

Benötigt allerdings einen AVR mit RAM.

Gruss
Andreas

von Andreas Hesse (Gast)


Angehängte Dateien:

Lesenswert?

@Günter

Die I2C-Routinen gab es auf der ATMEL-Seite (leider haben sie die
scheinbar heruntergenommen).
Lade im vorherigen Beitrag i2cdisp.zip herunter und nimm i2cdispr.asm.
Der Unterschied ist lediglich, das die Befehle statt I2C... immer
TWI... heissen.
Im Anhang ist noch die PDF-Datei, die Du brauchst, um die Routinen an
Deinen Prozessor anzupassen (Timing und so)

Gruss
Andreas

von Alex (Gast)


Angehängte Dateien:

Lesenswert?

Eigentlich könnte man an der Tastenmatrix auch LEDs anhängen. Dadurch
könnte man auch Ports einsparen. Eines unter meinen Projekten war
dieses hier:
http://www.woe.onlinehome.de/projekte.htm#tuner
Könnte man da nicht die Uhr, Wecker und Display da einbauen. Ich hab
ausserdem gerade gesehen dass der TDA7313 nicht mehr billig zu bekommen
ist. Da dachte ich an den billigen TDA8425 der den Raumklang schon
integriert hat. Da spare ich wieder Ports.
Der µC im Tuner-Projekt hat ein internes RAM.
Toll wäre es wenn man den TDA9840 noch steuern könnte. Aber ich glaube
da ist kein Platz mehr dafür auf dem AT89C2051. Kann man den Quellcode
auch für den AT-Mega nehmen? Oder muss man da viel umschreiben?

von Dirk (Gast)


Lesenswert?

Hi,

ein paar TDA6320 (TEA6320) haette ich abzugeben. Die IC's sind
gebraucht und im SIOC 20 Gehaeuse. Da sie gebraucht sind will ich auch
nicht viel Geld dafuer.

Mfg

Dirk

von Alex (Gast)


Lesenswert?

Zitat:
"Hi,

ein paar TDA6320 (TEA6320) haette ich abzugeben. Die IC's sind
gebraucht und im SIOC 20 Gehaeuse. Da sie gebraucht sind will ich auch
nicht viel Geld dafuer.
"

Die sind ja oft in Autoradios verbaut gewesen. Für den Anfang bräuchte
ich was in DIP, wegen dem Probeaufbau. Später kann man ja es mit
anderen ICs versuchen. Stöbere gerade im Keller rum. Da sind noch
einige Platinen von TVs darunter mit Soundcontroller, Stereo-Decodern
uvm. Melde mich wieder wenn ich die TEA6320 benötige. Datenblatt hab
ich.

von Alex (Gast)


Lesenswert?

Ich hab mir da folgendes gesucht und gefunden:
http://www.eetasia.com/ARTICLES/2000AUG/2000AUG31_CT_MSD_AN.PDF
Hier wird gezeigt wie man LEDs und Tasten am selben Port verwendet. So
ähnlich stelle ich mir das auch in meiner Schaltung vor. Nur mit
AT89C2051 wegen dem Internen RAM. Später lade ich noch ein Schaltbild
hoch, wie ich meine Tasten anlegen würde.

Ports:
P1.0 COL1 LED8
P1.1 COL2 LED7
P1.2 COL3 LED6
P1.3 COL4 LED5
P1.4 ROW4 LED4
P1.5 ROW3 LED3
P1.6 ROW2 LED2
P1.7 ROW1 LED1

P3.0 SDA-Slave (Für später, falls der µC von einem anderen µC gesteuert
wird)
P3.1 SCL-Slave (Für später, falls der µC von einem anderen µC gesteuert
wird)
P3.2 SCL-Master
P3.3 SDA-Master
P3.4 AV (low-Aktiv)
P3.5 Standby (low-Aktiv)
P3.7 Anode Leds (BC559 als Treiber)

Tasten:
1  2  3  4
5  6  7  8
9  10 11 12
13 14 15 16

1=Lautstärke+
2=Lautstärke-
3=Bässe+
4=Bässe-
5=Höhen+
6=Höhen-
7=Sound (Balance, Spatial, Pseudo oder Bypass)
8=Standby
9=Minuten
10=Stunden
11=Wecker
12=Timer
13=AV
14=Kanal+ /Suchlauf+
15=Kanal-/Suchlauf-
16=P/C (Suchlauf)

Hat jemand ein Beispiel wie ich den Tuner, das EEPROM, Display und Uhr
ansteuern kann. Bei der Matrixtastatur blick ich noch nicht ganz durch.
Zumindest an dem Punkt wie ich Tasten und Befehle verknüpfe.

von Alex (Gast)


Angehängte Dateien:

Lesenswert?

Habe mal die CHIPADRESSE, SUBADRESSEN und DATENSÄTZE aufgeschrieben.
Kann mir einer helfen beim verknüpfen der Beispielcodes. Ich habe schon
2 AT90S2313 bestellt. Der AT90S2313 sollte schon dafür geeignet sein.
Oder ist wer anderer Meinung?

von Dirk (Gast)


Lesenswert?

Hi,

wieso kein Mega8? Die AT Serie ist doch net mehr Up to Date.

Mfg
Dirk

von Ralph Dillhardt (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Günter,

ich bin noch dabei die i2c Basis-routinen zu verbessern, aber mit dem
stand den ich im Anhang mitsende kann man schon arbeiten.

Solltest du noch Probleme haben sende mir einfach eine email mit
Betreff.

von thkais (Gast)


Lesenswert?

@Alex:
Der 2313 geht schon, aber ein Mega-8 ist aber auch nicht so viel teurer
und hätte den Vorteil des Hardware-TWI (= I2C) und so nette Features wie
interner RC-Oszillator (kein Quarz notwendig).

Zur Tastatur:
Ich nutze in solchen Fällen einen Timer-Interrupt mit ca. 50Hz, d.h.
alle 1/50 sec. wird die Tastatur abgefragt. Jeder Taste wird ein Code
zugeordnet (man könnte Deine Nummerierung verwenden) 0=keine Taste.
Dieser Wert wird in einer global genutzten Speicherstelle abgelegt und
kann von dort vom Hauptprogramm genutzt werden, im Hauptprogramm selbst
kann man mit den Tastencodes per Tabelle in verschiedene Programmteile
verzweigen.
Entsprechende Verfahren wurden schon öfters diskutiert, es sollte sich
in der Codesammlung einiges finden lassen.

von Alex (Gast)


Lesenswert?

Also jetzt hänge ich noch hier:

audio:
call i2c_start ; I2C-Bus beschreiben
mov a,#80h     ; Chipadresse des TDA8421
call i2c_send
mov a,#00h     ; Befehladresse des TDA8421
call i2c_send
jmp audio,audio_volume
audio_volume:

Wie schaut das jetzt aus wenn ich Balance und Lautstärke senden möchte?

von Alex (Gast)


Lesenswert?

Damit meine ich jetzt wie ich die Datenadresse ausgebe.
Lautstärke:

Chipadresse: 80h
Befehladresse: 00h Volume left, 01 Volume right
Daten: leisesten C0h, lautesten FFh

Bei der Balance muss der derzeitig Wert der Lautstärke gleich bleiben.
angenommen die Daten sehen so aus:
links+rechts: 3Fh
Dann darf Links nur soviel betragen:
R=00h
L=3Fh
Bei gleicher Lautstärke der Kanäle:
R=3Fh
L=3Fh
Bei Rechts:
R=3Fh
L=00h
Da geht mir der Knoten nicht auf.

von jens (Gast)


Lesenswert?

Hi,

ist das Projekt eigentlich fertig geworden?

Gruß

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.