Edip im I2C-Modus

Gast #1263570
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
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.