Forum: Mikrocontroller und Digitale Elektronik IIC-Slave mit ATTiny45


von Michael Fluhr (fury) (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich hab versucht mit dem ATTiny45 einen IIC-Slave zu realisieren.
Ich hab es erst in C versucht, aber WINAVR unterstützt den ATTiny45
nicht, und bin jetzt doch wieder bei Assembler gelandet :-)

Ich schalte P3 dauernt ein und aus etwa 2Hz, funktioniert auch. Sobald
ich aber den Interrupt für die USI-Start-Condition freischalte und eine
Startbedingung ausführe (einfach Pin B0 auf low ziehen), schaltet der
Ausgang P3 nur noch mit der halben Frequenz um. Der Pin B4 wird nie auf
Low gesetzt, darum gehe ich davon aus, das die Interruptroutine
USI_Start nie angesprungen wird.


Mein Code ist im Anhang.
Ich benutze den internen Oszillator, sonst hätte ich die Pins auch gar
nicht frei.

von Bob (Gast)


Lesenswert?

hallo. habe sowas mal mit bascom gemacht
dort habe ich nen interrupt auslösen lassen, und dann die übertragung
eingelesen. wenns dich interessiert kann ich den code mal posten

von Michael (Gast)


Lesenswert?

Ja bitte.

von Bob (Gast)


Lesenswert?

On Int0 i2c_startchk 'hier wird auf startkondition geprüft
Config Int0 = Falling
'Bei fallender flanke an INT0 (Pind.2) Interrupt
Enable Interrupts

(variablen deklaration)

i2c_cl Alias Pind.1
i2c_da Alias Pind.0

i2c_startchk:                         'Wenn DA=1-->0
If i2c_cl = 1 Then                    'und CL=1 dann startbedingung
Disable Int0                         'Erstmal den interrupt
abschalten
Gosub Rxi2c                       'dann können wir einlesen
End If                             'sonst
Enable Int0      'Wenn startbed. nicht erfüllt dann nochmal warten
Return

Rxi2c:
'###################################################
'Adresse
i2c_adr = 0       'Wir fangen a bei null (das wird eingelesen)
i2c_i = 8 'ein zähler - 8 bytes werden eingelesen
Do
Decr i2c_i

Do
Loop Until i2c_cl = 0     '# Wir warten auf die nächte HIGH Flanke
Do
Loop Until i2c_cl =1 'so jetzt is high

i2c_adr.i2c_i = i2c_da 'adressbyte an der stelle i2c_i (am anfang=7) =
zustand der datenleitung

Loop Until Sub_i = 0

gosub jmpack 'ack überspringen

jmpack:
Do
Loop Until Sub_cl = 0
Do
Loop Until Sub_cl = 1
Return

von Bob (Gast)


Lesenswert?

Du weisst natürlich wieviele bytes du überträgst (selbe prozedur zb für
die anzahl der bytes) - dann kannst du ne schleife bauen und die bytes
in ein array schreiben

von fury (Gast)


Lesenswert?

Hallo Bob,

Danke, aber wenn ich das richtig sehe, hast du das ohne die Hardware
für IIC (USI)programmiert.
Ich wollte die Hardware benutzen, da ich mit IIC-Slave in Software bei
1MHz auf eine Übertragungsrate von nur 12kbit/s kam.

Warte dann noch auf Beispiele mit USI.

von Flo_K (Gast)


Lesenswert?

Hi,
wollte nur sagen das der ATtiny45 jetzt vom GNUGCC unterstützt wird.
Schon ausprobiert, klappt einwandfrei.

von Bjoern H. (Gast)


Lesenswert?

Schau Dir mal Atmel AppNote AVR312 an - "Using the USI module as an I2C
slave": http://www.atmel.com/dyn/resources/prod_documents/doc2560.pdf.
Das Beispiel ist fuer ATtiny26 und 2312 geschrieben, laesst sich aber
relativ leicht auf ATtiny45 uebertragen.

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.