Ratlos TWI ATMEGA48

Gast #1654547
Lesenswert?

Hallo,

ich versuche den TWI-Bus des ATMEGA48 zu programmieren. Wenn ich die 
Startcondition sende (Master) reagiert der Slave nicht. Mit einem Oszi 
habe ich mal die SDA- sowie die SCL-Leitung gemessen. An der SCL-Leitung 
liegt ein "Rechtecksignal" an, kann sich das jemand erklären? Vielleicht 
hat jemand von euch einen Tipp.

Hier sind mal die Quelltexte (Master) :
1
interface_Initialize:
2

3
push  Value
4

5
lds    Value, PortCDirection          ; Directionregister PortC lesen
6
sbr    Value, 0x04                ; PortC2 (Pin25) als Ausgang freigeben
7
sbr    Value, 0x08                ; PortC3 (Pin26) als Ausgang freigeben
8
sts    PortCDirection, Value
9

10
ldi    Value, 0x80                ; Bitrate einstellen
11
sts    twiBitrate, Value  
12

13
lds    Value, twiCtrl              ; Two Wire - Controlregister lesen
14
sbr    Value, 0x01                ; Interrupt freigeben
15
sbr    Value, 0x04                ; Interface freigeben
16
sbr    Value, 0x40                ; Acknowledge freigeben
17
sbr    Value, 0x80                ; Interrupt zurück setzen
18
sts    twiCtrl, Value
19

20
pop    Value
21
ret
22

23
interface_Transmit:
24

25
sbrc  Status, 0x03              ; Senden schon aktiv?
26
ret                        ; Ja, also springe zurück
27

28
interface_Transmit_Start:
29

30
cli                        ; Interrupts global sperren
31

32
push  Value
33
push  Timeout
34

35
lds    Value, PortC              ; PortC lesen
36
sbr    Value, ledTransmit            ; PortC3 (Pin26) setzen
37
sts    PortC, Value
38

39
lds    Value, twiCtrl              ; Two Wire - Controlregister lesen
40
cbr    Value, 0x01                ; Interrupt sperren
41
cbr    Value, 0x10                ; Stopcondition zurück setzen
42
sbr    Value, 0x20                ; Startcondition setzen
43
sbr    Value, 0x80                ; Interrupt zurück setzen
44
sts    twiCtrl, Value
45

46
sbr    Status, 0x08
47

48
interface_Transmit_return:
49

50
pop    Timeout
51
pop    Value
52

53
sei                        ; Interrupts global freigeben
54

55
ret

Und der Quelltext vom Slave :
1
interface_Initialize:
2

3
push  Value
4

5
lds    Value, PortCDirection          ; Directionregister PortC lesen
6
sbr    Value, 0x04                ; PortC2 (Pin25) als Ausgang freigeben
7
sbr    Value, 0x08                ; PortC3 (Pin26) als Ausgang freigeben
8
sts    PortCDirection, Value
9

10
ldi    Value, 0x80                ; Bitrate einstellen
11
sts    twiBitrate, Value  
12

13
lds    Value, twiCtrl              ; Two Wire - Controlregister lesen
14
sbr    Value, 0x01                ; Interrupt freigeben
15
sbr    Value, 0x04                ; Interface freigeben
16
sbr    Value, 0x40                ; Acknowledge freigeben
17
sts    twiCtrl, Value
18

19
ldi    Slave, 0x20                ; eigene Slaveadresse
20
sts    twiAddress, Slave
21

22
pop    Value
23
ret
24

25
interface_Receive:
26

27
cli
28

29
push  Value
30

31
lds    Value, PortC              ; PortC lesen
32
sbr    Value, ledReceive            ; PortC2 (Pin25) setzen
33
sts    PortC, Value
34

35
lds    Value, twiCtrl              ; Two Wire - Controlregister lesen
36
sbr    Value, 0x80                ; Interrupt zurück setzen
37
sts    twiCtrl, Value
38

39
pop    Value
40
reti


lg Torsten

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