Hallo,
wir haben ein Problem mit dem eDip 240-7TP von EA.
Wir senden einen Text zum eDip (über i2c, s.u.) mit einem Atmega32.
Der erste gesendete Text wird übertragen, der zweite nicht mehr.
Erst nach zwei Sekunden kann der neue Text übertragen werden.
Wenn wir den Mikrocontroller OHNE einen Text zu senden neu starten, gibt
das eDip den Text trotzdem noch einmal aus.
Es scheint also noch etwas im "Buffer" des eDip zu liegen.
Das "ACK" aus dem TWSR-Register wird auch nach dem nicht angezeigten
zweiten Text korrekt vom Display gesendet.
Kann uns jemand helfen???
Wir haben auch schon alle vorgefertigten Bibliotheken probiert, die
kriegen wir nicht zum laufen (wegen fehlender include-Files usw.).
Danke im Voraus.
Hier ist das Programm.
1 | void init(void);
|
2 | void twistart(int slave_addr);
|
3 | void twisend(int databyte);
|
4 | void twistop(void);
|
5 | void twisendtext(char *text, int size);
|
6 | int twichecksum(char *text);
|
7 |
|
8 |
|
9 | int main(void)
|
10 | {
|
11 |
|
12 |
|
13 | DDRA= 0xff;
|
14 | int slave_addr = 0b11011110;
|
15 |
|
16 | char texta[] = "Bdasdd";
|
17 | char textb[] = "D@d";
|
18 |
|
19 | init();
|
20 |
|
21 | TWCR = (1<<TWINT)|(1<<TWSTA)| (1<<TWEN); //send start condition
|
22 | while (!(TWCR & (1<<TWINT)));
|
23 |
|
24 | TWDR = slave_addr;
|
25 | TWCR = (1<<TWINT)|(1<<TWEN); //send start condition
|
26 | while (!(TWCR & (1<<TWINT)));
|
27 |
|
28 | twisendtext(textb, strlen(textb));
|
29 | PORTA = TWSR; //Ausgabe auf LEDS zum "debugggen",zeigt "28" (also ACK transmitted, data received)
|
30 | twisendtext(textb, strlen(textb));//wird nicht angezeigt!!!
|
31 | twistop();
|
32 | return 0;
|
33 |
|
34 |
|
35 | }
|
36 |
|
37 |
|
38 |
|
39 | /////////////////////////////////////////////////
|
40 | // F U N K T I O N E N
|
41 | /////////////////////////////////////////////////
|
42 |
|
43 |
|
44 |
|
45 | void init(void)
|
46 | {
|
47 | TWBR = 42;
|
48 | TWSR = 0;
|
49 |
|
50 | }
|
51 |
|
52 | void twistart(int slave_addr)
|
53 | {
|
54 | TWCR = (1<<TWINT)|(1<<TWSTA)| (1<<TWEN); //send start condition
|
55 | while (!(TWCR & (1<<TWINT)));
|
56 | TWDR = slave_addr;
|
57 | TWCR = (1<<TWINT)|(1<<TWEN); //send start condition
|
58 | while (!(TWCR & (1<<TWINT)));
|
59 | }
|
60 |
|
61 | void twisend(int databyte)
|
62 | {
|
63 | TWDR=databyte;
|
64 | TWCR = (1<<TWINT)| (1<<TWEN);
|
65 | while (!(TWCR & (1<<TWINT)));
|
66 |
|
67 | }
|
68 |
|
69 | void twistop(void)
|
70 | {
|
71 | TWCR=0b10010100;
|
72 | }
|
73 |
|
74 |
|
75 |
|
76 | void twisendtext(char *text, int size)
|
77 | {
|
78 | twisend(0x12);
|
79 | twisend(size);
|
80 |
|
81 | int i=0;
|
82 | for(i=0; i<size;++i)
|
83 | {
|
84 | twisend(text[i]);
|
85 | }
|
86 |
|
87 | int checksum = 0;
|
88 | //checksum = 0x11+size;
|
89 | int j;
|
90 | for(j=0; j<size;++j)
|
91 | {
|
92 | checksum += text[j];
|
93 |
|
94 | }
|
95 | checksum += 17+size;
|
96 |
|
97 | twisend(checksum);
|
98 |
|
99 | }
|