Forum: Mikrocontroller und Digitale Elektronik Ratlos TWI ATMEGA48


von Torsten O. (Gast)


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

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.