Technische Details / Fachchinesisch für Fortgeschrittene

Ich denk mal der GCC geht als vernünftiger Compiler durch :)

Reichelt hat heut die SD Karte geliefert und das, was ich für meinen improvisierten SD Slot brauch. Wenn ich morgen dazu komme werd ich den AVR mal ein paar Daten draufprügeln lassen.
 
Ich denk mal der GCC geht als vernünftiger Compiler durch :)

mittlerweile ja. ab den 2007er releases von winavr beherrscht der gcc hier auch "functionlevel-linking". vorher konntest du damit c++ eigentlich vergessen. im binary landete alles (unbenutzte memberfunktionen etc), womit dein flash dann recht schnell dicht war.
kommerzielle compiler sind dem gcc immer ein wenig voraus, kosten dafür aber auch nen haufen. letztendlich erzeugt der gcc ganz guten code und kommt dem iar schon recht nahe. habe mich aber seit gut nem halben jahr damit nicht mehr befasst...
 
Ich denke nicht, dass ich das in C++ aufziehen werde. Mit C und ein paar Zeigerspielereien ist man fast noch flexibler, vor allem aber braucht es weniger Platz.
Compiliert wird die Sache aber nicht mit winavr sondern avrgcc (die Linuxversion, aber sonst identisch). Mit gcc auf AVR hab ich bisher noch nicht sooo viel Erfahrung (hab schon einiges damit gemacht, aber "langjährig Erfahrung" würde ich es nicht nennen), mit ausgewachsenen Rechner + gcc allerdings schon.
 
Nachdem ich gestern am Überlegen war die Daten mit'm Hammer in die SD Karte zu meißeln (das blöde Ding wollte einfach net mit mir bzw. dem AVR reden), hat die Sache heute endlich geklappt. Die 1GB Karte weigert sich zwar nach wie vor, aber die 16MB Karte die noch rumliegt tut einwandfrei.
Liegt wahrscheinlich an den 320 Ohm Impedanz der Datenleitungen zur Karte (SD braucht 3.3V, AVR 5V, also einfacher Spannungsteiler...), die 16MB Karte läuft, seitdem ich 'n paar Waitstates drinnen hab, einwandfrei (high speed ist natürlich was anderes; ich frag mich wann mir sowas einfällt bevor ich ewig rumprobiere und rummesse, ist nicht das erste mal, dass irgend'ne Übertragung net läuft weil's zu schnell ist).

Hab mal 'n Poti an den ADC gehängt und ein bisschen dran rumgedreht, kann sich eigentlich schon sehen lassen. Hab erstmal ein Sample alle 50ms genommen, also 20Hz. Ist auch'n 21gang Präzisionstrimmer, da kann ich eh net so schnell rumdrehen.
Daten auslesen war auch kein Ding, hab das Diagram mal angehängt... Mist, aus irgendeinem Grund lässt der mich die net anhängen. Na dann halt über Webspace:

http://www.jfuhlemann.de/tmp/poti.png

Y ist der ausgelesene ADC Wert (10bit, also 0..1023), X die Samplenummer. Erstaunlich wie konstant man das Poti per Schraubenzieher drehen kann (letzter Teil) *g*


EDIT:

Jetzt mit ordentlichem Zeitbezug (Sekunden). An den roten Punkten hat er gemessen, hab außerdem ein normales Poti genommen. Sind ca. 66Hz. 1 Sektor schreiben dauert 200ms (kein Wunder bei 10us delay pro gesendetem Bit), und weil das noch ohne Interrupts läuft, wird in der Zeit nix gemessen.

http://www.jfuhlemann.de/tmp/poti2.png
 
Na Glückwunsch! Sieht doch sauber aus.
Die 1G-Karte wird anders angesprochen. Du musst da ja einen größeren Adressbereich verwalten und somit eine längere Adresse für die jeweilige Speicherzelle absondern. Zur Pegelwandlung kannst du einen 74LVC07 einsetzen. Den Käfer mit 3,3V versorgen, die Eingänge tolerieren 5V. Die Ausgänge mit Widerständen auf 3,3V oder 5V nach belieben. Mit 3ns ist der wohl schnell genug;-) Dumm nur, dass man den Kerl nur in SMD bekommt...
 
Na Glückwunsch! Sieht doch sauber aus.
Die 1G-Karte wird anders angesprochen. Du musst da ja einen größeren Adressbereich verwalten und somit eine längere Adresse für die jeweilige Speicherzelle absondern.

Hmm... also die Karte meldet sich auf CMD0 immer mit 255 statt 1. Hab mich aber auch nicht so eingehend damit beschäftigt, den Code der die SD Karte ansteuert hab ich mir woanders zusammengeklaubt.

Zur Pegelwandlung kannst du einen 74LVC07 einsetzen. Den Käfer mit 3,3V versorgen, die Eingänge tolerieren 5V. Die Ausgänge mit Widerständen auf 3,3V oder 5V nach belieben. Mit 3ns ist der wohl schnell genug;-) Dumm nur, dass man den Kerl nur in SMD bekommt...

Klingt gut, aber die paar Transistoren kann ich notfalls auch diskret aufbauen. Hab aber grad festgestellt, dass es garnet an der Impedanz der Sendeleitungen liegt, sondern an der Sendeleitung von der Karte. Die write routine läuft deutlich schneller als die read routine. Direkt am AVR Pin kann ich ohne waitstates schreiben, mit 100Ohm dazwischen mit 1us. Read geht trotz Verstärkerstufe (die wahrscheinlich in Sättigung geht) nicht unter 5us. Bin inzwischen bei 5kB/sek Datenrate, das reicht vorerst.

Hab mich auch mal um 'nen Puffer gekümmert, jetzt erfasst er die Daten mit 450Hz und geht dabei 4 ADC Kanäle durch, also pro Kanal 112.5Hz. Das gibt zwischen den einzelnen Kanälen 'ne Zeitverschiebung die ich noch net eingerechnet hab (ist aber net viel Aufwand). Auf die Karte schreiben tut er in der Zeit die übrig bleibt.
Und damit's was zu sehen gibt hab ich mal'n paar Kondensatoren über 2.2kOhm angepulst:

www.jfuhlemann.de/tmp/poti3.png

Rot müsste die Spannungsquelle sein (~0 Ohm source, 220 Ohm sink), grün/blau/lila 1uF, 10uF und 100uF.
Die Zeitdifferenz zwischen den einzelnen Kanälen ist nicht rausgerechnet, dürfte sich aber außer bei grün/rot nicht auswirken.


So könnte man die Sache immerhin schonmal an's Auto hängen, fehlen nur noch Eingangsstufen für die zu messenden Sachen. In der Form kann man auf die 16MB Karte schon 5 Stunden aufzeichnen.
 
Hübsche Demo der e-Funktion :-)

Du hast an den DO der Karte zwei Transistoren gehängt? Mach doch mal wie im Einfachschaltbild der ober verlinkten Seite. 3,3V müssten dem AVR reichen eine 1 zu erkennen.
Morgen kann ich mal guggen, wie's bei der 1G so aussieht.
 
Hab vorhin nochmal probiert, jetzt funktioniert die Sache mit dem Spannungsteiler. Hatte übersehen, dass die Karte mit max. 400kHz initialisiert werden will.

So wie's jetzt steht sollte der SPI mit 4 MHz laufen, als Datenrate hab ich aber nur ~35kB/s gemessen. Am Card Reader macht das Ding 900kB/s, also die Karte selber sollte schnell genug sein.
Muss mal nachmessen ob der SPI Takt wirklich stimmt, und gucken ob da im Code nochwas überflüssiges ist. Vielleicht ist auch der AVR zu lahm bzw. die Routine zu unoptimiert.

Die 35kB/s reichen allerdings schon für alles außer dem Klopfsensor. Mal gucken wann ich dazu komme das Ding an die Lambda zu hängen.
 
So wie's jetzt steht sollte der SPI mit 4 MHz laufen, als Datenrate hab ich aber nur ~35kB/s gemessen.

hier mal die werte vom kollegen, getestet auf irgend einem der atmega128-serie:

//=== SPEED TEST - WRITE SD_CARD (foz/2) ===
// TRANSCEND HP NOKIA
// 1Mbyte = 9850 ms 13750 ms 12400 ms
// 2Mbyte = 19450 ms 27400 ms 24200 ms
// 4Mbyte = 38650 ms 55150 ms 47400 ms


//=== SPEED TEST - READ SD_CARD (foz/2) ===
// TRANSCEND HP NOKIA
// 1Mbyte = 7100 ms 7590 ms 7000ms
// 2Mbyte = 14200 ms 15200 ms 14000 ms
// 4Mbyte = 28400 ms 30360 ms 28000 ms

foz = 7.3728MHz
512MB-Karten
 
Das wär also ~4mal so schnell wie meine Karte. Naja gut, die 16MB Karte dürfte auch schon etwas älter sein. Ansonsten häng ich mal'n 16MHz Quarz dran, aber eigentlich hat sich schon von 400kHz auf 4MHz SPI Takt kaum was an der Datenrate getan.
Aber reicht im Moment auch dicke aus. Hab einen 128byte Buffer und einen 512byte Buffer, der 128er wird, wenn er voll ist, in den 512er kopiert, und wenn der voll ist kommt der auf die Karte. Während er den 512er schreibt landen im 128er grad mal 20 Byte neue Daten (bei 450Hz, also 900 Byte/s).
Dabei dürfte das Kopieren auch einiges an Zeit brauchen, könnte man besser lösen, aber ist im Moment schnell genug. Außerdem wird noch 'n bisschen was auf's LCD geschrieben.

Hab inzwischen mal die Spannungsversorgung auf's Steckbrett gefummelt (+8, +5 und -5 aus >+8), und 'n LM324 sitzt jetzt auch drauf.
 
Hab ihn mal messen lassen wie lang die SD Karte nach dem schreiben busy ist. Für 128 Sektoren braucht er 2.76 Sekunden (Messung verlangsamt die Sache etwas), wovon er, nachdem alles gesendet ist, insgesammt 2.39 Sekunden auf die SD Karte wartet.
Die reine Datenrate liegt also bei über ~180kB/sek. Mit dem SPI Takt sind maximal 450kB/sek machbar, die Sache scheint also auf 4MHz zu laufen (bzw. exakt 3.6864MHz, hab auch'n 7.3728MHz Quarz dranhängen), und die Karte ist einfach zu lahm.

Am Wochenende will ich die Sache mal an's Auto hängen.
 
also der kollege sagte mir noch, dass seiner meinung mehr (als die testwerte von oben) drin sei. die karten seien der engpass. er hatte aber keine weiteren karten zum testen da.
ich finde aber, das obige werte schon i.o. sind, ist ja schliesslich keine monster cpu :rolleyes:
 
Ich bin endlich mal dazu gekommen reale Messwerte aufzunehmen. Soweit hat die Sache schonmal ganz gut funktioniert, nur hat er die Messwerte immer mal verschoben (ADC0 wo vorher ADC3 war, ADC1 wo vorher 0 war, 2 wo 1 usw.).
Hab das Steckbrett um ein paar LEDs und Tasten erweitert, und um die Möglichkeit zwischendurch zu pausieren - seitdem macht er das. Hab's aber wieder rausgerechnet. Muss die Sache mal entkäfern.

Hab mal wieder ein PNG gemacht (vorsicht, sehr groß!): http://www.jfuhlemann.de/tmp/lambda2.png
100 auf der Y-Achse entspricht 400mV.

Bin damit mal eine Runde um den Block gefahren. Am Anfang (also die ersten ~30sek) lief er im Leerlauf. Man sieht schön das die Sonde anfangs noch nicht ganz warm war, die Spannung steigt über die ersten 6 Regelzyklen langsam an.
Man sieht auch schön, dass die Sonde im Leerlauf sehr träge regelt, ist mir schon aufgefallen als ich mal das Oszi dranhängen hatte.

Bei so ca. 40 Sekunden bin ich dann gemächlich losgefahren. Er regelt immernoch schön nach Lambda, aber es wird unregelmäßig.

Zwischen 90 und 120sek hab ich ein paarmal richtig reingetreten (auf's Bodenblech), da kommt wohl die Volllastanreicherung.

Bei 140 Sekunden bin ich dann ein Stück mit konstantem Gas gefahren (glaub bei so ca. 2000rpm). An dem grünen Signal hängt ein Taster mit dem ich die Stelle "markiert" hab. Wie man sieht regelt er deutlich schneller.

Bei 156 Sekunden hab ich nochmal für ein paar Sekunden voll reingetreten, waren vielleicht 4 oder 5 Sekunden. Bei 162 oder so müsste ich wieder vom Gas runter gewesen sein.

Bei 186 lief er dann wieder im Leerlauf (glaub ich), ab 196 lief er dann auf 2000rpm im Leerlauf. Da regelt die Lambda schon deutlich schneller. Wo's dann nach oben geht bin ich vom Gas runter, desswegen läuft er wahrscheinlich erstmal etwas mager.
Innerhalb der 2000rpm sieht man auch wie er erst langsam regelt, und dann immer schneller wird. Dann regelt er auf einmal wieder etwas langsamer und wird wieder schneller. Vor allem die letzten beiden male wo er das macht sieht man's gut.

Interessant sind auch solche Sachen wie bei 38s. Da ist die Ableitung vom Lambdawert wenn er 0 erreicht besonders klein, vll regelt er desswegen sofort wieder hoch. Bei den vorhergehenden Zyklen wird die Kurve schon kurz vorher deutlich flacher. Bei 50 und 53 ist's auch ziemlich steil, da regelt er auch sofort wieder hoch. Bei 56s war glaub ich Schubabschaltung.


Also Fazit: Es würde viel mehr Spaß machen, wenn man wenigstens die Gaspedalstellung dazu hätte. Die wird also als nächstes realisiert.
 
Hab mir mal das Droklapoti angeguckt, scheint ein einfacher Spannungsteiler mit 5V zu sein. Sprich OPAmp dran und die Sache sollte funktionieren.

Mit'm Drucksensor wird's leider doch nicht so einfach wie ich dachte. Hab mir mal die Teile angeguckt die am APC Steuergerät hängen, die zeigen keinen Unterdruck an :(.
Weis jemand, wie das Drehzahlsignal genau aussieht? Rechteck? Dann könnte ich damit einfach einen Timer hochzählen lassen und den Timerwert 100mal pro Sekunde in den Speicher schreiben. Weis nicht mit was für Signalen der Edge Detector im AVR klarkommt, und hatte eigentlich auch keine Lust mein Tek da dranzuhängen.

Vielleicht reicht es auch nur den Überdruck zu messen. Nachdem ich gestern am Droklapoti gemessen hab, hatte ich 'nen Wackler im LMM Kabel (nicht das erste mal). Hat aber eine ganze Weile gedauert bis ich drauf gekommen bin, weil er trotzdem ziemlich gut lief (Bosch Jetronic ohne LMM läuft überaus beschi**en). Wahrscheinlich kann er im Saugerbereich über das Droklapoti den Druck vorhersagen, da lief er auch einwandfrei. Aber sowie etwas mehr Druck da war gab's keine Leistung mehr, das kann er über's Poti ja nicht vorhersagen, vom Druck weis nur das APC was.
Auf Dauer wär's aber schon schöner auch den U-Druck zu kennen. Hat vielleicht jemand die Daten für'n MAP Sensor vom 9000 und noch so'n Ding rumliegen?
 
Moin i_h!

Du meinst es ja wirklich ernst :smile: . Es geht schon schön voran.
Der Unterdruck wird über einen 'Druckabhängigen Widerstand' an Pin 10 des APC geführt. Der Drucksensor hat einen Widerstand von 10R bei 0bar und 88R bei 0,6bar. Das ist der Massebezogene Widerstand eines Spannungsteilers, der mit dem F-Poti und R40 (zusammen ca. 1200R) an 7,3V liegt, der Spannungshub an Pin 10 ist also recht klein. Aber da einen OP dran als Impedanzwandler und mit einer endsprechenden Verstärkung und du hast was hübsches für deinen AVR zum Messen.

Drehzahl liegt als Rechteck vor. Die APC-Steuerung macht daraus aber ein analoges Signal. Das kannst du an Pin10 von U6 der APC-Steuerung abgreifen, wenn du so weit in die Eingeweide der Schaltung vordringen willst.

Roland
 
Wollte mich eigentlich garnet am U-Drucksensor vom APC vergreifen, sondern einen 2. reinhängen. Das komische ist, das der, den ich hier hab, bei Normaldruck 2Ohm hat. Richtung Unterdruck passiert garnix, richtung Überdruck steigt der Widerstand recht schnell an.
Gehört das Ding vielleicht zu der 14pin APC Box?... Hab grad gesehen, da steht "11.82" drauf. Ok, dann gehört's wohl zur 14pin Box. Also 'nen anderen raussuchen (meine Teilequelle hat auch noch lauter 99 und 96 Teile, da erwischt man mitunter auch mal was uraltes).

Drehzahl wollte ich mir vom Diagnosestecker im Sicherungskasten holen. Da hab ich auch die Drehzahlleitung für's APC angelötet.
Wenn das Rechteck ist brauch ich nur noch die Amplitude, dann kann das über'n einfachen Spannungsteiler an den AVR Timer Input.

Für's Droklapoti müsste es reichen einfach ein Kabel hinten in den Stecker reinzuklemmen (die Isolierung vom Stecker ist bei mir eh schon aufgerissen), das sollte dann halten. Das Poti hat 10kOhm, aber am 324 sind eh noch 2 OPs frei.

Und für die Ventilöffnungszeiten hab ich auch schon 'ne Idee. Wenn er jeden Wert mit 100Hz abtastet und die Ventile mit max. 50Hz arbeiten (6000rpm) dürfte es am einfachsten gehen, einen 3. Timer Pegelgesteuert mit einer recht hohen Frequenz zählen zu lassen (wenn Spannung am Ventil soll er zählen) und den Timerwert regalmäßig zu speichern.
Allerdings wird das wohl 200Hz brauchen, damit man zweifelsfrei erkennt, ob der Timerwert gespeichert wurde während das Ventil offen war.
Bei 200Hz könnte der 8bit Timer mit 50kHz laufen, dann erkennt man einen Überlauf zuverlässig. Hätte eine Zeitauflösung von 20us.
Oder man nimmt 'n 16bit Timer, dann hätte man bei 200Hz 80ns Auflösung (allerdings läuft die CPU net so schnell, unter 140ns geht net). Auf jeden Fall wäre es so machbar.

Die Stromversorgung funktioniert jetzt über den Zigarettenanzünder (in dem 'ne 100mA Sicherung sitzt... sitzen sollte). Also wenn die Sensoren alle dran sind, ist die Sache recht komfortabel.
 
Hab gestern nochmal ein paar Werte aufgenommen. Droklaposition hat gut funktioniert, die Drehzahl ist aber leider nicht so gut geworden. Und den Drucksensor hab ich falsch angeschlossen (Spannungsteiler mit 470Ohm, hab ausversehen beides an + gehängt), hätte aber eh nur Überdruck angezeigt.
Muss mir mal einen für's neue APC besorgen.

http://www.jfuhlemann.de/tmp/p1.png
http://www.jfuhlemann.de/tmp/p2.png
http://www.jfuhlemann.de/tmp/p3.png
http://www.jfuhlemann.de/tmp/p4.png

Rot ist wie gehabt Lambda (200 = 1.024V), grün ist Gaspedal (50=kein Gas, 550=Vollgas). Die Drehzahl ist invertiert, ~360 ist Leerlauf, ~310 2000rpm und 250 3000rpm.
Auf dem Pin am Diagnosestecker ist zwar 'ne Gleichspannung, aber da liegt eine Wechselspannung drüber. Wahrscheinlich komm ich nicht drumherum mal das Oszi dranzuhängen.

'n paar typische Sachen erkennt man schon, bei 59s anfahren im 1., hochschalten, und dann hab ich im 2. mal ziemlich reingetreten. Ab ca. 60.5 gab's dann kleinere Haftungsprobleme bei den Rädern, sieht man aber net so gut.

Bei 452s bin ich ziemlich normal angefahren, beim schalten in den 3. hab ich die neue Drehzahl nicht richtig erwischt. Bei 514s hab ich ihn im Schubbetrieb ausrollen lassen.
Wenn ich irgendwann mal 'n ordentliches Drehzahlsignal hab skaliere ich die Sachen mal ordentlich.
 
Garkein Interesse mehr da?

Hab mir inzwischen mal 'ne kleine Platine zur Eingabe geätzt, so das ich die Steckbretter in 'nem Gehäuse unterbringen kann. Früher oder später will ich mir mal 'nen Kabelbaum mit passenden Stecker zusammenfriemeln, damit das nicht immer so nach Frickellei aussieht. Passende Stecker zum Einschleifen hab ich schon bei Reichelt gesichtet.
 
Zurück
Oben