von
Torsten O. (Gast)
29.03.2010 21:19
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.