Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C Quellcode formatieren: <code>Quellcode</code> BASIC Quellcode formatieren: <basic>Quellcode</basic> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! -> I > > > > Hi, > > > > > > > > am meisten lernst Du dabei, wenn Du 90% selber machst, und bei Deinen unüberwindlichen Hindernissen > > > > um Hilfe fragst. Stell doch einfach hier Fragen, wie das eine oder andere gelöst wird. > > > > > > > > Gruss Peter > > > > > > Hallo, > > > gut dann will ich mal zu meiner ersten Hürde kommen: > > > Bei der Programmierung der C-Control II mit C2, kann man ein HEX-File in den Flash-Speicher schreiben, > > > worauf dann Systeminterne Routinen zugreifen. Speziell bei dem eDip-Treiber wird auf diesem Weg > > > die komplette String-Verarbeitung und die Checksummen-Berechnung durchgeführt. > > > Für die Pro habe ich bisher keine vergleichbare Funktion finden können. > > > Da es keine Infos gibt, was in den HEX-Files für ein Code steckt, kann ich die Funktionen auch nicht mit > > > normalen Code nachbilden. > > > Das ist eigentlich mein größtes Problem beim übersetzen des Treibers von C2 nach C-Pro. > > > > > > Gruß NewBee > > > > Die HEX-Files sind Assemblerroutinen für eine andere CPU. Die Stringverarbeitung und die > > Checksummenberechnung muß man dann per Hand neu schreiben. > > > > Gruss Peter > > Hallo > > ich habe ein Projekt mit dem eDIP 240-7LWTP gemacht. > ich kann nur Peter mit der Aussage "am meisten lernst Du dabei, wenn Du 90% selber machst" > zustimmen. > > Anbei sende ich dir trotzdem meine Files: > Ich habe die Programme jedoch nur auf meine Bedürfnisse angepasst. > //-------------- Programm für Ausgabe von Steuercodes bzw. Texten -------------- > // > // Bei Textausgabe len=Textlänge, code1/2 entsprechende Steuerzeichen, > // x1/y1/x2/y2 Positionsplatzhalter, downC/upC sind Zuweisungen für Tasten- > // definition. x1/y1/x2/y2/downC/upC werden bei Wert 255 ignoriert; len bei 0. > // > void eDIP_cmd(byte len,char code1,char code2,byte x1,byte y1,byte x2,byte y2, > byte downC, byte upC) > { > byte m_len; > m_len=len; > bcc_eDIP=0; // Checksummenzähler auf Null setzten > if (len>0) len=len+1; // Textlänge+NULL (Textabschluß) > len=len+3; // ESC, code1, code2 > if (x1!=255) len=len+1; if (y1!=255) len=len+1; > if (x2!=255) len=len+1; if (y2!=255) len=len+1; > if (downC!=255) len=len+1; if (upC!=255) len=len+1; > > I2C_Start(); // IIC Bus Starten > I2C_Write(eDIP_W); // Schreibadresse des Displays auf Bus > I2C_Write(DC1); // Protokollbeginn für Ausgabecode/Text > bcc_eDIP=bcc_eDIP+DC1; // Zeichen f. Protokollbeginn zu Checksumme addieren > I2C_Write(len); // Länge der zu übertragenen Byte angeben > bcc_eDIP=bcc_eDIP+len; // Bytelänge zu Checksumme > I2C_Write(ESC); // Befehlseinleitung > bcc_eDIP=bcc_eDIP+ESC; > I2C_Write(code1); // Befehlscode 1 übertragen > bcc_eDIP=bcc_eDIP+code1; > I2C_Write(code2); > bcc_eDIP=bcc_eDIP+code2; > //~~~~~~~~~~~~~~~~~~~~~~~~~~ Positionen übertragen ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > if (x1!=255) > { > I2C_Write(x1); bcc_eDIP=bcc_eDIP+x1; // Position ausgeben, Checksumme erhöhen > } > if (y1!=255) > { > I2C_Write(y1); bcc_eDIP=bcc_eDIP+y1; > } > if (x2!=255) > { > I2C_Write(x2); bcc_eDIP=bcc_eDIP+x2; > } > if (y2!=255) > { > I2C_Write(y2); bcc_eDIP=bcc_eDIP+y2; > } > if (downC!=255) > { > I2C_Write(downC); bcc_eDIP=bcc_eDIP+downC; > } > if (upC!=255) > { > I2C_Write(upC); bcc_eDIP=bcc_eDIP+upC; > } > if (m_len==0) Checks_IICstop_ACK(); // Wenn kein Text len=0 -> Abschluß > // ansonsten muss vom aufrufenden Prg noch der Text aufgerufen werden > } > > //----------------------- Leseanforderung an Display --------------------------- > void eDIP_cmd_read(char code1) > { > byte len; > bcc_eDIP=DC2; > len=1; > I2C_Start(); > I2C_Write(eDIP_W); // Schreiben ins Display > I2C_Write(DC2); > I2C_Write(len); > bcc_eDIP=bcc_eDIP+len; > I2C_Write(code1); > bcc_eDIP=bcc_eDIP+code1; > } > > //--------------- Programm für die Vorbereitung der Zeichenausgabe ------------- > //Format ist durch Übergabe änderbar > void eDIP_Text(char Format) > { > len=StringLength(Zeichenkette); // Länge der übergebenen Zeichen bestimmen > eDIP_cmd(len,'Z',Format,TXT_x,TXT_y,255,255,255,255); > Zeichenk(); > } > > //------------------- Programm gibt die Zeichen Byteweise aus ------------------ > void Zeichenk(void) > { > int m_Zeichen, i; > i=0; > while((Zeichenkette[i])&&(i<Zeichenlimit))// wiederhole solange Zeichen nicht Null > { > switch (Zeichenkette[i]) // Zeichenausgabe > { > case 'Ü': > m_Zeichen=Ü; // Sonderzeichen in Hex ausgeben > break; > case 'ü': > m_Zeichen=ü; > break; > default: > m_Zeichen=Zeichenkette[i]; > } > I2C_Write(m_Zeichen); // Zeichen ans Display senden > bcc_eDIP=bcc_eDIP+m_Zeichen; // Checksumme aktualisieren > Zeichenkette[i]=0; // Zeichenarray leeren > i++; > } > I2C_Write(NULL); // Null bedeutet für Display -> Zeichenende > bcc_eDIP=bcc_eDIP+NULL; // Checksumme aktualisieren > Checks_IICstop_ACK(); // Checksumme übergeben und Übertragung beenden > for(i=i;i<Zeichenlimit;i++) Zeichenkette[i]=0; // Array auf Null sonst > // undefinierte Zustände im weiteren Programmablauf _< BUG von IDE > } > > //-------------- Befehlsbestätigung mit Checksumme und Bus stoppen ------------- > void Checks_IICstop_ACK(void) > { > I2C_Write(bcc_eDIP); // Übergabe der Checksumme > I2C_Stop(); // Bus stoppen > AbsDelay(1); // Verzögerung notwendig, da Display für die > // Bereitstellung der Daten Zeit benötigt > eDIP_ACK(); // Bestätigung von Display abholen > } > > //------------------------- IIC Bus stoppen ------------------------------------ > void eDIP_ACK(void) > { > I2C_Start(); > I2C_Write(eDIP_R); // Lesemodus beim Display einstellen > eDIP_Daten[i]=I2C_Read_NACK(); // Bestätigung vom Display anfordern > #ifdef TEST > Msg_WriteText(" eDIP Best.:"); Msg_WriteWord(eDIP_Daten[i]); > #endif > I2C_Stop(); > } > > //---- Programm für alternative Touch-Abfrage(pullen) anstatt SBUF Interrupt --- > /* > eDIP_read_bcc=0; i=0; eDIP_Daten[i]=0; > if ((Port_ReadBit(eDIP_SBUF)==0)&&(eDIP_Daten[i]!=255)) > { > eDIP_cmd_read('S'); > Checks_IICstop_ACK(); > eDIP_ACK(); > if (eDIP_Daten[i]==DC1) > { > eDIP_read_bcc=eDIP_Daten[i]; > eDIP_ACK(); > send_len=eDIP_Daten[i]; > eDIP_read_bcc=eDIP_read_bcc+eDIP_Daten[i]; > for(i=0;i<send_len;i++) // die Variable i inkrementiert sich nun in 3er Schritten > { > eDIP_ACK(); > eDIP_read_bcc=eDIP_read_bcc+eDIP_Daten[i]; > } > i++; > eDIP_ACK(); > Msg_WriteText(" eDIP-Check:"); Msg_WriteWord(eDIP_Daten[i]); > Msg_WriteText(" Check:"); Msg_WriteWord(eDIP_read_bcc); > } > } > */ > void ISR_SBUF(void) > { > Ext_IntDisable(5); > int irqcnt; > irqcnt=Irq_GetCount(INT_5); > byte eDIP_read_bcc, send_len; > for (i=0;i<eDIP_Dat_limit;i++) eDIP_Daten[i]=0; > i=0; eDIP_read_bcc=0; send_len=0; > > eDIP_cmd_read('S'); // Sendepuffer anfordern > Checks_IICstop_ACK(); // ACK vom eDIP abholen > if (eDIP_Daten[i]!=ACK) > { > Msg_WriteText("KEIN ACK!!!!!!!!!!!!"); > Msg_WriteWord(eDIP_Daten[i]); > } > eDIP_ACK(); // DC1 abholen > if (eDIP_Daten[i]==DC1) > { > eDIP_read_bcc=eDIP_Daten[i]; // Checksumme aktualisieren->DC1 > eDIP_ACK(); // Nächstes Byte holen > send_len=eDIP_Daten[i]; > #ifdef TEST > Msg_WriteText(" eDIP-Touch_len:"); Msg_WriteWord(eDIP_Daten[i]); > #endif > eDIP_read_bcc=eDIP_read_bcc+eDIP_Daten[i]; > for(i=0;i<send_len;i++) > { > eDIP_ACK(); > eDIP_read_bcc=eDIP_read_bcc+eDIP_Daten[i]; > #ifdef TEST > Msg_WriteText(" eDIP-Touch:"); Msg_WriteWord(eDIP_Daten[i]); > #endif > if (i==eDIP_Dat_limit-1) break; // Arrayüberlauf verhindern > } > eDIP_ACK(); > #ifdef TEST > Msg_WriteText(" eDIP-Checksumme:"); Msg_WriteWord(eDIP_Daten[i]); > Msg_WriteText("="); Msg_WriteWord(eDIP_read_bcc); > #endif > if ((eDIP_Daten[i]==eDIP_read_bcc)&&(i>0)) eDIP_Touch=eDIP_Daten[i-1]; > else eDIP_Touch=0; > #ifdef TEST > Msg_WriteText(" Touch_aktuell:"); Msg_WriteWord(eDIP_Touch); Msg_WriteChar(CR); > #endif > } > else Msg_WriteWord(eDIP_Daten[i]); > #ifdef TEST > Msg_WriteText(" ISR i:"); > Msg_WriteWord(i); Msg_WriteChar(CR); > #endif > } > Bei der Touchabfrage wird nur die letzte gedrückte Taste ausgewertet. Baragraph werden auch > nicht ausgewertet. > Du musst noch entsprechende Definitionen durchführen. > > Gruß > JosefR