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.
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
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
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
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.
Hi, wollte nur sagen das der ATtiny45 jetzt vom GNUGCC unterstützt wird. Schon ausprobiert, klappt einwandfrei.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.