Forum: Mikrocontroller und Digitale Elektronik Hilfe bei TWI / I²C mit dem USI des ATtiny26


von Paul H. (powl)


Lesenswert?

Da meine Frage nach einem Beispiel eher im Nirgendwo geendet hatte mache 
ich nun einen Hilfe-Thread auf.

Ich habe es nun soweit mal geschafft dass er vom Master die 
Startcondition erkennt und empfangen kann.

In der USI Overflow-ISR wird das USI Data Register auf dem Port A auf 
LEDs ausgegeben. Man kann dort die vom Master gesandte Slave-Adresse + 
R/W erkennen. Das ganze leider um eine Bitposition nach links 
verschoben. Also das R/W Bit befindet sich nun eben an der Stelle von 
Bit 1 anstatt der Stelle von Bit 0. Das siebte Bit der Slave-Adresse 
fehlt dann natürlich. Warum ist denn das so verschoben?

mfg Paul H.
1
.include "tn26def.inc"        ; Deklarationen für ATtiny26
2
3
.equ  twi_addr = 100        ; TWI Adresse
4
5
6
.cseg                ; Programm-Flash
7
    rjmp  init        ; Reset-Einsprung
8
9
.org  0x007            ; USI Start Interrupt
10
    rjmp  usi_start
11
12
.org  0x008            ; USI Overflow Interrupt
13
    rjmp  usi_ovf
14
15
16
.org  0x00C            ; Interrupteinsprünge übergehen
17
18
init:  ldi    R16, RAMEND      ; Stapel anlegen
19
    out    SP, R16
20
21
    ldi    R16, 0b11111111    ; PortA als Ausgang
22
    out    DDRA, R16
23
24
    ; USI Control Register
25
    ldi    R16, (1 << USISIE) | (1 << USIOIE) | (1 << USIWM1) | (1 << USIWM0) | (1 << USICS1) | (0 << USICS1)
26
    out    USICR, R16
27
28
    sei              ; Interrupts aktivieren
29
30
31
32
loop:  rjmp  loop        ; Endlosschleife
33
34
35
36
usi_start:
37
    in    R16, USISR      ; Start Condition Interrupt Flag zurücksetzen
38
    ori    R16, (1 << USISIF)
39
    out    USISR, R16
40
41
    reti            ; Kehre zurück
42
43
usi_ovf:
44
    in    R16, USIDR
45
    out    PORTA, R16
46
47
    reti            ; Kehre zurück

von Paul H. (powl)


Lesenswert?

Durch die freundliche und umfangreiche Hilfestellung der aktiven 
Mitglieder hier im Forum ha..*hust* räusper

Durch langes Experimentieren bin ich nun zu einer Lösung gekommen. Das 
Adress+R/W-Byte steht nun richtig im Schieberegister drinnen. Man musste 
den Schieberegister auf die steigende Flanke einstellen. Nicht auf die 
negative wie das das Datenblatt verwirrend beschreibt. Ausserdem muss 
das USIOIF zurückgesetzt werden

von Torsten L. (bluehorn)


Lesenswert?

Paul Hamacher wrote:
> Durch die freundliche und umfangreiche Hilfestellung der aktiven
> Mitglieder hier im Forum ha..*hust* *räusper*

Nicht immer kann jemand helfen, und es ist lange nicht sicher, dass in 3 
Stunden so viele Mitglieder das Forum lesen. Also Glückwunsch, dass Du 
es hinbekommen hast und danke für den Tip!

Hätte ich nicht gewusst, habe aber noch nicht mit dem TWI "gespielt".

Grüsse aus Dresden, Torsten

von Paul H. (powl)


Lesenswert?

Da hast du auch wieder Recht.. ich glaube ich schreib mal ein Tutorial 
wenn ich alles geknackt hab.. das isn ziemlicher Brocken weils nirgendwo 
vernünftig dokumentiert ist.

von Hagen R. (hagen)


Lesenswert?

Das würde mich brennend interessieren, denn ich finde auch keinerlei 
Informationen oder halbwegs fertige Sourcen. So langsam komme ich zu dem 
Schluß das eine eigene vollständige Software Implementierung des TWI und 
auch SPIs auf diesen AVRs effizenter und kompakter ist.

Gruß hagen

von Paul H. (powl)


Lesenswert?

Der Vorteil bei der benutzung des USIs is eindeutig die Tatsache dass 
man den Prozessor damit nich belastet da das ganze ja interruptgesteuert 
ist. Wenn mans mal verstanden hat ist das USI nicht kompliziert aber am 
Anfang total verwirrend und ich werde sicher noch auf Probleme stoßen.. 
da freu ich mich jetzt schon drauf >.<

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.