Hilfe bei TWI / I²C mit dem USI des ATtiny26

OP #641456
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
OP #641564
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
#641574
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
#641600
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
OP #641603
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 >.<

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren