Mikrocontroller und Digitale Elektronik
›
Thread
Ratlos TWI ATMEGA48
TO
Torsten O.
Gast
29.03.2010 21:19
#1654547
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
↑ Nach oben
← Zurück zu Mikrocontroller und Digitale Elektronik
Antwort schreiben
Eine eigene Frage?
Dieser Thread ist über 16 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.
Neuen Thread starten
Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.