Hallo,
Ich bin noch relativ neu auf dem Gebiet Protokolle. Mein derzeitiges
Projekt ist das ansprechen einer DS1307 mit einem Atmega8. Ich habe mich
dafür im Datasheet der Uhr und vom Atmega eingelesen. Zudem habe ich
einige Informationen vom Netz bezogen. Ich scheitere jedoch schon
bereits am normalen ansprechen eines Registers der Uhr. Mein erstes
"Ziel" ist das Sekundenregister (00h) auf 0x0F zu stellen (Reiner Test
um das ganze zu testen). Jedoch sehe ich per DSO nicht wirklich das was
ich "möchte". Weder die Ansprache der Adresse, noch die beiden
Schreibvorgänge der Daten.
Mein Code sieht wie folgt aus:
1 | #define F_CPU 16000000UL
|
2 |
|
3 | #include <avr/io.h>
|
4 | #include <util/delay.h>
|
5 |
|
6 | int main(void)
|
7 | {
|
8 | //Make Start Condition on I2C Bus
|
9 | TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
|
10 |
|
11 | while (!(TWCR & (1<<TWINT)));
|
12 |
|
13 | //Set Device Adress
|
14 | TWDR = 0b11010000;
|
15 |
|
16 | TWCR = (1<<TWINT) | (1<<TWEN);
|
17 |
|
18 | while (!(TWCR & (1<<TWINT)));
|
19 |
|
20 | //Set Register
|
21 | TWDR = 0x00;
|
22 |
|
23 | TWCR = (1<<TWINT) | (1<<TWEN);
|
24 |
|
25 | while (!(TWCR & (1<<TWINT)));
|
26 |
|
27 | //Set Register Value
|
28 | TWDR = 0xFF;
|
29 |
|
30 | TWCR = (1<<TWINT) | (1<<TWEN);
|
31 |
|
32 | while (!(TWCR & (1<<TWINT)));
|
33 |
|
34 | //Send Stop Condition
|
35 | TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
|
36 |
|
37 | while(1)
|
38 | {
|
39 |
|
40 | }
|
41 | }
|
Der Spickel auf dem DSO in der mitte beinhaltet keinen richtigen Clock
wie er für I2C sein sollte. Sind nur 2 kurze Low Flanken. CH1 ist SCL,
CH2 SDA.
Ich würde mich auf den ein oder anderen Input freuen.
Benjamin