Moin ! Ich find das immer Süss, wie ihr euch hier wegen Problemen stresst, die ich schon längst durchdacht habe Ich hab mir mittlerweile man die Temp/°C Kurve von dem NTC angeschaut und weiss, welchen Widerstand er bei welcher Temperatur hat (jedenfalls beim 1.1/1.3er). Wenn mir jetz noch jemand sagt, ab welcher Temperatur es für den Motor ungesund wird, kann ich den Widerstand und damit die Spannung für meinen A/D Wandler berechnen. Das trag ich dann im Programm als (modellkonfigurierbaren, festen) Maximalwert ein. Is doch alles kein Problem Gruss, Gerrit
furchbar schwer, bei allen anderen modellen auser 1,1/1,3 wärs auch recht einfach den mittelwert zu bekommen, kabel suchen, warmfahren (bis auf den gewohnten normalstand) und dann direkt messen, 2-3 leutz gleichen den wert ab, einigen sich und schon hat man die mitte, normal, der rest is wohl weniger schwer/wichtig. Ansonsten weiter so. Sachma gerrit, das riesendisplay, passt ja gut hinter die front vom tachodeckel, aber passt der ganze klumpen überhaupt ins auto? Scheint ja doch recht groß geraten die anzeige ?
Buh Was fürn Klumpen ? Das System besteht nur aus dem Display + einer Platine, die ca genauso gross is wie das Display und direkt dahinter montiert wird. D.h. die ganze Einheit wird nicht grösser ausfallen als das normale Tachoding. Gruss, Gerrit
der temperaturfühler müste bei allen modellen in etwa die gleichen werte ausspucken den die anzeigen sind soweit ich weis auch gleich, Ich hab grad einen fühler ausm essi drinn der irgendwie andere werte bringt. Ich werd mir sowiso einen neune kaufen müssen, wenn du damit was anfangen kannst könnte ich dir den neuen fühler fürn CVH ma ausleihen bovor ich den einbau. Hmm das thermostat öfnet zwischen 85° und 89°, das is also die normale betriebstemperatur, der lüfer solte bei 100° einschalten. Ich denk ma kritisch wirds ab ab ca.105° oder 110°
Hey Prima, eine Platine weniger, die ich aufbauen muss... Da ich aber momentan wegen Stress auf der Arben zu GARNICHTS komme, weiss ich nicht, ob ich bis zum K3 fertig werde. Ich versuchs auf jeden Fall ! Gruss, Gerrit
Servus Ich schliesse mich allen an R E S P E K T du meintest webparts brauchst du eine Page oder wie sieht das aus kannst du mir etwas konkretes sagen damit ich dir helfen kann ? Ich habe viel zu tun gehabt im Webbereich Community etc. MfG Serdar
Danke ! Also... Wir sollen auf der Arbeit WebParts für den Microsoft SharePointPortalServer 2003 programmieren (Sprache: C#) , welche auf eine externe Datenbank zugreifen. Das ist ja nicht so das Problem, immerhin haben wir die Funktionalität auch schon auf "normalen" ASP.NET Seiten untergebracht. Unser Problem ist jetz, dass wir uns an die Style-Vorgaben der schon vorhandenen Sharepoint-WebParts halten sollen. Die haben da z.b. Listen mit dem "+" vor der Überschrift, die dann aufklappen und die Unterpunkte anzeigen. Oder Treeviews, die nur den aktuellen Zweig anzeigen und alle nebenliegenden Äste ausblenden um Platz zu spaaren. Die dazu notwendigen Klassen sind schon vorhanden, leider ist das ganze SCH**SS-Zeugs nichtmal in der MSDN von Microsoft dokumentiert, so dass man eigentlich nur rumraten kann, was die ganzn Klassen machen. Mittlerweile hab ich schon herausgefunden wie die Microsoft.Sharepoint.Portal.WebParts.ToolBar funktioniert, aber an diese Aufklappbare Liste bin ich noch nicht rangekommen. Dass es sie gibt ist klar, denn ein Standard-Webpart benutzt diese Funktionalität. Aber zu dem Webpart gibts halt keinen Quellcode sondern nur das fertige Ding :x Hatte ich erwähnt, dass wir in 6 Wochen mit dem Mist fertig sein sollen ? Hatte ich erwähnt, dass ich am Donnerstag bis 1830 auf der Arbeit sass ? Frohe Ostern mit dicken Eiern und so... Gruss, Gerrit
*schieb* Ich denke mal, das du wohl eher nicht dazu gekommen bist, weiter dran zu arbeiten (soll jetzt kein Vorwurf sein!). Demnach sollten sie Chancen, bei K3 einen Prototyp zu Gesicht zu bekommen, auch gegen 0 tendieren, oder?
Moin ! Ja, du hast leider recht. Momentan quäle ich mich mit Triggern, Terroristen und diesen beknackten WebParts herum. Naja, ab Mittwoch hab ich wieder Schule, hab also auch endlich Zeit wieder zu basteln... Ach halt, Cheff meinte ja, dass ich nach der Schule zur Arbeit kommen muss, weil ja ohne mich nix läuft :x Sollte ich zum K3 kommen (was ich eigentlich vor hatte) gibt es natürlich eine teilweise bestückte Platine sowie mein Test-Entwurf, der schonmal die Geschwindigkeit anzeigen kann zu sehen. Momentan warte ich aber auch noch auf die Bestellung der Spezialbauteile. Segor lässt sich da etwas SEHR lange zeit... :evil: Gruss, Gerrit
Hey Danke ! :kusswang: Fakt ist, bis zum K3 wirds nichts, weil Reichelt die Spezialbauteile immernoch nicht geliefert hat. Code: Vielen Dank fuer Ihren Auftrag. Fast alle Positionen sind ab Lager verfuegbar, Q6,0-SMD und Q16,0-SMD bestellen wir für Sie. Nach Wareneingang wird Ihr Auftrag versendet. Mit freundlichen Gruessen SEGOR-electronics GmbH - Gaul - > ------- SEGOR electronics - ONLINE Katalog ------- Datenbestand vom 15.04.2004 09:43 Lahmarschig sag ich dazu.... Zum glück wars Nachname Ansonsten sitze ich jetzt (Freitag, 1900) noch auf der Arbeit und gebe C# Quellcode von mir, in der Hoffnung, dass dieses nette WebPart nun endlich funktioniert. Wollta mal gucken ? Hier im normalen Mode: Und hier im "Bearbeiten" Mode. Man beachte, dass sich das "Programm" darunter wie ein .NET-Programm benimmt und auch programmiert wird: Hier mal zum Spass der SRC von private void btnSpeichern_Click(object sender, EventArgs e) Code: { if (iSpeichernAbfrage == 0) //frage oder speichern ? { if (iIsIntern == 1) //InternerMit { Types Typ = new Types(); VW_InternerMitarbeiterStruct vwIntMit = new VW_InternerMitarbeiterStruct(); vwIntMit.MitarbeiterID = SPControl.GetContextWeb(Context).CurrentUser.Sid; Object[] localobject = sc.GetDataObj(vwIntMit); if (localobject.GetLength(0) > 0) // Daten da ? { VW_InternerMitarbeiterStruct[] vwIntMitArr = new VW_InternerMitarbeiterStruct[localobject.GetLength(0)]; localobject.CopyTo(vwIntMitArr,0); if ( // Irgendwelche Wichtigen Angaben verändert ? (tbPersonalnummer.Text != vwIntMitArr[0].Personalnummer) || (tbAbwesendAnf.Text != ((vwIntMitArr[0].AbwesenheitAnfang != null)?vwIntMitArr[0].AbwesenheitAnfang.Substring(0,10):"")) || (tbAbwesendEnd.Text != ((vwIntMitArr[0].AbwesenheitEnde != null)?vwIntMitArr[0].AbwesenheitEnde.Substring(0,10):"")) || (tbAustritt.Text != vwIntMitArr[0].Austrittsdatum.Substring(0,10)) || (tbEintritt.Text != vwIntMitArr[0].Eintrittsdatum.Substring(0,10)) || (tbNachname.Text != vwIntMitArr[0].Nachname) || (tbNamenszusatz.Text != (vwIntMitArr[0].Namenszusatz != null?vwIntMitArr[0].Namenszusatz:"")) || (tbTitel.Text != (vwIntMitArr[0].Titel != null?vwIntMitArr[0].Titel:"")) || (tbVorname.Text != vwIntMitArr[0].Vorname) || (tbVorsatzwort.Text != (vwIntMitArr[0].Vorsatzwort != null?vwIntMitArr[0].Vorsatzwort:"")) || (ddlStatus.SelectedValue != vwIntMitArr[0].Status) || (ddlGeschlecht.SelectedValue != (vwIntMitArr[0].Geschlecht=="True"?"1":"0")) ) { FehlerLabel.Text = "Die von ihnen gemachten Angaben werden an die Personalstelle übermittelt. <br> <b>Wenn sie das wirklich wollen, nocheinmal speichern</b>"; FehlerLabel.Visible = true; iSpeichernAbfrage = 1; ViewState["SpeichernAbfrage"] = iSpeichernAbfrage; } if (tbGeburtstag.Text != (vwIntMitArr[0].Geburtstag != null?vwIntMitArr[0].Geburtstag.Substring(0,10):"")) { VW_InternerMitarbeiterStruct vwNeuInt = new VW_InternerMitarbeiterStruct(); vwNeuInt.Geburtstag = tbGeburtstag.Text; sc.UpdateDataObj(vwIntMitArr[0], vwNeuInt); } } } else { VW_ExternerMitarbeiterStruct vwExtMit = new VW_ExternerMitarbeiterStruct(); vwExtMit.MitarbeiterID = SPControl.GetContextWeb(Context).CurrentUser.Sid; Object[] localobjectExt = sc.GetDataObj(vwExtMit); if (localobjectExt.GetLength(0) > 0) ? { VW_ExternerMitarbeiterStruct[] vwExtMitArr = new VW_ExternerMitarbeiterStruct[localobjectExt.GetLength(0)]; localobjectExt.CopyTo(vwExtMitArr,0); if ( (tbAustritt.Text != vwExtMitArr[0].Austrittsdatum.Substring(0,10)) || (tbEintritt.Text != vwExtMitArr[0].Eintrittsdatum.Substring(0,10)) || (tbNachname.Text != vwExtMitArr[0].Nachname) || (tbNamenszusatz.Text != (vwExtMitArr[0].Namenszusatz != null?vwExtMitArr[0].Namenszusatz:"")) ||//Prüfung auf NULL weil leere Textbox ist Leerstring (tbTitel.Text != (vwExtMitArr[0].Titel != null?vwExtMitArr[0].Titel:"")) || (tbVorname.Text != vwExtMitArr[0].Vorname) || (tbVorsatzwort.Text != (vwExtMitArr[0].Vorsatzwort != null?vwExtMitArr[0].Vorsatzwort:"")) || (tbGeburtstag.Text != vwExtMitArr[0].Geburtstag) || (ddlStatus.SelectedValue != vwExtMitArr[0].Status) || (ddlGeschlecht.SelectedValue != (vwExtMitArr[0].Geschlecht=="True"?"1":"0")) ) { FehlerLabel.Text = "Die von ihnen gemachten Angaben müssen von ihrem Paten korrigiert werden. <br> <b>Wenn sie das wirklich wollen, nocheinmal speichern</b>"; FehlerLabel.Visible = true; iSpeichernAbfrage = 1; ViewState["SpeichernAbfrage"] = iSpeichernAbfrage; } if (tbGeburtstag.Text != (vwExtMitArr[0].Geburtstag != null?vwExtMitArr[0].Geburtstag:"")) { VW_ExternerMitarbeiterStruct vwNeuExt = new VW_ExternerMitarbeiterStruct(); vwNeuExt.Geburtstag = tbGeburtstag.Text; sc.UpdateDataObj(vwExtMitArr[0], vwNeuExt); } } } } else { if (iIsIntern == 1) { /// TODO: DATEN VERSCHICKEN FehlerLabel.Text = "Die von ihnen gemachten Angaben wurden an die Personalstelle geschickt."; FehlerLabel.Visible = true; iSpeichernAbfrage = 0; ViewState["SpeichernAbfrage"] = iSpeichernAbfrage; } else { /// TODO: DATEN VERSCHICKEN FehlerLabel.Text = "Die von ihnen gemachten Angaben wurden ihrem Paten übermittelt."; FehlerLabel.Visible = true; iSpeichernAbfrage = 0; ViewState["SpeichernAbfrage"] = iSpeichernAbfrage; } } } Wie würde meine Kollegin sagen: "cooligeili, klicky bunti tolli !!" arty: Gruss, Gerrit
Moooin ! Nich dass ihr denkt, es tut sich nichts mehr. Ich bin gerade dabei, mir eine etwas schnellere Zeichenroutine zu überlegen, weil die bisherige seeehr lahm is. Fragt BladeSZ, der war auf der Fahrt zum K3 mit dabei und hats gesehen. Wer übrigens beim K3 war und mein Display nich gesehen hat, darf sich ärgern. Es war in meinem dunkelroten Fofi eingebaut, der direkt neben FastFiesis Baustelle stand. Gugtma: Gruss, Gerrit
Tja Gerrit, wenn du die jetzige Routine veröffentlichen würdest, dann könnte ich dir eventuell helfen Kann aber verstehen, dass du das nicht willst btw: In dem Code da oben kann man auch einiges verbessern
Moin ! Tnx für das Angebot. bei der Zeichenroutine lass ich mir gerne helfen. dat funktioniert nämlich so: Das Display lässt sich natürlich nur Byte-Weise ansprechen, wobei ein Byte = 8 Bildpunkte auf dem Display sind. Um einen Bildpunkt zu schreiben, habe ich nun folgende Routine: void GPix(int x, int y, unsigned char FillStyle) { unsigned int Address; unsigned char Offset; unsigned char low; unsigned char high; unsigned char byte; x--; //Wenn ich irgendwann mal begriffen habe, das das LCD bei 0,0 y--; //anfängt, kann ich mir die Zeilen spaaren... Address = (y * (LCD_X / 8 ) ) + (x / 8 ); Offset = x % 8; //Offset = x - ((x / 8 ) * 8 ); low = (unsigned char) (Address & 0x00ff); high = (unsigned char) (((Address & 0xff00) >> 8 ) + 0x10); // die 0x10 sind StartOf Layer2 LCDWriteCmd(C_CWRITE); // CURSOR WRITE COMMAND LCDWriteData(low); // Cursor position low byte LCDWriteData(high); // Cursor position high byte LCDWriteCmd(C_MREAD); // READ LCD MEMORY COMMAND byte = LCDReadData(); // Read data at position byte |= (0x80 >> Offset); // Else der nachfolgenden IF. Is efizienter so ! if (FillStyle == 0) byte &= (~(0x80 >> Offset)); if (FillStyle ==2) byte ^= (0x80 >> Offset); LCDWriteCmd(C_CWRITE); // CURSOR WRITE COMMAND LCDWriteData(low); // Cursor position low byte LCDWriteData(high); // Cursor position high byte LCDWriteCmd(C_MWRITE); // LCD WRITE MEMORY COMMAND LCDWriteData(byte); // Write byte } //endof GPix An dieser Routine nervt mich das auslesen, blitten, reinschreiben schon tierisch, aber ich kann nicht den ganzen Display-memory nochmal im Prozessor-Ram vorhalten. Ok, um nun eine Linie zu zeichnen, bediene ich mich momentan folgender geklauter Routine. Ich gebe zu, ich verstehe sie nicht ganz.... Code: void GLine(int x1, int y1, int x2, int y2,char FillStyle) { int dx,dy,stepx,fraction; dy = y2 - y1; dx = x2 - x1; stepx = 1; // der Else-Fall vorangestellt if (dx < 0) { dx = -dx; stepx = -stepx; } dy <<= 1; // dy is now 2*dy dx <<= 1; // dx is now 2*dx GPix(x1,y1,FillStyle); if (dx > dy) { fraction = dy - (dx >> 1); // same as 2*dy - dx while (x1 != x2) { if (fraction >= 0) { y1++; fraction -= dx; // same as fraction -= 2*dx } x1 += stepx; fraction += dy; // same as fraction -= 2*dy GPix(x1,y1,FillStyle); } } else { fraction = dx - (dy >> 1); while (y1 != y2) { if (fraction >= 0) { x1 += stepx; fraction -= dy; } y1++; fraction += dx; GPix(x1,y1,FillStyle); } } } // endof GLine Wenn man jetzt noch bedenkt, dass die 7Segment-Zahlen der Geschwindigkeit immer 3 Pixel dick sind, und jedes mal alle 21 Segmente gezeichnet werden müssen.... *ahrgl* Ich werde wohl noch 2 Routinen für Hline und VLine schreiben.... Wenn Jemand bessere Vorschläge machen möchte, diese sind GERNE willkommen, aber bedenkt, dass ich für einen 8Bit-Microprozessor schreibe. Der hat keinen Coprozessor und nich viel Ram, dafür viele Register (=Variablen) @Aga Was würdest du denn an dem Code daoben noch verbessern ? Ich geb zu, ich war da ein wenig faul, immerhin wars Freitag Abend... Gruss, Gerrit
Mal ganz davon abgesehen, dass die Routine falsch ist... Eine Linie von Koordinate 20/400 nach 400/20 wird in Wirklichkeit nämlich von 400/400 nach 20/400 gezeichnet... Kannst du denn grundsätzlich ausschließen, dass X1 < X2 und Y1 < Y2 ist? Dann könnte man nämlich einiges vereinfachen.
Moin ! Also die Routine hab ich geklaut, weil ich irgendwie zu blöd war, mir selber sowas aufzustellen. Ich hab keine ahnung, warum sie was wie macht, ich weiss nur, dass sie funtioniert, sonst würde man keine einzige Linie auf dem LCD sehen. Ich kann meine Zeichenroutinen alle so schreiben, dass alle Linien in dem Halbkreis von 0° bis 180° liegen. Das wär die grösste vereinfachung, die ich anbieten kann. Ach und dann könntest du dich mal an folgender Sache versuchen: void splitInteger(int zahl) // 3stellige Zahl { unsigned char hunderter = [hier deine Magie einfügen] unsigned char zehner = [Hier deine Magie einfügen] unsigned char einer = [hier deine Magie einfügen] // so dass ich dann folgendes machen kann: Draw100erStelle( hunderter); // das gibts schon Draw10erStelle(zehner); //gibs auch schon Draw1erStelle(einer); //gibts schon } Deine Magie sollte mir also für die 1,10,100er stelle eine Zahl zwischen 0 und 10 zurückgeben. 10 bedeutet "leerzeichen", da die Geschwindigkeitsanzeige ja 5 und nicht 005 anzeigen soll. Du brauchst vllt nicht alle variablen, oder kannst auch immer die selbe nehmen, jedenfalls müssen diese 3 Unterfunktionen aufgerufen und dann jeweils die richtige Ziffer übergeben werden. (reihenfolge is auch egal) Klar habe ich schon eine Routine, die funktioniert, aber ich bin noch nicht glücklich. Vllt kommt ja bei dir was besseres raus. Aber erstmal die LineTo funktion. Das Ding nervt mich echt. Gruss, Gerrit P.S.: Find ich nett von dir, dass du dich damit beschäftigst