mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme bei I2C und Display edip 240


Autor: Sven W. (wache)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen!

Ich sitze nun seit geschlagenenen 9 Stunden an meinem µC und meinem 
Display und bekomme es einfach nicht hin, dass auf meinem Display das 
steht, was da hin soll.
Ich möchte über I2C das Display ansteuern (AVR GCC). Das Display 
löschen, und eine Grade zeichnen funktioniert, zumindest teilweise.
Wenn ich nämlich erst das Display lösche, und dann die Grade zeichnen 
lassen will, dann wird nur das Display gelöscht.
Meine Routine zur Textausgabe funktioniert hingegen nie.
Als nächstes Problem stellt sich mit die Touchscreenabfrage. Da ich die 
Interrupuleitung SBUF nicht habe, muss ich irgendwie pollen. Jegliche 
Versuche, das zu tun sind gescheitert.

Als TWI Lib nutze ich die Lib von P. Fleury.
Der µC ist ein auf 16MHz getakteter AT90CAN128.

Kann mir jemand bei dem Problem behilflich sein?

Hier der Code für die Unterprogramme:


void Display_loeschen(void)
{
 int i = 0;
 i2c_start(0x10);
 i2c_write(DC1);
 i2c_write(0x03);
 i2c_write(ESC);
 i2c_write('D');
 i2c_write('L');
 i2c_write(DC1 + 0x03 + ESC + 'D' + 'L');
 i2c_start(0x10);
 do
   {
   i = i2c_readAck();
   }while (i!= ACK);
}

int text_send(int xpos, int ypos, char * text)
{
 int len, bcc, i;
 i = 0;
 len = strlen(text);
 bcc = 0;
 while (i <= len)
 {
   bcc+= text[i];
   i++;
 }
 bcc += DC1 + ESC + 'Z' + 'R'+ xpos + ypos + len;
 bcc = bcc % 0x100;
 i2c_start(0x10);
 i2c_write(DC1);
 i2c_write(0x06 + strlen(text));
 i2c_write(ESC);
 i2c_write('Z');
 i2c_write('R');
 i2c_write(xpos);
 i2c_write(ypos);
 i = 0;
 while (i <=strlen(text))
 {
    i2c_write(text[i]);
  i++;
 }
 i2c_write(bcc);
 i2c_stop();
 return (bcc);
}

int Linie_zeichnen(int x1, int y1, int x2, int y2)
{
 int bcc;
 bcc = DC1 + 0x07 + ESC + 'G' + 'D' + x1 + y1 + x2 + y2;
 bcc = bcc % 0x100;
 
 i2c_start_wait(0x10);
 i2c_write(DC1);
 i2c_write(0x07);
 i2c_write(ESC);
 i2c_write('G');
 i2c_write('D');
 i2c_write(x1);
 i2c_write(y1);
 i2c_write(x2);
 i2c_write(y2);
 i2c_write(bcc);
 i2c_stop();
 return (bcc);
}


Autor: Sven W. (wache)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, die Textroutine funktioniert nun ebenfalls mehr oder weniger.

Wenn ich im Debug-Modus ganz langsam durchgehe, dann klappen mehrere 
Sachen auch hintereinander. Ich habe das Gefühl, dass der Empfangsbuffer 
des Displays nicht hinterher kommt.

Kann mich da irgendjemand etwas aufschlauen?
Scheint ja ein I2C "Problem" zu sein...

Hier die Routine zum Text senden:
int text_send(int xpos, int ypos, char * text)
{
 int bcc, i;
 i = 0;
 bcc += DC1 + ESC + 'Z' + 'R'+ xpos + ypos + 0x06 + strlen(text);
 for (i = 0; i <= strlen(text); i++)
   bcc += text[i];
 bcc = bcc % 0x100;
 i2c_start(0x10);
 i2c_write(DC1);
 i2c_write(0x06 + strlen(text));
 i2c_write(ESC);
 i2c_write('Z');
 i2c_write('R');
 i2c_write(xpos);
 i2c_write(ypos);
 for (i = 0; i <= strlen(text); i++)
   i2c_write(text[i]);
 i2c_write(bcc);
 i2c_stop();
 return (0);
}



Gruß,

Sven

Autor: Sven W. (wache)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier nocheinmal der Vollständigkeit halber der Aufruf aus dem 
Hauptprogramm:
int main(void)
{ 
Adress_Datenbus_initialisieren();
// SPI initialisieren
  SPCR=0x5c;  
  SPSR=0x00;
// SPI Init fertig
sprintf(Text, "Beispieltext");
Zaehler_initialisieren();
at90can_init(BITRATE_500_KBPS);
sja1000_init(BITRATE_500_KBPS);
SPI_MasterInit();
i2c_init();
Display_loeschen();  
_delay_ms(2100);
text_send(10, 20, Text);

und hier die aktuelle Programmversion:
void Display_loeschen(void)
{
 int i = 0;
 i2c_start(0x10);
 i2c_write(DC1);
 i2c_write(0x03);
 i2c_write(ESC);
 i2c_write('D');
 i2c_write('L');
 i2c_write(DC1 + 0x03 + ESC + 'D' + 'L');
 i2c_stop();
}

int text_send(int xpos, int ypos, char * text)
{
 int bcc,i;
 bcc = DC1 + ESC + 'Z' + 'R' + xpos + ypos + 0x06 + strlen(text);
 for (i=0; i<=strlen(text); i++)
   bcc += text[i];
 bcc = bcc % 0x100;
 i2c_start(0x10);
 i2c_write(DC1);
 i2c_write(0x06 + strlen(text));
 i2c_write(ESC);
 i2c_write('Z');
 i2c_write('R');
 i2c_write(xpos);
 i2c_write(ypos);


 for (i=0; i<=strlen(text); i++)
   i2c_write(text[i]);
 i2c_write(bcc);
 i2c_stop();
 return (0);
}

Autor: Stefan H. (abudun)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weiß nicht ob du schon selbst drauf gekommen bist, aber meiner Meinung 
nach müsste an diversen Stellen da "Abholen" des ACK des Display fehlen!
Deswegen geht es manchmal und manchmal nicht

Grüsse

Autor: Stefan H. (abudun)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier noch als Nachtrag eine Funktionierende Routine zum Lesen der 
Version des Diplays. Zu beachten ist das Lesen des ACK das bei Erfolg 
0x06 und bei Misserfolg 0x15 ist (wenn ACK = 0x15 wird das paket 
verworfen)
Die SlaveAddr ist übrings immer 0xDE / 0xDF wenn man sowohl BA[2:0] also 
auch SA[2:0] offen lässt (interne Pull-Up Widerstände auf dem Display)

Der Code ist im übrigen nur für einen schnellen 5min Test des Displays 
geschrieben, es werden also weder ACK noch irgendwelche anderen Daten 
überprüft ;-)

void getVersion_RapidTesting(U8 data)
{
   U16 bcc;

   bcc = 0x11 + 0x03 + 0x1B + 'T' + 'V';

   i2c_start(0xDE); // START with Addr
   i2c_write(0x11); // <DC1>
   i2c_write(0x03); // len
   i2c_write(0x1B); // ESC
   i2c_write('T');  // cmd Zeichenkette ausgeben
   i2c_write('V');  // cmd Versions-Nr. ausgeben
   i2c_write((U8)bcc); // Cecksum
   // Get ACK of Disp
   i2c_rep_start(0xDF);
   data = i2c_readNak();
   i2c_stop();
   // hier könnte ACK des Display ausgewertet werden
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.