-
Hallo Joe,
Ob das Programm von oben funktioniert, kann ich nicht so sagen, ich habe mir meine eigene Routine programmiert, die zufälligerweise auch einen Slave macht, der ... 2 Motoren per L293 ansteuert und 2 Radencoder , die ich aus einer alten Kugelmaus gebaut habe per Pinchange Interrupt ausliest.
Leider bin ich noch nicht ganz fertig damit, sonst hätte ich das ganze veröffentlicht.
Die eigentliche I2C Slave Routine klappt aber schon sehr gut auf einem Tiny24.
Welchen µC man nimmt ist es eigentlich Wurst, hauptsache, der hat eine USI.
Wenn Du mir Deine E-Mail Adresse per PN schickst kann ich Dir mein Programm als Alpha Tester zukommen lassen ;-)
Ich habe auch mehr oder weniger eine Appnote von Atmel verwendet und etwas auf meine Bedürfnisse abgeändert.
Gruß Sebastian
-
I2C
@Besserwessi: der Code oben ist ein Slave und kein Master (wie Du vermutet hast).
@oberallgeier: der Code oben läuft, so wie er oben zitiert ist. Allerdings fehlt dann die Funktionalität, mitten in der Übertragung oder nach irgendeinem Byte mit einer Stop-Condition oder Start-Condition vom Master zu operieren. Wenn man diese auskommentierten Zeilen aktiviert, werden die meisten Übertragungen allerdings durch fehlerhaft erkannte (aber nicht vorhandene) Stop-Condition abgebrochen. Das kann man so umschiffen:
Man fragt die Stop-Condition nur während der ersten SCL clock des nächsten Bytes ab, dann gibt es weniger Fehler aber die Funktionalität ist da.
man muß dazu folgende Code Sequenz im Code oben:
- ; the master sends data to the ATtiny26
ldi Temp1,(1<<USIOIF)+0x00 ;16 SCL edges
out USISR,Temp1
ldi Temp1,0 ;ACK=0
out USIDR,Temp1 ;bit 0 will be send as ACK
; wait until the master sends the Data Byte
write_2: ; sbic USISR,USIPF ;stop condition detected?
; rjmp main_loop
sbrc Flags,START_DETECTED ;start condition detected?
rjmp start_cond
sbis USISR,USIOIF
rjmp write_2
durch die folgende ersetzen:
- ; the master sends data to the ATtiny26
ldi Temp1,(1<<USISIF)+(1<<USIOIF)+(1<<USIPF)+0x0E ;2 SCL edges
out USISR,Temp1
;wait for 1 SCL clock to detect stop condition or new start condition
first_SCL:
sbic USISR,USIPF ;stop condition detected?
rjmp main_loop
sbrc Flags,START_DETECTED ;start condition detected?
rjmp start_cond
sbis USISR,USIOIF
rjmp first_SCL
ldi Temp1,(1<<USISIF)+(1<<USIOIF)+(1<<USIPF)+0x02 ;14 SCL edges
out USISR,Temp1
; wait until the master sends the Data Byte
write_2:
sbis USISR,USIOIF
rjmp write_2
Als I2C Master benutze ich die Bibliothek von Peter Fleury, die man auf seiner Homepage herunterladen kann, und zwar den Part, der in rein in Software (ohne Nutzung des TWI-Moduls) für eine C-Compilierung in GNU-Assembler codiert ist.
-
Hallo uffi, hallo izaseba, erst mal danke :)
Na ja, es kommt Arbeit auf mich zu :) - aber JETZT hab ich ein bisschen mehr Plan :)
-
[quote="izaseba"]
Ich habe hier einen USI slave seit paar Monaten auf einem Tiny24 laufen, ich prüfe auch den USIPF, kann aber keine Probleme feststellen.
Der Slave rennt um sein Leben ;-)
[quote]
Hallo Sebastian,
ich stecke noch ganz am Anfang meiner Assembler-Karriere und möchte auch einen TWI-Slave auf einem ATtiny 2313 realisieren. Scheint aber nicht ganz trivial zu sein.
Es wäre super nett, wenn Du mir bitte Deinen ASM-Code als Beispiel zur Verfügung stellen könntest?
Vielen Dank im Voraus und viele Grüße
Jörg
-
Hallo Jörg,
Sorry, daß ich mich bis jetzt nicht gemeldet habe, die Benachrichtigung bei neuen Posts hat aber nicht funktioniert :-(
Ja, schau mal auf meiner HP rein, da ist ein 'halber' Slave :-b
Halb deswegen, weil ich den nur beschreiben wollte.
Für den auszulesen muß nur etwas im usi overflow Interrupt geändert werden.
Das kann ich bei Bedarf auch noch einfügen.
Sonst habe ich heute noch einen usi Master geschrieben, schau
Vielleicht ist es auch was.
Gruß Sebastian
-
Also mein I2C Slave läuft jetzt. Die Implementierung ist interrupt-basiert. Codierung in Assembler auf einem ATtiny26. Den Source Code kann man sich hier ansehen:
http://freenet-homepage.de/uffmann/Ultrasonic2.html
Bediene sich wer mag.
Gruß, uffi.