IIC-Slave mit ATTiny45

Gast #229947
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.
Angehängte Dateien:
Gast
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
Gast
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
Gast
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
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.