Hallo an alle, ich habe folgendes Problem:
Um mich in die I2C-Materie einzuarbeiten habe ich einen Testaufbau mit
einem Atmega8L-8PU (angeschlossen über USB-programmer an den PC) und dem
PCF8574P Portexpander aufgebaut.
An den Portexpander sind nur Dioden angeschlossen, also nur ein/aus.
Das (Haupt-)Programm sieht folgendermaßen aus:
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include <D:\Projekt\_AVR\_Bibliotheken\delay.h>
|
4 | #include <D:\Projekt\_AVR\I2C_25122012\original Example\i2cmaster.h>
|
5 |
|
6 |
|
7 | #ifndef F_CPU
|
8 | #define F_CPU 16000000
|
9 | #endif
|
10 |
|
11 | #define ADDR 0x20 //Adresse vom I/O Portexpander PCF8574P
|
12 |
|
13 |
|
14 |
|
15 | void I2C_write(uint8_t DATA);
|
16 |
|
17 | void long_delay(uint16_t ms) //Warteschleifenfunktion
|
18 | { for(; ms>0; ms--) _delay_ms(1);
|
19 | }
|
20 |
|
21 |
|
22 | int main(void)
|
23 | { cli();
|
24 | i2c_init();
|
25 | sei(); // now enable interrupt
|
26 |
|
27 | uint8_t i=0,DATA=0;
|
28 | while(1)
|
29 | {
|
30 | DATA=i;
|
31 | if((DATA|i)>=127)
|
32 | i=0;
|
33 | i++;
|
34 | I2C_write(DATA);
|
35 | long_delay(100); //Verzögerung bis die Nächste Zahl geladen wird.
|
36 |
|
37 | }
|
38 | }
|
39 |
|
40 |
|
41 | void I2C_write(uint8_t DATA)
|
42 | {
|
43 | i2c_start(ADDR+I2C_WRITE);
|
44 | i2c_write(DATA);
|
45 | i2c_stop();
|
46 | }
|
Ich hoffe das haut jetzt mit der Formatierung hin ^^
Beim Programm dabei sind noch die "i2cmaster.h" und "twimaster.c".
Das ganze habe ich von hier:
http://www.jtronics.de/avr-projekte/library-i2c-twi-master.html
Wenn gewünscht häng ich die Dateien nochmal dran!
Und bitte nicht böse sein dass ich das nicht selber geschrieben habe,
ich hab das ganze auf softwarebasis funktionierend, bis unser Lehrer mir
sagte dass das Blödsinn ist, und das beim Atmega sowieso mit der
Hardware geht -.-
Naja, wie auch immer, Problem ist, dass so wie das Programm ist nichts
passiert.
Ich hab SCL und SDA oszillographiert, aber die bleiben die ganze Zeit
auf 5V.
Die Frage ist jetzt ob ich einen blöden Fehler gemacht habe, oder ob
irgendwas anderes sein kann!
Ich würde mich über Antworten sehr freuen,
Viele Grüße und noch einen schönen Feiertag,
Groebar
PS:
Frequenz der CPU ist auf 1000000 eingestellt, und ich arbeite mit dem
AVRStudio4!
Auszug aus dem twimaster.c:
1 | /* I2C clock in Hz */
|
2 | #define SCL_CLOCK 1000 //400000 vorher
|
3 |
|
4 |
|
5 | /*************************************************************************
|
6 | Initialisierung I2C-BUS-Interface, nur einmal!
|
7 | *************************************************************************/
|
8 | void i2c_init(void)
|
9 | {
|
10 | /* initialize TWI clock: 100 kHz clock, TWPS = 0 => prescaler = 1 */
|
11 |
|
12 | TWSR = 1; /* no prescaler */
|
13 | TWBR=125;
|
14 | }
|