Guten Tag, ich möchte von meinem freiprogrammierbaren Steuergerät Daten vom CAN-Bus auslesen. Ich weiß das es schon einige Beiträge dazu gibt. Die konnten mir aber leider nicht weiterhelfen. Ich kann mir zum Beispiel nicht erklären wofür ich ein CAN-Interface brauche. Ich möchte ja nur Daten abgreifen. Die Daten bestehen ja nur aus High oder low. Also Spannung oder keine Spannung. Und das kann ich mit nem Arduino ja messen. Oder ist der Bus für den Arduino zu schnell oder so? Hätte jetzt auf Anhieb auch keine Idee wie ich das genau machen soll aber es müsste ja auch ohne Interface gehen oder? Vielen Dank! Mirco
Hallo, Du hast Dir aber die physikalischen Parameter des CAN-Bus schon angesehen? Gruß aus Berlin Michael
Mirco G. schrieb: > Ich kann mir zum Beispiel nicht erklären wofür ich ein CAN-Interface > brauche. Ich möchte ja nur Daten abgreifen. Die Daten bestehen ja nur > aus High oder low. Also Spannung oder keine Spannung. Und das kann ich > mit nem Arduino ja messen. Ja und Nein. CAN ist eine differenzielle Übertragungsart. Entscheiden für 1 oder ist die Spannungsdifferenz zwischen CAN High und CAN Low. Dein Arduino verfügt jedoch nicht über differenzielle Eingänge. Einfach CAN an irgendwelche Pins anschließen liefert nur Mist. Außerdem sind bei CAN sehr spezielle Anforderungen an Spannungsfestigkeit, Flankenanstiegszeiten usw. gegeben. Der CAN Transceiver (ein extra IC) stellt sicher, dass alle Pegel gesichert sind usw. Hinten fällt ein Logik-Signal heraus. > Hätte jetzt auf Anhieb auch keine Idee wie ich das genau machen soll > aber es müsste ja auch ohne Interface gehen oder? Zusätzlich zum CAN-Transceiver (der die richtigen Spannungspegel macht) braucht man noch einen CAN-Controller. Dieses IC kümmert sich um die komplexe Logik hinter dem CAN. Es gibt Mikrocontroller die bereits einen CAN-Controller drin haben. (CAN-Transceiver brauchen sie trotzdem noch). Es sind zwar nur Einsen und Nullen aber die Logik und das Timing dahinter ist derart komplex, dass das kaum jemand in Software programmieren will. Wenn du das selbst programmieren möchtest, dann kannst du getrost von ein paar Jahren Vollzeitarbeit ausgehen. Darum kauf dir ein Shield mit CAN Controller und CAN Transceiver drauf. Nimm das in Betrieb.
Mirco G. schrieb: > Ich kann mir zum Beispiel nicht erklären wofür ich ein CAN-Interface > brauche. Ich möchte ja nur Daten abgreifen. Die Daten bestehen ja nur > aus High oder low Naja, in dem Fall eher dominanz und rezessiv... Also einen Transceiver würde ich Dir zumindest schon empfehlen um auf High und Low zu kommen. Und dann ist da noch die Bitrate. Highspeed CAN geht bis zu einem Mbit/s. Da keine Clock-Leitung vorhanden ist, muss irgendwie der richtige Samplezeitpukt erraten werden, was üblicherweise per Überabtastung und Flankenerkennung erledigt wird. Ob das der Arduino ohne Hilfe noch schafft? Nimm einen Controller! Dann musst Du Dir um so Sachen wie Bitstuffing auch keine Gedanken machen.
Puh ok :D ... Ich wusste bisher halt nur was CAN Bus ist und wie es grob funktioniert. An sich ist das Grundprinzip ja auf den ersten Blick ziemlich einfach. Deswegen hatte ich gedacht das ich die Daten einfach abgreifen kann :D. Aber gut :P Wäre auch zu schön gewesen :P. Aber dann habt ihr mir mal wieder gut weitergeholfen :P!!!! Dann werde ich mir mal son Ding besorgen und mal gucken. Muss ich dabei denn auf irgendwas achten (außer wahrscheinlich auf die Übertragungsrate)? Ich möchte Daten von einem Trijek Premium auslesen. Das hat einen 1Mbit Bus. Hier die Datenblätter (unter Downloads): https://trijekt.de/produkte/trijekt-premium/ Kann ich dann diese Modul hier verwenden? https://www.antratek.de/serial-can-bus-module-with-mcp2551-and-mcp2515?gclid=CjwKCAjw3qDeBRBkEiwAsqeO7gPaLY9Axx-Jm5Eo-PIJS2NovNZ4B60zCYM60REjpDnCW5_rH0hAZhoCVvUQAvD_BwE Sind die gleichen IC´s drauf wie auf den größeren Shields. Können die Shields noch mehr? Oder ist es das gleiche und wird hier einfach als Modul beschrieben? https://www.amazon.de/AptoFun-Receiver-Protocol-Controller-Development/dp/B0758VD6WR/ref=sr_1_9_sspa?s=computers&ie=UTF8&qid=1539883731&sr=1-9-spons&keywords=serial+canbus+module+with+mcp2551+and+mcp2515&psc=1 der hat aber einen TJA1050 Receiver... Mal wieder vielen vielen Dank für eure Hilfe! Wirklich ne spitzen Commuinty hier :). Mirco
:
Bearbeitet durch User
Die Frage ist, was Du mit den empfangenen Daten anfangen willst? Wenn es nur darum geht die Daten auf dem PC sichtbar zu machen, aufzuzeichen oder abzuspielen, wäre ein CAN/USB Adapter, die richtige Wahl. Mit einem SLCAN kompatiblen Adapter (um die 40€) und der Software CANHacker kann man schon ne Menge machen.
Mirco G. schrieb: > Ich kann mir zum Beispiel nicht erklären wofür ich ein CAN-Interface > brauche. Das kommt drauf an, was du als CAN-Interface bezeichnest. Einen Treiber, i.e. einen CAN-Transceiver für die Pegelumsetzung, brauchst du in jedem Fall. Beim Arduino Due hast du zwei CAN-Controller in Hardware mit drin, wo du nur noch den Transceiver vor setzen musst. Je nach dem, was auf deinem Bus los ist, kann das mit dem HW-Controller schon mal hilfreich sein.
Ich möchte die Daten nur auslesen und später in einem Controller verarbeiten. Hauptaufgabe wird das ausgeben der Daten auf einem OLED Display sein. Das ganze kommt halt nachher in eine "Rennwagen" den wir an der Uni bauen. Der Due ist folglich viel zu groß :D. Wollte später mit einem Arduino Mini arbeiten. Also so klein und so leicht wie möglich. Zum Entwickeln wollte ich mit meinem Uno arbeiten. Bräuchte also am besten schon ein ganzes Shield oder Modul so das ich nachher mit einem sehr kleinen Bauraum klar komme und später den Uno durch einen Mini ersetzen kann. Brauche also ein Shield/Modul mit dem ich Daten aus einem Trijekt Premium auslesen und in einem Uno und/oder Mini verarbeiten kann. @Wolfgang: Als Interface bezeichne ich das Modul/Shield das mir als Schnittstelle zwischen Steuergerät und Mikrocontroller dient.
:
Bearbeitet durch User
Dann würde ich eher auf einen uC mit integrierten CAN und Transceiver On Board zurückgreifen. Ein STM32 (Bluepill) gibts auch klein und man braucht nur einen Transceiver. Oder gleich ein Board wo alles drauf ist, gibt es zu hauf, zumindest mit nut einem CAN IF.
Mirco G. schrieb: > Kann ich dann diese Modul hier verwenden? > > https://www.antratek.de/serial-can-bus-module-with-mcp2551-and-mcp2515?gclid=CjwKCAjw3qDeBRBkEiwAsqeO7gPaLY9Axx-Jm5Eo-PIJS2NovNZ4B60zCYM60REjpDnCW5_rH0hAZhoCVvUQAvD_BwE Das ist ein CAN auf RS232-Adapter. Für deinen Zweck eher ungeeignet. Nimm ein reines MCP2515 Modul mit SPI-Schnittstelle: https://www.google.com/search?q=mcp+2515+can+module&client=firefox-b&source=lnms&tbm=isch&sa=X&ved=0ahUKEwiKyqGk55HeAhWSwosKHa6vBUkQ_AUIDigB&biw=1491&bih=928 Die gibts für 2€ bei Ebay und schliesse das dann per SPI an deinen Arduino an. Nimm doch erst mal einen CAN-USB Adapter damit du am PC überhaupt erst mal die CAN-Botschaften am Bus ansehen kannst. Ich behaupte mal um das Projekt umzusetzen wird du den sowieso brauchen denn blind für den Arduino eine Software zu entwickeln wird dich verzweifeln lassen.
Mirco G. schrieb: > Das ganze kommt halt nachher in eine "Rennwagen" den wir an der Uni > bauen. Der Due ist folglich viel zu groß :D. Wollte später mit einem > Arduino Mini arbeiten. Also so klein und so leicht wie möglich. > > Zum Entwickeln wollte ich mit meinem Uno arbeiten. Bräuchte also am > besten schon ein ganzes Shield oder Modul so das ich nachher mit einem > sehr kleinen Bauraum klar komme und später den Uno durch einen Mini > ersetzen kann. Vergiss Arduino. Das ist für CAN suboptimal. Nimm das hier: https://www.pjrc.com/store/teensy32.html Der hat einen leistungsfähigen CAN-Controller schon im Chip eingebaut. Du musst nur noch den Transceiver anschließen. Dafür empfehle ich Dir den MAX13054: https://datasheets.maximintegrated.com/en/ds/MAX13050-MAX13054.pdf fchk
Mirco G. schrieb: > ich möchte von meinem freiprogrammierbaren Steuergerät Daten vom CAN-Bus > auslesen. Hast Du denn eine Protokollbeschreibung zu dem Steuergerät? Ansonsten bekommst Du nur eine Folge von Bytes rein, deren Bedeutung Dir unbekannt ist. Erst mit der Protokollbeschreibung kannst Du diese in Menschen lesbare Daten umwandeln.
Peter D. schrieb: > Hast Du denn eine Protokollbeschreibung zu dem Steuergerät? Mirco G. schrieb: > Hier die Datenblätter (unter Downloads): > https://trijekt.de/produkte/trijekt-premium/ Die gibt es in diesem Fall tatsächlich mal öffentlich, leider nur als PDF.
Danke für eure Beiträge :). @Olli Z: Ein STM32 fällt für mich eher raus. Kenne mich wie gesagt nicht alt so gut aus und mit nem Arduino komme ich halbwegs klar. Deswegen würde ich gerne einen Arduino verwenden. @Thomas F: Das mit dem RS232 Adapter verstehe ich nicht. Wenn ich danach google finde ich nur einen Stecker der sich auf dem Modul aber gar nicht befindet. https://www.idealo.de/preisvergleich/ProductCategory/5694F1385027.html > Laut Rest: Brauche ich einen CAN-Controller und einen CAN-Transceiver. Habe die Datenblätter jetzt mal überflogen. Der MCP2515 stellt ja nur einen SPI fähigen CAN-Controller da oder? Der MCP 2551 ist ja der Transceiver. Deswegen sind ja auf den meisten Modulen auch beide IC´s verbaut oder? Dann stellt das Bauteil von meinem Link doch genau das Bauteil da welches ich brauche(auch wenn es natürlich günstiger geht): https://www.antratek.de/serial-can-bus-module-with-mcp2551-and-mcp2515?gclid=CjwKCAjw3qDeBRBkEiwAsqeO7gPaLY9Axx-Jm5Eo-PIJS2NovNZ4B60zCYM60REjpDnCW5_rH0hAZhoCVvUQAvD_BwE Bei deinem Link sind die ersten Treffer ja auch ähnlich... nur teilweise mit anderen Transceivers. https://www.google.com/search?q=mcp+2515+can+modul... Welchen Transceiver soll ich denn am besten verwenden? Oft wird ein TJA1050 oder MCP 2551 verwendet.. https://cdn-reichelt.de/documents/datenblatt/A300/SBC-CAN01-DATENBLATT.pdf Bei dem hier von Reichelt wird dann von einem MCP2562 Transceiver gesprochen obwohl ein TJA1050 verbaut ist ... jetzt bin ich komplett verwirrt :D. @fchk: Danke für den Tipp werde es aber erstmal mit nem Arduino probieren :D. Wenn das nicht klappt muss ich vlt auf deine alternative zurückgreifen. Hat jemand von euch eine Seite wo man sich Informationen über einzelne Bauteile wie z.B. CAN-Controller und Receiver einholen kann so das man grob versteht was die machen? Wie ihr merkt hab ich noch viel zu lernen :D. Und sich alles einzeln aus dem Internet zu saugen dauert sehr lange. Also nicht unbedingt zum Thema CAN sondern generell zu unterschiedlichen ICs. Es ist immer sehr anstrengend für einen Leihen sich mit einem Datasheet über die Funktion zu informieren, da man die hälfte vom Datasheet nicht versteht :D. Nochmals vielen Dank für eure Hilfe! Ohne euch wäre ich aufgeschmissen :D Mirco
Wenn Du "Arduino" sagst, meinst Du vermutlich eher die Arduino IDE und damit verbundene Programmierung?! Die ändert sich grundsätzlich beim Einsatz eines STM32 oder CANDUINO oder Teensy oder was auch immer nicht grundsätzlich. Man kann die IDE erweitern. Natürlich sind dann einige Libs anzupassen oder nicht verwendbar die hardwarenah auf den ATmega geschrieben wurden, klar. Zudem wären andere Prozessoren mit integriertem CAN-Controller (es gibt sogar welche mit integriertem Transceiver) deutlich kleiner. Aber wenn es unbedingt ein Atmega (Arduino Nano vermutlich) sein soll, dann nimm halt eines der fertigen CAN-Shields aus ebay: https://www.ebay.de/sch/i.html?_odkw=mcp2515+tja105&_osacat=0&_from=R40&_trksid=m570.l1313&_nkw=mcp2515+tja1050&_sacat=0 Dort ist ein CAN-Controller (der ist für den Empfang und das Senden der Pakete zuständig, sowie der Kommunikation zur MCU) und ein CAN-Transceiver (ein spannungsfester Pegelwandler um aus dem Differenzsignal von CAN einen Logikpegel für den CAN-Controller zu machen) vorhanden. Musst dann beides nur noch zusammenschalten. Der MCP2515 wird über die serielle SPI Schnittstelle angeschlossen. Zusätzlich gäbe es noch die Möglichkeit eines Interruptsignals um bei Empfang von Nachrichten zu reagieren und nicht ständig pollen zu müssen. Aber dein Arduino hat ja nur diese eine Aufgabe und da ist es dann egal.
Olli Z. schrieb: > Wenn Du "Arduino" sagst, meinst Du vermutlich eher die Arduino IDE und > damit verbundene Programmierung?! > > Die ändert sich grundsätzlich beim Einsatz eines STM32 oder CANDUINO > oder Teensy oder was auch immer nicht grundsätzlich. Man kann die IDE > erweitern. Natürlich sind dann einige Libs anzupassen oder nicht > verwendbar die hardwarenah auf den ATmega geschrieben wurden, klar. Okay das wusste ich nicht. Trotzdem greife ich erstmal zum Arduino :P. Wenn das später läuft und ich es noch kleiner bauen möchte greife ich vielleicht darauf zurück :P. Olli Z. schrieb: > Aber wenn es unbedingt ein Atmega (Arduino Nano vermutlich) sein soll, > dann nimm halt eines der fertigen CAN-Shields aus ebay: > https://www.ebay.de/sch/i.html?_odkw=mcp2515+tja105&_osacat=0&_from=R40&_trksid=m570.l1313&_nkw=mcp2515+tja1050&_sacat=0 Ok. Daraus schließe ich jetzt mal das es egal ist welchen der genannten CAN-Transceiver ich verwende? Olli Z. schrieb: > Dort ist ein CAN-Controller (der ist für den Empfang und das Senden der > Pakete zuständig, sowie der Kommunikation zur MCU) und ein > CAN-Transceiver (ein spannungsfester Pegelwandler um aus dem > Differenzsignal von CAN einen Logikpegel für den CAN-Controller zu > machen) vorhanden. > > Musst dann beides nur noch zusammenschalten. Der MCP2515 wird über die > serielle SPI Schnittstelle angeschlossen. Zusätzlich gäbe es noch die > Möglichkeit eines Interruptsignals um bei Empfang von Nachrichten zu > reagieren und nicht ständig pollen zu müssen. Aber dein Arduino hat ja > nur diese eine Aufgabe und da ist es dann egal. Danke für die Erklärung. Sehr hilfreich :). Ich bestelle dann mal und mache mich an die Arbeit.
Mirco G. schrieb: > Welchen Transceiver soll ich denn am besten verwenden? Für dein Projekt ist es völlig egal ob TJA1050, MCP2551 oder der alt-ehrwürdige 82c250. Aus deinem Posts schließe ich dass du der Unterschied zwischen SPI und RS232 bzw. UART gar nicht genau kennst. Das solltest du für so ein Projekt aber schon wissen. Mirco G. schrieb: > Hat jemand von euch eine Seite wo man sich Informationen über einzelne > Bauteile wie z.B. CAN-Controller und Receiver einholen kann so das man > grob versteht was die machen? Google und das WorldWideWeb. > Wie ihr merkt hab ich noch viel zu lernen :D. Und sich alles einzeln aus > dem Internet zu saugen dauert sehr lange. Da wird dir aber nichts anderes übrig bleiben. Schliesslich willst du ja irgendwann auch noch die Software schreiben. Und das Display will auch noch angesteuert werden.
Genau und da sehe ich schon das erste Problem. Der MCP wird via SPI betrieben und davon gibts im Atmega328p nur einen. Wenn Du das Display auswählst solltest Du vielleicht drauf achten das es über I2C kommuniziert, denn die meisten gehen auch über SPI. Für den MCP gibt es fix und fertige Libraries. Diese hier hab ich gern genutzt: https://github.com/coryjfowler/MCP_CAN_lib Dort findest Du auch Programmbeispiele. Ähnliches gilt für die div. Displaytypen.
Olli Z. schrieb: > Aber wenn es unbedingt ein Atmega (Arduino Nano vermutlich) sein soll, > dann nimm halt eines der fertigen CAN-Shields aus ebay: > https://www.ebay.de/sch/i.html?_odkw=mcp2515+tja105&_osacat=0&_from=R40&_trksid=m570.l1313&_nkw=mcp2515+tja1050&_sacat=0 Aufsteck Shields sind für erste Versuche aber praktischer, statt Uno 328p eher m2560 mit 4x so viel SRAM 8K statt 2K und 256K statt 32K flash. Später kannst du ja SW und HW immer noch verkleinern zu purem ATmega oder miniPRO oder eigene Platine mit m1284p im 44 PIN SMD -> 128K flash 16K SRAM https://github.com/JChristensen/mini1284 https://uge-one.com/arduino-board-based-on-atmega1284p.html https://www.geeky-gadgets.com/mini-duino-open-source-ardunio-board-based-on-atmega-1284p-21-08-2014/ um gleich mit Shield zu testen gibt es kompatible Clones mit 1284p https://feilipu.me/2013/03/08/goldilocks-1284p-arduino-uno-clone/
:
Bearbeitet durch User
Olli Z. schrieb: > Der MCP wird via SPI > betrieben und davon gibts im Atmega328p nur einen. Man darf mehre Slaves an einen SPI-Master hängen. Der ATmega328 kann auch seine UART als SPI-Master benutzen, geht sogar schneller, da gepuffert. Und der ATmega328PB kann 2 UARTs als SPI-Master benutzen.
Peter D. schrieb: > Man darf mehre Slaves an einen SPI-Master hängen. Schon, wenn die Leistung vom Bus für beides ausreicht. Sowohl MCP als auch OLED Displays sind Slaves. > Der ATmega328 kann auch seine UART als SPI-Master benutzen, ... Verliert damit aber die Möglichkeit den Arduino per USB zu programmieren und müsste auf ISP Programmer umstellen.
Joachim B. schrieb: > Später kannst du ja SW und HW immer noch verkleinern zu purem Wenn ich ihn richtig verstanden habe wollte er direkt die einsatzhardware bauen und nicht erst prototypen. Er könnte auch nen AT90CAN nehmen, oder nen PIC, oder oder, aber mir klang es eindeutig nach günstig, verbreitet und klein. Wenigstens klein ist der Mega nicht. Auch ein Standard UNO kann ein CAN Shield tragen. Aber hej, wenn er es nicht schafft 5 Dupont-Wires vom ext. CAN Shiled zum Nano zu verlegen, dann sollte er es besser gleich sein lassen...
Olli Z. schrieb: > wenn er es nicht schafft 5 Dupont-Wires vom ext. CAN Shiled > zum Nano zu verlegen er sollte aber nicht die Knappheit vom SRAM am nano unterschätzen
Thomas F. schrieb: > Für dein Projekt ist es völlig egal ob TJA1050, MCP2551 oder der > alt-ehrwürdige 82c250. Ok Danke :). Olli Z. schrieb: > Genau und da sehe ich schon das erste Problem. Der MCP wird via SPI > betrieben und davon gibts im Atmega328p nur einen. Wenn Du das Display > auswählst solltest Du vielleicht drauf achten das es über I2C > kommuniziert, denn die meisten gehen auch über SPI. Den OLED Display wollte ich so oder so über I2C ansteuern. Ist ja am einfachsten. Zumindest kenne ich das :D. Über sowas wie Flash oder Ram und co habe ich mir noch nie Gedanken machen müssen :D:D:D:D. Habe nur einfache Sachen programmiert. Da musste ich mir über sowas wie Rechenleistung nie den Kopf zerbrechen. Tut mir wirklich leid :D. Aber ich bin halt echt noch ne kleine Jungfrau was das alles angeht. Um euch nicht noch weiter zu strapazieren werde ich es einfach mal probieren :D Mal gucken was bei rauskommt :D
Mirco G. schrieb: > Den OLED Display wollte ich so oder so über I2C ansteuern und der Zeichensatz ist wo? Die OLED sind doch idR Grafik Displays ergo muß die Pixeltabelle ins Flash, auch wenn man das klein halten kann, gibt ja hier ein Beispiel.
Joachim B. schrieb: > und der Zeichensatz ist wo? > Die OLED sind doch idR Grafik Displays ergo muß die Pixeltabelle ins > Flash, auch wenn man das klein halten kann, gibt ja hier ein Beispiel. Habe bisher immer nur normale LCD´s angesteuert dachte das funktioniert beim OLED ähnlich .... Aber mit dem Problem setze ich mich auseinander wenn ich das auslesen der Daten hinbekommen habe. Aber trotzdem danke für den Hinweis. Ich habe mir jetzt mal die ganzen Datenblätter durchgelesen und bin gerade dabei mir den Code von der mcp_can.h anzugucken. https://github.com/coryjfowler/MCP_CAN_lib Ich kapiere das mit dem INT8U nicht... das hat irgendwas mit bedingter Kompilierung zu tun. Viel mehr konnte ich im Internet aber irgendwie nicht finden. Wäre ganz cool wenn mir das jemand erklären könnte. Das taucht nämlich dauernd im Code auf. Danke! Mirco
Mirco G. schrieb: > bin gerade dabei mir den Code von der mcp_can.h anzugucken. > > https://github.com/coryjfowler/MCP_CAN_lib Das Ding ist ziemlich groß und für den Einstieg sehr umfangreich. Meine Empfehlung: Lese dich doch erst mal beim Kreativen Chaos in den MCP2515 und SPI ein: http://www.kreatives-chaos.com/artikel/ansteuerung-eines-mcp2515
INT8U ist wohl ein unsigned 8 bit integer.. du solltest dich erstmal mit Grundlagen befassen, sonst wird es nicht unbedingt einfacher
Thomas F. schrieb: > Mirco G. schrieb: >> bin gerade dabei mir den Code von der mcp_can.h anzugucken. >> >> https://github.com/coryjfowler/MCP_CAN_lib > > Das Ding ist ziemlich groß und für den Einstieg sehr umfangreich. > > Meine Empfehlung: Lese dich doch erst mal beim Kreativen Chaos in den > MCP2515 und SPI ein: > > http://www.kreatives-chaos.com/artikel/ansteuerung-eines-mcp2515 Danke für die Seite!!!! Sehr sehr hilfreich :)! Sowas hab ich gesucht:) Datentypen sind Grundlagen schrieb: > INT8U ist wohl ein unsigned 8 bit integer.. du solltest dich erstmal mit > Grundlagen befassen, sonst wird es nicht unbedingt einfacher Ok, danke :)! Wie schon mehrfach erwähnt weiß ich das ich große Wissenslücken haben! Tut mir leid wenn ich euch mit meiner Unwissenheit auf den Senkel gehe:P. Ich probiere schon mir möglichst viel selber anzugucken. Ist nicht so das ich zu faul bin und immer direkt einen Eintrag hier schreibe und mir alles erklären lassen will:). Ich dachte ich würde alle Datentypen kennen deswegen haben mich die Suchergebnisse von google ein wenig verwirrt. Deswegen nochmals vielen vielen Dank für eure Hilfe und eure Geduld!.
Getreu dem Motto: Mühsam ernährt sich das Eichhörnchen geht es langsam voran :D. Glaube ich.... Sind doch riesige Schluchten an Wissenslücken die sich hier nach und nach aufzeigen. Aber wie gesagt es geht voran. Habe mir jetzt die ganze mcp_can.h jetzt mal angeschaut. A1. Die Funktionen werden ja alle in der Klasse MCP_CAN definiert. In der Klasse sind ja nur die Zeilen ab 107 öffentlich => kann ich auch nur diese Funktionen in meinem Programm aufrufen, richtig? A2. In Zeile 107 ist der Konstruktor oder? Unabhängig zur Bib habe ich noch ein paar Fragen: B1. Mit Bit Timing habe ich ja nichts am Hut oder? Das wird ja von meinem Steuergerät vorgegeben und liegt bei 1Mb/s. Also ich muss es nur auf 1 Mb/s einstellen aber nicht berechnen oder so oder? :D B2. Kann ich mein Modul irgendwie Schrotten? Also gibt es irgendwas was ich auf keinen Fall machen darf? Beim Programmieren meine ich natürlich. B3. Gibt ja jetzt ganz viele Interrupts aber mir ist irgendwie noch nicht ganz klar welche ich wann brauche. Ich brauche ja eig nur einen Buffer-Voll-Interrupt oder? Damit ich dann immer die Daten aus dem Buffer lesen kann?! Vorweg sry für eventuell ziemliche Fragen :D. Vielen Dank! Mirco
Mirco G. schrieb: > Das wird ja von > meinem Steuergerät vorgegeben und liegt bei 1Mb/s. Also ich muss es nur > auf 1 Mb/s einstellen aber nicht berechnen oder so oder? :D Wenn du für deinen MCP2515 den gleichen Quarz verwendest wie in der Lib (Habe nicht nachgesehen) kann man das einfach so übernehmen. Mirco G. schrieb: > Kann ich mein Modul irgendwie Schrotten? Nein. Nur durch Überspannung. Mirco G. schrieb: > Gibt ja jetzt ganz viele Interrupts aber mir ist irgendwie noch > nicht ganz klar welche ich wann brauche. Kommt drauf an. Habe mir die Lib nicht angesehen. Für einen einfachen Einstieg mit dem MCP2515 reicht erst mal der Receive-Irq. Mirco G. schrieb: > Ich brauche ja eig nur einen Buffer-Voll-Interrupt oder? Sind die Empfangspuffer im MCP erst mal voll ist es zu spät! Dann fängt der MCP bereits an die nachfolgenden Botschaften zu verwerfen. Deshalb lieber gleich auf einen Receive-Interrupt reagieren und die Botschaft abholen. Die kann man dann bis zur Abarbeitung immer noch im RAM zwischenspeichern.
:
Bearbeitet durch User
Thomas F. schrieb: > Dann fängt der MCP bereits an die nachfolgenden Botschaften zu verwerfen. Kleine Korrektur meines Postings: Ein voller Eingangspuffer wird mit der neuen Botschaft überschrieben, es wird also die vorherige Botschaft verworfen.
Thomas F. schrieb: > Nein. Nur durch Überspannung. Ok. Dann kann ich ja mal fleißig probieren. Thomas F. schrieb: > Wenn du für deinen MCP2515 den gleichen Quarz verwendest wie in der Lib > (Habe nicht nachgesehen) kann man das einfach so übernehmen. Kann man das im Code der Bib irgendwie erkennen?. Ich kann dazu in dem Code nix finden. Habe mich damit aber auch noch nicht groß beschäftigt. Bzw wie macht sich das ganze im Programm nachher bemerkbar? Thomas F. schrieb: > Kommt drauf an. Habe mir die Lib nicht angesehen. Für einen einfachen > Einstieg mit dem MCP2515 reicht erst mal der Receive-Irq. In dem MCP2515 Tutorial (http://www.kreatives-chaos.com/artikel/ansteuerung-eines-mcp2515) gibt es nur einen Receive-Buffer Full interrupt?! Thomas F. schrieb: > Sind die Empfangspuffer im MCP erst mal voll ist es zu spät! Dann fängt > der MCP bereits an die nachfolgenden Botschaften zu verwerfen. > Deshalb lieber gleich auf einen Receive-Interrupt reagieren und die > Botschaft abholen. Die kann man dann bis zur Abarbeitung immer noch im > RAM zwischenspeichern. Der unterbricht ja erst wenn der Buffer voll ?! Dann wird ja mein Pin den ich beim initialisieren dafür konfiguriert habe auf low gezogen. Das ist ja dann mein Signal zum auswerten. In der Anleitung steht aber die bleibt so lange low bis "alle Interrupt-Bedingungen" aufgelöst sind. Also meine Buffer wieder leer sind. Nur wie lösche ich die Daten aus dem Buffer dazu finde ich keine Funktion. Oder wird einfach die Interrupt Flag gelöscht? Werde dann mal probieren die Schritte von dem Tutorial für die Initialisierung und das Empfangen der Nachrichten mit der Bib nachzubauen. Mal schauen was dabei herauskommt. Nochmals vielen Dank für eure Hilfe!!!! Mirco
Mirco G. schrieb: >> Wenn du für deinen MCP2515 den gleichen Quarz verwendest wie in der Lib >> (Habe nicht nachgesehen) kann man das einfach so übernehmen. > > Kann man das im Code der Bib irgendwie erkennen?. Ich kann dazu in dem > Code nix finden. Hier:
1 | void mcp2515_init(void) |
2 | {
|
3 | /*
|
4 | * Einstellen des Bit Timings |
5 | * Fosc = 16MHz |
Es wird also von einem 16MHz Quarz ausgegangen. > In dem MCP2515 Tutorial > (http://www.kreatives-chaos.com/artikel/ansteuerung-eines-mcp2515) gibt > es nur einen Receive-Buffer Full interrupt?! > Der unterbricht ja erst wenn der Buffer voll ?! Der Receive-Interrupt wird immer dann ausgelöst wenn einer der beiden Puffer im MCP eine neue CAN-Botschaft enthält. > Nur wie lösche ich die Daten aus dem Buffer dazu finde ich keine > Funktion. Oder wird einfach die Interrupt Flag gelöscht? Steht eigentlich alles hier: http://www.kreatives-chaos.com/artikel/ansteuerung-eines-mcp2515#receive
Thomas F. schrieb: > Es wird also von einem 16MHz Quarz ausgegangen. Das ist aber doch aus dem Beispiel von kreatives Chaos. Ich meinte eig die Bib (https://github.com/coryjfowler/MCP_CAN_lib/blob/master/mcp_can_dfs.h). Ich habe auf meinem UNO einen 16MHz Quarz und auf dem CAN interface einen 8MHz Quarz. Was muss ich dann beim initialisieren einstellen? Den Rest mache ich dann auch alleine :D. Komme mir schon richtig doof vor hier für jeden scheiß zu Fragen. Vlt ist das Projekt für einen Anfänger ein wenig zu schwer :D. Probiere jetzt einfach das ganze mit dem Receive Beispiel aus der Bib zu machen. Das CAN Protokoll von meinem Steuergerät ist so einfach da brauche ich vermutlich eh keine Filter...
Mirco G. schrieb: > und auf dem CAN interface einen 8MHz Quarz. > Was muss ich dann beim initialisieren einstellen? Hier gibts ein kleines Programm das dir die Werte für die Baud-Rate-Register CNF1-3 ausrechnet: https://www.intrepidcs.com/products/free-tools/mb-time-calculator/
Thomas F. schrieb: > Hier gibts ein kleines Programm das dir die Werte für die > Baud-Rate-Register CNF1-3 ausrechnet: > > https://www.intrepidcs.com/products/free-tools/mb-time-calculator/ Das Bit-Timing überschreitet irgendwie meinen Horizont... In der Bib wurden aber auch die einzelnen Baud-Rate-Register CNF1-3 abhängig von den Parametern, die man in der CANO.begin funktion angibt, schon vorbelegt. So das diese glaube ich automatisch eingestellt werden. Je nachdem ob man MCP_8MHZ oder MCP_16MHZ angibt. Habe beides Probiert. Trotzdem kommt nix bei raus..... Habe einfach mal das Receive Beispiel aus der Bib genommen. Das sollte mir ja eig alle Werte ausgeben, da keine Maske oder Filter eingestellt werden.
1 | // CAN Receive Example
|
2 | //
|
3 | |
4 | #include <mcp_can.h> |
5 | #include <SPI.h> |
6 | |
7 | long unsigned int rxId; |
8 | unsigned char len = 0; |
9 | unsigned char rxBuf[8]; |
10 | char msgString[128]; // Array to store serial string |
11 | |
12 | #define CAN0_INT 2 // Set INT to pin 2
|
13 | MCP_CAN CAN0(10); // Set CS to pin 10 |
14 | |
15 | |
16 | void setup() |
17 | {
|
18 | Serial.begin(115200); |
19 | |
20 | // Initialize MCP2515 running at 16MHz with a baudrate of 500kb/s and the masks and filters disabled.
|
21 | if(CAN0.begin(MCP_ANY, CAN_1000KBPS, MCP_8MHZ) == CAN_OK) |
22 | Serial.println("MCP2515 Initialized Successfully!"); |
23 | else
|
24 | Serial.println("Error Initializing MCP2515..."); |
25 | |
26 | CAN0.setMode(MCP_NORMAL); // Set operation mode to normal so the MCP2515 sends acks to received data. |
27 | |
28 | pinMode(CAN0_INT, INPUT); // Configuring pin for /INT input |
29 | |
30 | Serial.println("MCP2515 Library Receive Example..."); |
31 | }
|
32 | |
33 | void loop() |
34 | {
|
35 | if(!digitalRead(CAN0_INT)) // If CAN0_INT pin is low, read receive buffer //Wird nicht erfüllt |
36 | |
37 | |
38 | {
|
39 | CAN0.readMsgBuf(&rxId, &len, rxBuf); // Read data: len = data length, buf = data byte(s) |
40 | |
41 | if((rxId & 0x80000000) == 0x80000000) // Determine if ID is standard (11 bits) or extended (29 bits) |
42 | sprintf(msgString, "Extended ID: 0x%.8lX DLC: %1d Data:", (rxId & 0x1FFFFFFF), len); |
43 | else
|
44 | sprintf(msgString, "Standard ID: 0x%.3lX DLC: %1d Data:", rxId, len); |
45 | |
46 | Serial.print(msgString); |
47 | |
48 | if((rxId & 0x40000000) == 0x40000000){ // Determine if message is a remote request frame. |
49 | sprintf(msgString, " REMOTE REQUEST FRAME"); |
50 | Serial.print(msgString); |
51 | } else { |
52 | for(byte i = 0; i<len; i++){ |
53 | sprintf(msgString, " 0x%.2X", rxBuf[i]); |
54 | Serial.print(msgString); |
55 | }
|
56 | }
|
57 | |
58 | Serial.println(); |
59 | }
|
60 | }
|
Aber das erste Problem ist schon das ich quasi keinen Interrupt bekomme also if(!digitalRead(CAN0_INT)) nicht erfüllt ist. Wenn ich das dann rausnehme bekomme ich auf der Seriellen Ausgabe nur das hier: 16:27:17.948 -> Standard ID: 0x000 DLC: 0 Data: 16:27:17.948 -> Standard ID: 0x000 DLC: 0 Data: 16:27:17.948 -> Standard ID: 0x000 DLC: 0 Data: 16:27:17.948 -> Standard ID: 0x000 DLC: 0 Data: Wenn CAN LOW und HIGH abziehe wird aber genau das gleiche ausgegeben:D. Ich will einfach nur alle Daten vom Bus auslesen. Irgendjemand noch eine Idee? Wäre schön wenn mir irgendjemand noch helfen kann wenigstens ein wenig vom Bus auszulesen. Ich bin verzweifelt :D:D Mirco
Mirco G. schrieb: >> https://www.intrepidcs.com/products/free-tools/mb-time-calculator/ > > Das Bit-Timing überschreitet irgendwie meinen Horizont... So, habs gerade ausprobiert: Mit einem 8 MHz Quarz gehen keine 1MBit, nur max. 500kBit/s. Wenn du einen 1MBit-Bus hast musst du mindestens einen 16MHz Quarz einlöten. Habe ich übrigens auch gemacht. Die Werte für CNF 1-3 sind dann 00H, 90H, 02H.
DANKE! Du bist ein Schatz :D. Ohne dich hätte ich schon lange aufgeben müssen. Aber was ist das für ein scheiß von den Herstellern ... https://www.amazon.de/AptoFun-Receiver-Protocol-Controller-Development/dp/B0758VD6WR/ref=sr_1_9_sspa?s=computers&ie=UTF8&qid=1539883731&sr=1-9-spons&keywords=serial+canbus+module+with+mcp2551+and+mcp2515&psc=1 Hab genau das Ding bestellt ... da steht in der Beschreibung "bis 1Mb/s". Habe auch nochmal nach anderen Shields geguckt... viele haben einen 8Mhz Quarz und behaupten in der Beschreibung das 1Mb/s möglich sind .... Kannst du mir mal deinen Code schicken? Wenn du auch einen MCP2515 nutzt und einen Arduino kann ich bei mir ja einfach einen 16MHz Quarz einlöten und es mal mit deinem Code probieren. Dann weiß ich wenigstens das der Code stimmt. Bei mir kann der Fehler nämlich überall liegen :D. So hätte ich schon eine große Fehlerquelle ausgeschlossen. VIELEN VIELEN DANK!
Beitrag #5599119 wurde vom Autor gelöscht.
HALT STOP! :D Angeblich ist laut Trijekt ist die Übertragungsgeschwindigkeit zwischen 500kbs und 1000kbs einstellbar. Wenn ich das auf 500kbs einstelle müsste es ja mit 8 Mhz klappe.... In der Bib sind aber auch ganz andere werte als deine :D. mcp2515_setRegister(MCP_CNF1, cfg1); mcp2515_setRegister(MCP_CNF2, cfg2); mcp2515_setRegister(MCP_CNF3, cfg3); cfg1 = MCP_16MHz_1000kBPS_CFG1; cfg2 = MCP_16MHz_1000kBPS_CFG2; cfg3 = MCP_16MHz_1000kBPS_CFG3; break; #define MCP_16MHz_1000kBPS_CFG1 (0x00) #define MCP_16MHz_1000kBPS_CFG2 (0xCA) #define MCP_16MHz_1000kBPS_CFG3 (0x81) /* Sample point at 75% */ Welche werte muss ich dann also für 500kb/S mit 8 Mhz einstellen :D? Ich spring gleich aus dem Fenster :D:D:D.
Die Lib muss für den Einsatz eines 8 MHz CAN Shield angepasst werden. Da stimmt sonst garnix, leider, Das hat mich damals auch einige Tage gekostet ;-) Such mal danach, womöglich findest Du sogar ein Codebeispiel von mir dazu in Fowlers Github.
Bevor ich das mache nehme ich lieber einfach auch n 16 Mhz Quarz. Verstehe aber auch nicht warum man dann in der Bib 8 Mhz einstellen kann. Aber trotzdem sollten die Werte von Thomas und die aus der Bib ja übereinstimmen da ja beide von 16 MHz ausgehen oder? Um aber auch den CAN-Bus vom Trijekt als Fehler auszuschließen wollte ich den mal oszilloskopieren. Grundsätzlicher Ablauf: An CAN High und CAN LOW jeweils einen 120 Ohm Widerstand hängen und an die Kanäle von meinem Oszilloskop anschließen. Aber wo schließe ich die Ground Klemme an ... Hab jetzt schon ne Stunde im Internet gesucht. Dazu gibt es auch hier im Forum einige Beiträge aber irgendwie kommt keiner zu einer konkreten Lösung :D. Vermutlich ja nicht einfach an die Masse vom Auto oder? Für Analoge Drehzahlsignale gibt es ja auch immer ne eigene Masse?! Habe einen 2 Leiter CAN also kein CAN Ground. Oder kann ich den Ground Anschluss von einem Vollkommen unabhängigen Labornetzteil nehmen :D. Habe ich auch in einem Video gesehen aber das war mir irgendwie nicht ganz geheuer. Wahrscheinlich auch wieder ne simple Frage aber ich weiß es halt nicht :D. Fühle mich mittlerweile wie der letze Trottel :D. NOCHMALS VIELEN DANK FÜR EURE GEDULD!
Mirco G. schrieb: > Kannst du mir mal deinen Code schicken? Wenn du auch einen MCP2515 nutzt > und einen Arduino kann ich bei mir ja einfach einen 16MHz Quarz einlöten > und es mal mit deinem Code probieren. Den kannst du haben, aber ich programmiere in Assembler frei von aller Arduino-software. > Wenn ich das auf 500kbs einstelle müsste es ja mit 8 Mhz klappe.... Ja. > Welche werte muss ich dann also für 500kb/S mit 8 Mhz einstellen :D? Kann ich dir erst heute abend sagen... > Grundsätzlicher Ablauf: An CAN High und CAN LOW jeweils einen 120 Ohm > Widerstand hängen. Nicht jeweils, je einen R120 von High nach Low an beiden Enden des Busses, evtl sitzt ja schon einer im Steuergerät. Aber nimm doch einfach die kleine Platine mit dem MCP2515 für dein Busende, die hat doch den Abschlusswiderstand schon mit drauf. Einfach den Jumper schliessen. > Aber wo schließe ich die Ground Klemme an. An Masse der MCP2515-Platine. Der Transceiver auf der Platine stellt hier den Massebezug für dich her.
:
Bearbeitet durch User
Thomas F. schrieb: > Den kannst du haben, aber ich programmiere in Assembler frei von aller > Arduino-software. Das werde ich dann vermutlich nicht entziffern können :P. Thomas F. schrieb: > Kann ich dir erst heute abend sagen... Das wäre absolute Spitze :D.
Mirco, achte auf die Masse! Nur CAN HI und LO reicht nicht, weil das Bezugspotential fehlen würde. Also drei Adern zum Steuergerät legen.
Olli Z. schrieb: > Mirco, achte auf die Masse! Nur CAN HI und LO reicht nicht, weil das > Bezugspotential fehlen würde. Also drei Adern zum Steuergerät legen. Es gibt aber keine CAN Ground Anschluss am Steuergerät. Und das CAN Modul zum Auswerten hat ja auch nur Anschlüsse für CAN High und CAN low. Es gibt doch auch zweiadrige und dreiadrige CAN BUS Systeme. VLt ist meins ja einfach zweiadrig. Trd Danke!
Mirco G. schrieb: > Es gibt aber keine CAN Ground Anschluss am Steuergerät. Dann nimmst du eben die Masse vom Steuergerät.
Mirco G. schrieb: > Es gibt aber keine CAN Ground Anschluss am Steuergerät. Und das CAN > Modul zum Auswerten hat ja auch nur Anschlüsse für CAN High und CAN low. > > Es gibt doch auch zweiadrige und dreiadrige CAN BUS Systeme. VLt ist > meins ja einfach zweiadrig. Nein. Zweiadrig wäre "Single-Wire-CAN". CAN braucht IMMER ein Bezugspotential wenn es in Kupfer ausgeführt ist. Bei Singlewire gibt es eben keine differentielle Übertragung. Ist schon uralt und nur für kurze Strecken mit wenig Störeinstrahlung zu verwenden. Entsprechend niedrig sind die Übertragungsraten. Du hast ein (vermutlich Highspeed-)CAN und damit 1x Masse und 2x Signal (CAN HI, CAN LO). Im KFZ ist es üblich die CAN-Module nur mit den Signalleitungen zu vernetzen, denn die Masse holt sich jedes Modul am gleichen Bezugspunkt über Massepunkte an der Korosserie. Die Masse vom Steuergerät findest Du am Stecker der Stromversorgung des Moduls, wie es Igel F. geschrieben hat. Die Masse für den CAN-Shield/Arduino musst Du halt ebenfalls von dessen Stromversorgungs-Pin (GND) beziehen. Es ist also ganz normal das dort kein separater Masse-Anschluß vorhanden ist.
Möchte vor Scharm im Boden versinken :D. Anscheinend bin ich mir selbst über die Begrifflichkeit der Masse nicht ganz im klaren :D. Tut mir leid :/. Thomas F. schrieb: > An Masse der MCP2515-Platine. Der Transceiver auf der Platine stellt > hier den Massebezug für dich her. Also ich hatte Thomas ursprünglich dann so verstanden (siehe Zeichnung im Anhang). So wie ich Olli verstehe muss ich GND_S(GND) jetzt doch noch mit einbeziehen. Soll ich jetzt einfach GND_A, GND_M, und GND_S alle zusammenführen? Kann man das generell machen? Weil ich ja jetzt unterschiedliche Spannungsquellen (Batterie mit 12V f. Steuergerät und USB 5V für Arduino) habe ist mir das irgendwie nicht geheuer. Das Steuergerät kostet halt auch n paar hundert Euro. Deswegen bin ich da so vorsichtig.... NOCHMALS VIELEN DANKE! Kann ich mich vielleicht irgendwie bei euch erkenntlich zeigen? Ist ja nicht selbstverständlich das ihr euch die Zeit nehmt und mir selbst solche grundlegenden Sachen erklärt. Ich suche auch jedes mal im Internet bevor ich euch Frage. Aber man findet fast nie wirklich passende Beiträge.
Mirco G. schrieb: > Kann man das generell machen? Weil ich ja jetzt unterschiedliche > Spannungsquellen (Batterie mit 12V f. Steuergerät und USB 5V für > Arduino) habe ist mir das irgendwie nicht geheuer. Das Steuergerät > kostet halt auch n paar hundert Euro. Deswegen bin ich da so > vorsichtig.... Gerade deshalb solltest Du alle GNDs verbinden. Ich hatte mal einen Tisch-Aufbau mit zwei CAN-Teilnehmern, die beide mit separaten Schaltnetzteilen versorgt wurden. Damit habe ich mir zwei CAN-Transceiver zerschossen bevor ich die GNDs verbunden habe und alles lief. Die Eingangsschutzbeschaltung der Dinger war halt auch nicht der Hit. Also - GND ist der Bezugspunkt für alle Geräte. Wenn der nicht gleich ist, gibts Probleme.
Peter schrieb: > Gerade deshalb solltest Du alle GNDs verbinden. > Ich hatte mal einen Tisch-Aufbau mit zwei CAN-Teilnehmern, die beide mit > separaten Schaltnetzteilen versorgt wurden. Damit habe ich mir zwei > CAN-Transceiver zerschossen bevor ich die GNDs verbunden habe und alles > lief. Die Eingangsschutzbeschaltung der Dinger war halt auch nicht der > Hit. > > Also - GND ist der Bezugspunkt für alle Geräte. Wenn der nicht gleich > ist, gibts Probleme. Oh okay ... Das wusste ich nicht :(. Dann kann ich zum Verbinden ja einfach den 2. Pin vom Arduino nehmen?! (Zeichnung wieder im Anhang) Habe das natürlich aber auch vorher schon am CAN Bus angeschlossen gehabt. Wie kann ich dann jetzt prüfen ob mein Receiver, wie bei dir, dabei drauf gegangen ist? :D. Sonst weiß ich später wieder nicht ob es an meinem Programm oder am Receiver liegt :D.
Hier noch die Werte für die Bitraten-Einstellung am MCP2515 mit 8MHz-Quarz:
1 | speed CNF1 CNF2 CNF3 |
2 | |
3 | 50k 03H BAH 07H |
4 | 100k 01H BAH 01H |
5 | 125k 01H B8H 05H |
6 | 250k 00H B8H 05H |
7 | 500k 00H 90H 02H |
8 | 1M geht nicht |
Die meisten Steuergeräte senden beim einschalten bereits etliche IDs auf den Bus. Also einfach mal ohne Shield dein Oszi an den CAN hängen, Power aufs Modul und schaun ob die Leitungen zucken. Wenn dem so ist, dann musst Du das mit dem Shield auch empfangen können.
Mirco G. schrieb: > Wie kann ich dann jetzt prüfen ob mein Receiver, wie bei dir, dabei > drauf gegangen ist? :D. > Sonst weiß ich später wieder nicht ob es an meinem Programm oder am > Receiver liegt Klemm einen Kanal des Oszi an CAN-H oder CAN-L. Den anderen Oszi-Kanal an den RX-CAN Pin des MCP2515 oder des Transceivers. Wenn der Transceiver funktioniert solltest du auf beiden Kanälen etwas sehen.
Ok :) Danke!! Kann leider erst wieder Montag ans Auto :( Aber dann teste ich alles mal durch mal gucken was dabei rumkommt :D. Ist eh immer mega lästig an das Steuergerät ranzukommen :/. Wenn es schon IDs sendet wenn es angeschaltet wird kann ich mir das Steuergerät nicht mit nach Hause nehmen und einfach 12 V von meinem Netzteil drauflegen? Oder kann ich das damit schrotten? Dann könnte ich nämlich viel Schneller arbeiten. Mein Netzteil hat drei Anschlüsse - + und GND den hab ich aber noch nie verwendet. Ich schließe mein Ground von den Controllern dann aber an - vom Netzteil an nicht an Ground ne? Und zur Sicherheit wollte ich schon nen anderen Quarz bestellen. https://www.reichelt.de/standardquarz-grundton-16-000000-mhz-16-0000-hc49u-s-p32852.html?PROVID=2788&gclid=CjwKCAjwmdDeBRA8EiwAXlarFmKDt61p6PjsoBLEvH13ZAGjGWhz5Cnr9DH2kF65rZ05xOtChQtC4RoC3hgQAvD_BwE&&r=1 passt der ? DANKE!!!!
:
Bearbeitet durch User
Das Steuergerät nimmt keinen Schaden ausserhalb des Fahrzeugs, keine Bange. Es wird aber sicher keine sinnvollen Daten liefern, ohne die angeschlossenen Sensoren. Möglicherweise benötigt es neben der Hauptstromversorgung noch sowas wie ein Zündplus signal um Daten zu liefern. Musst Du ausprobieren. Netzteil - IST Dein GND. Ggf. hat das Netzteil einen Erdungs Pin, das ist aber wieder was anderes. Und ja, der Quarz ist genau richtig.
:
Bearbeitet durch User
Hatte jetzt endlich mal wieder Zeit....Gerade nochmal alles getestet :( Leider wieder ohne Erfolg. 1. Zuerst hab ich das Steuergerät nochmal mit dem Programm von Trijekt eingestellt. 500 kbits und Protokoll Nr. 1 (also alle Daten werden nach einem Identifier gesendet (nicht nur 128 bit pro Nachricht) 2. Dann hab ich einfach nur mal mit dem Oszi geguckt ob überhaupt was kommt. => Es wird auf jeden Fall schon mal was gesendet(s. Bild 5) 3.Danach hab ich es dann nochmal mit mit meinem Code von oben Probiert. Solange noch keine Spannung am Steuergerät liegt kommt in der Seriellen Ausgabe wieder nur: 16:27:17.948 -> Standard ID: 0x000 DLC: 0 Data: Sobald ich dann das Netzteil anschalte bleibt das Programm stehen. 4. Dann hab nochmal das Oszi an das CAN interface angeschlossen. Während der Arduino strom hatte. Dann hat es aber sehr komisch gehackt... (Bild 6:Achtung Zeit auf X Achse verstellt deswegen sieht es anders aus) 5. Dann hab ich den Arduino vom USB rausgezogen daraufhin sieht es dann ganz komisch aus. (s.Bild 7) 6. Den Transceiver hab ich auch wie vorgeschlagen getestet. Bei Bild 8 ist nur ein Kanal an High angeschlossen der andere noch nicht an RX. Bei Bild 9 bin ich dann am RX pin vom Transceiver. Der sollte also auch funktionieren. 7. Zu aller letzt hab ich dann noch die anderen Werte für CNF1-3 für einem 8 Mhz Quarz probiert. Auch keinen Erfolg das Programm hat sich genau wie bei Schritt 1 verhalten. Den 16Mhz Quarz hab ich aber noch nicht probiert. Ist ja aber auch überflüssig da ich jetzt ja genau weiß das der Bus auf 500kbits läuft. Zumindest kann ich jetzt das Steuergerät als Fehlerquelle ausschließen. Nur ich weiß halt nicht ob der Fehler in Soft- oder Hardware liegt .... :/. Irgendjemand eine Idee wie ich das raus bekomme? Vielen Dank für eure Beiträge! Mirco
Keiner eine Idee? Mir würde es schon reichen wenn mir einer sagt wie er bei solchen Problemen vorgeht.
Mirco G. schrieb: > 2. Dann hab ich einfach nur mal mit dem Oszi geguckt ob überhaupt was > kommt. => Es wird auf jeden Fall schon mal was gesendet(s. Bild 5) Dann miss doch mit dem Oszi mal nach ob die 500kBit jetzt stimmen. > 5. Dann hab ich den Arduino vom USB rausgezogen daraufhin sieht es dann > ganz komisch aus. (s.Bild 7) Das Oszi steht jetzt plötzlich auf AC statt wie vorher auf DC. > Nur ich weiß halt nicht ob der Fehler in Soft- oder Hardware liegt .... Alle Verbindungsleitungen dran: MISO, MOSI, CLK, CS, INT, 5V, GND? Meist liegt der Fehler dann in der Software. Aber dazu kann ich dir nicht helfen da ich mit Arduino nix mache.
Mein Reader: Arduino, CANBUS Adapter, SD, RTC, 3,5 TFT Adafruit, Gruß
@MircoG Ist das Thema noch aktuell? Entgegen vieler Behauptungen hier, sage ich - den CANBUS auslesen geht ohne Probleme! Die Basic Codes von Arduino reichen aus. Wenn man diese etwas umschreibt und kombiniert bekommt man ein ausgezeichnetes Lesegerät/ Recorder. Wie ich verstehe, hast Du die Leitungen identifiziert? H ca 3,5V ;L ca 2,6 V , Werte die von jedem Digital MMeter angezeigt werden. Fahrzeug Masse CANBUS H und L anschließen. Arduino am Laptop. SerialPrint. Setup auf 500 kbps stellen. Wenn nichts kommt H/L checken bzw tauschen. Es kann nichts kaputt gehen! Ggf auf 250/200... gehen. Falls Interesse an Code, melden. Mein Reader: Arduino, CANBUS Adapter, SD, RTC, 3,5 TFT Adafruit, CANBUS Daten, Ausgabe im Display / Tacho. Gruß
Gabriel schrieb: > > Falls Interesse an Code, melden. > > Mein Reader: Arduino, CANBUS Adapter, SD, RTC, 3,5 TFT Adafruit, > > CANBUS Daten, Ausgabe im Display / Tacho. > > Gruß Hallo, ich habe Interesse an dem Code, ev. auch Schaltplan und Teileliste mit beschaffungslinks von deinem Reader, zweck's Nachbau. Oder du stellst dein Reader in einem neuen Beitrag ausführlich vor. MfG Niko.
Hallo Niko, Liste: Arduino Mega, Adafruit TFT 3,5", SD Slot, Joy it Canbus Adapter mit 16 Mhz, 78L05 Regler, C 47 µF / 25 V Optional RTC und OBD K-Line Adapter. Quellen : Eckstein, Mouser, EXP Tech, Conrad etc pp Code, Version ohne OBD, RTC, SD. PID audi a4B5 tdi: Für andere Fahrzeuge , erst einen einfechen Canbus + SD reader bauen und anschliessen !!! Liste der PID erstellen und entsprechend ändern! @ Moderatoren: Sorry, Datei als Anhang wird nicht genommen :-( //////////////////////////////////////////////////////////////////////// /// #include <stdint.h> #include "TouchScreen.h" #include <SPI.h> #include <Adafruit_GFX.h> #include "Adafruit_HX8357.h" #include <MCUFRIEND_kbv.h> #define TFT_RST 8 #define TFT_DC 9 #define TFT_CS 10 #define YP A1 #define XM A0 #define YM 28 #define XP 29 TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); Adafruit_HX8357 tft = Adafruit_HX8357(TFT_CS, TFT_DC, TFT_RST); #include <Fonts/FreeSans9pt7b.h> #include <Fonts/FreeSans12pt7b.h> #include <Fonts/FreeSerif12pt7b.h> #include <FreeDefaultFonts.h> #include <Fonts/FreeSansBold18pt7b.h> #include <Fonts/FreeSansBold24pt7b.h> #define width 320 #define height 480 #define BLACK 0x0000 #define RED 0xF800 #define GREEN 0x07E0 #define BLUE 0x000F #define WHITE 0xFFFF #define GREY 0x8410 #define YELLOW 0xFFE0 int ID; int setID; int CANID; int Menu = 0; int Return = 0; int setPID; int sBY1 , rB; int Byte0,ByteDisp, bitDisp; int Bit0, Bit1, Bit2, Bit3 ,Bit4 ,Bit5 ,Bit6, Bit7; int aBit0, aBit1, aBit2, aBit3 ,aBit4 ,aBit5 ,aBit6, aBit7; //int Bit0a, Bit1a, Bit2a, Bit3a ,Bit4a ,Bit5a ,Bit6a, Bit7a; //int aBit0a, aBit1a, aBit2a, aBit3a ,aBit4a ,aBit5a, aBit6a, aBit7a; int setPIDcoose ; int alt; #include "mcp_can.h" const int SPI_CS_PIN = 7; MCP_CAN CAN(SPI_CS_PIN); void CANBUS(){ tft.fillCircle(300,15,5,RED); unsigned char len = 0; unsigned char buf[8]; if(CAN_MSGAVAIL == CAN.checkReceive()) { // check if data coming CAN.readMsgBuf(&len, buf); // read data, len: data length, buf: data buf unsigned long canId = CAN.getCanId(); ID = canId; if ( ID == setID){ tft.fillCircle(300,15,5,GREEN); for(int i = 0; i<len; i++) // print the data { if (ByteDisp == 1){ tft.fillRect(15,138,50,30,BLACK); tft.setCursor(20,160); tft.print(buf[0], DEC); tft.fillRect(93,138,50,30,BLACK); tft.setCursor(98,160); tft.print(buf[1], DEC); tft.fillRect(173,138,50,30,BLACK); tft.setCursor(178,160); tft.print(buf[2], DEC); tft.fillRect(253,138,50,30,BLACK); tft.setCursor(258,160); tft.print(buf[3], DEC); tft.fillRect(15,218,50,30,BLACK); tft.setCursor(20,240); tft.print(buf[4], DEC); tft.fillRect(93,218,50,30,BLACK); tft.setCursor(98,240); tft.print(buf[5], DEC); tft.fillRect(173,218,50,30,BLACK); tft.setCursor(178,240); tft.print(buf[6], DEC); tft.fillRect(253,218,50,30,BLACK); tft.setCursor(258,240); tft.print(buf[7], DEC);} else{} } if ( bitDisp == 1 ){ int j; j = sBY1; Byte0 = (buf[j]); Bit0 = bitRead(Byte0,0); Bit1 = bitRead(Byte0,1); Bit2 = bitRead(Byte0,2); Bit3 = bitRead(Byte0,3); Bit4 = bitRead(Byte0,4); Bit5 = bitRead(Byte0,5); Bit6 = bitRead(Byte0,6); Bit7 = bitRead(Byte0,7);} tft.fillCircle(300,15,5,BLACK); } // else{} if ( bitDisp == 1 ){ BITDisplay(); } else{} aBit0 = Bit0; aBit1 = Bit1; aBit2 = Bit2; aBit3 = Bit3; aBit4 = Bit4; aBit5 = Bit5; aBit6 = Bit6; aBit7 = Bit7; } tft.fillCircle(300,15,5,BLACK); } void setup() { Serial.begin(9600); tft.begin(); tft.setRotation(0); tft.fillScreen(BLACK); tft.setFont(&FreeSerif12pt7b); tft.setTextSize(1); tft.setTextColor(GREEN); Serial.print("Initializing TFT"); tft.setCursor(20, 100); tft.print("CANBUS Reader A4 B5 AJM "); delay(1000); tft.fillScreen(BLACK); while (CAN_OK != CAN.begin(CAN_500KBPS)) // init can bus : baudrate = 500k { Serial.println("CAN BUS Shield init fail"); Serial.println(" Init CAN BUS Shield again"); delay(100); } Serial.println("CAN BUS Shield init ok!"); updateMenu(); } void BITRead() { //sBY1 tft.setCursor(15,40); tft.print("PID 0x"); String dCANID = String(CANID); tft.setCursor(90,40); tft.print(CANID,HEX); tft.setCursor(190,40); tft.print("Byte:"); tft.setCursor(260,40);tft.print(sBY1); tft.setCursor(10,120); tft.print("7 6 5 4 3 2 1 / 0 "); } void BitReadAktive() { tft.drawRect(15,138,50,30,WHITE); tft.drawRect(93,138,50,30,WHITE);tft.drawRect(173,138,50,30,WHITE);tft.d rawRect(253,138,50,30,WHITE); tft.drawRect(15,218,50,30,WHITE); tft.drawRect(93,218,50,30,WHITE);tft.drawRect(173,218,50,30,WHITE);tft.d rawRect(253,218,50,30,WHITE); } void Touch() { TSPoint p = ts.getPoint(); if( p.z > ts.pressureThreshhold){ //Serial.print("x: "); Serial.println(p.x); //Serial.print("y: "); Serial.println(p.y); //Serial.print("z: "); Serial.println(p.z); } } void loop() { //Serial.println("****************************************************** *****************************************"); //Serial.println("void loop()"); // Serial.print("sBY1"); Serial.println(sBY1); //Serial.print("setID"); Serial.println(setID); //Serial.print("rB :"); Serial.println(rB); //Serial.print("Menu: ");Serial.println(Menu); //Serial.print("bitDisp"); Serial.println(bitDisp); //Serial.print("setPIDcoose= "); Serial.println(setPIDcoose); CANBUS(); tft.setCursor(35,440); tft.print("Back"); tft.drawRect(30,415,60,40,WHITE); if ( setPIDcoose == 1){ PIDCoose(); } if ( rB == 1){ TouchActiveKeyBitRead(); TouchBitselect(); } if ( rB == 2){ TouchBitselect(); } if ( Return != 0){ TouchReturn(); } CANBUS(); //Serial.print("rBI: "); Serial.print(rB); } void updateMenu() { //Serial.print("void update Menu: "); //Serial.println(Menu); switch(Menu){ case 0: Menu==0; tft.fillScreen(BLACK); ByteDisp = 0; bitDisp = 0; CANMiniCooperS(); setPIDcoose = 1; break; case 1: Menu==1; tft.fillScreen(BLACK); rB = 1; // ggf 1 ByteDisp = 1; Return = 1; MINIPID(); break; case 2: Menu==2; tft.fillScreen(BLACK); ByteDisp = 1; ByteDisp = 0; BITRead(); Return = 2; break; case 3: Menu==3; delay(300); ByteDisp = 1; bitDisp = 0; rB=2; Return = 3; break; case 4: Menu==4; tft.fillScreen(BLACK); rB=0; ByteDisp = 0; bitDisp = 1; BITRead(); Return = 4; break; } } void CANMiniCooperS() { tft.setCursor(55,40); tft.print("PID Audi A4 AJM"); tft.setCursor(40,85); tft.print("280"); tft.drawRect(30,60,60,40,RED); tft.setCursor(130,85); tft.print("288"); tft.drawRect(120,60,60,40,RED); tft.setCursor(220,85); tft.print("320"); tft.drawRect(210,60,60,40,RED); tft.setCursor(40,155); tft.print("380"); tft.drawRect(30,130,60,40,RED); tft.setCursor(130,155); tft.print("388"); tft.drawRect(120,130,60,40,RED); tft.setCursor(220,155); tft.print("420"); tft.drawRect(210,130,60,40,RED); tft.setCursor(40,225); tft.print("480"); tft.drawRect(30,200,60,40,RED); tft.setCursor(130,225); tft.print("488"); tft.drawRect(120,200,60,40,RED); tft.setCursor(220,225); tft.print("520"); tft.drawRect(210,200,60,40,RED); tft.setCursor(40,295); tft.print("588"); tft.drawRect(30,270,60,40,RED); tft.setCursor(130,295); tft.print("01A"); tft.drawRect(120,270,60,40,RED); tft.setCursor(220,295); tft.print("04A"); tft.drawRect(210,270,60,40,RED); tft.setCursor(40,365); tft.print("05A"); tft.drawRect(30,340,60,40,RED); tft.setCursor(130,365); tft.print("---"); tft.drawRect(120,340,60,40,RED); tft.setCursor(220,365); tft.print("---"); tft.drawRect(210,340,60,40,RED); tft.setCursor(130,440); tft.print("---"); tft.drawRect(120,415,60,40,RED); } void PIDCoose() { TSPoint p = ts.getPoint(); if( p.z > ts.pressureThreshhold){ if (Menu == 0 && (p.x>195) && (p.x<332) && (p.y>170) && (p.y<235)){ setPID = 1; setID = 640; CANID = 0x280; tft.drawRect(30,60,60,40,GREEN); // 1AA delay(500); Menu = 1;updateMenu();} if (Menu == 0 && (p.x>404) && (p.x<570) && (p.y>170) && (p.y<235)){ setPID = 2; setID = 648; CANID = 0x288; tft.drawRect(120,60,60,40,GREEN); // 1F0 delay(500); Menu = 1;updateMenu();} if (Menu == 0 && (p.x>650) && (p.x<800) && (p.y>170) && (p.y<235)){ setPID = 3; setID = 800; CANID = 0x320; tft.drawRect(210,60,60,40,GREEN);// 1F3 delay(500); Menu = 1;updateMenu();} // Row 2 if (Menu == 0 && (p.x>195) && (p.x<332) && (p.y>292) && (p.y<370)){ setPID = 4; setID = 896; CANID = 0x380; tft.drawRect(30,130,60,40,GREEN); // 1F5 delay(500); Menu = 1; updateMenu();} if (Menu == 0 && (p.x>404) && (p.x<570) && (p.y>292) && (p.y<370)){ setPID = 5; setID = 904; CANID = 0x388; tft.drawRect(120,130,60,40,GREEN);//1F8 delay(500); Menu = 1;updateMenu();} if (Menu == 0 && (p.x>650) && (p.x<800) && (p.y>292) && (p.y<370)){ setPID = 6; setID = 1056; CANID = 0x420; tft.drawRect(210,130,60,40,GREEN);// 1A8 delay(500); Menu = 1;updateMenu();} // Row 3 if (Menu == 0 && (p.x>195) && (p.x<332) && (p.y>418) && (p.y<486)){ setPID = 7; setID = 1152; CANID = 0x480; tft.drawRect(30,200,60,40,GREEN); // 61A delay(500); Menu = 1; updateMenu();} if (Menu == 0 && (p.x>404) && (p.x<570) && (p.y>418) && (p.y<486)){ setPID = 8; setID = 1160; CANID = 0x488; tft.drawRect(120,200,60,40,GREEN);//153 delay(500); Menu = 1;updateMenu();} if (Menu == 0 && (p.x>650) && (p.x<800) && (p.y>418) && (p.y<486)){ setPID = 9; setID = 1312; CANID = 0x520; tft.drawRect(210,200,60,40,GREEN);// 316 delay(500); Menu = 1;updateMenu();} // Row 4 if (Menu == 0 && (p.x>195) && (p.x<332) && (p.y>547) && (p.y<612)){ setPID = 10; setID = 1416; CANID = 0x588; tft.drawRect(30,270,60,40,GREEN); // 329 delay(500); Menu = 1; updateMenu();} if (Menu == 0 && (p.x>404) && (p.x<570) && (p.y>547) && (p.y<612)){ setPID = 11; setID = 416; CANID = 0x01A; tft.drawRect(120,270,60,40,GREEN);//545 delay(500); Menu = 1;updateMenu();} if (Menu == 0 && (p.x>650) && (p.x<800) && (p.y>547) && (p.y<612)){ setPID = 12; setID = 1184; CANID = 0x04A; tft.drawRect(210,270,60,40,GREEN);// 565 delay(500); Menu = 1;updateMenu();} //Row 5 if (Menu == 0 && (p.x>195) && (p.x<332) && (p.y>678) && (p.y<740)){ setPID = 13; setID = 1440; CANID = 0x05A; tft.drawRect(30,340,60,40,GREEN); // 615 delay(500); Menu = 1; updateMenu();} if (Menu == 0 && (p.x>404) && (p.x<570) && (p.y>678) && (p.y<740)){ setPID = 14; setID = 1557; CANID = 0x615; tft.drawRect(120,340,60,40,GREEN);// 618 delay(500); Menu = 1;updateMenu();} if (Menu == 0 && (p.x>650) && (p.x<800) && (p.y>678) && (p.y<740)){ setPID = 15; setID = 1560; CANID = 0x618; tft.drawRect(210,340,60,40,GREEN);// 565 delay(500); Menu = 1; updateMenu();} } //setCar3 // Row 6 if (Menu == 0 && (p.x>404) && (p.x<570) && (p.y>820) && (p.y<885)){ setPID = 16; setID = 1562; CANID = 0x61A;tft.drawRect(120,415,60,40,GREEN); // 61A delay(500); Menu = 1;updateMenu();} } void MINIPID() { tft.setCursor(20,40); tft.print("Audi A4 B5 AJM PID *"); tft.setCursor(20,80); if( setPID == 1){ tft.print("PID: 280 DEC:");} if( setPID == 2){ tft.print("PID: 288 DEC:");} if( setPID == 3){ tft.print("PID: 320 DEC:");} if( setPID == 4){ tft.print("PID: 380 DEC:");} if( setPID == 5){ tft.print("PID: 388 DEC:");} if( setPID == 6){ tft.print("PID: 420 DEC:");} if( setPID == 7){ tft.print("PID: 480 DEC:");} if( setPID == 8){ tft.print("PID: 488 DEC:");} if( setPID == 9){ tft.print("PID: 520 DEC:");} if( setPID == 10){ tft.print("PID: 588 DEC:");} if( setPID == 11){ tft.print("PID: 01A DEC:");} if( setPID == 12){ tft.print("PID: 04A DEC:");} if( setPID == 13){ tft.print("PID: 05A DEC:");} if( setPID == 14){ tft.print("PID: --- DEC:");} if( setPID == 15){ //*** tft.print("PID: --- DEC:");} if( setPID == 16){ tft.print("PID: --- DEC:");} tft.setCursor(20,120); tft.print("buf0 buf1 buf2 buf3"); tft.setCursor(20,200); tft.print("buf4 buf5 buf6 buf7"); tft.setCursor(20,160); //tft.drawRect(15,138,50,30,WHITE); tft.drawRect(93,138,50,30,WHITE);tft.drawRect(173,138,50,30,WHITE);tft.d rawRect(253,138,50,30,WHITE); tft.setCursor(20,160); tft.print("---"); tft.setCursor(98,160); tft.print("---"); tft.setCursor(178,160); tft.print("---"); tft.setCursor(258,160); tft.print("---"); // tft.drawRect(15,218,50,30,WHITE); tft.drawRect(93,218,50,30,WHITE);tft.drawRect(173,218,50,30,WHITE);tft.d rawRect(253,218,50,30,WHITE); tft.setCursor(20,240); tft.print("---"); tft.setCursor(98,240); tft.print("---"); tft.setCursor(178,240); tft.print("---"); tft.setCursor(258,240); tft.print("---"); tft.setCursor(40,330); tft.print("set byte*"); tft.drawRect(20,300,120,50,WHITE); tft.setCursor(200,330); tft.print("BitRead*"); tft.drawRect(180,300,120,50,WHITE); } void BITDisplay() { //Bit0, Bit1, Bit2, Bit3 ,Bit4 ,Bit5 ,Bit6, Bit7; if (Bit7 != aBit7){ tft.setTextColor(BLACK);tft.setCursor(10,160);tft.print(aBit7); delay(5); tft.setTextColor(WHITE);tft.setCursor(10,160);tft.print(Bit7); } if (Bit6 != aBit6){ tft.setTextColor(BLACK);tft.setCursor(50,160);tft.print(aBit6); delay(5); tft.setTextColor(WHITE);tft.setCursor(50,160);tft.print(Bit6); } if (Bit5 != aBit5){ tft.setTextColor(BLACK);tft.setCursor(90,160);tft.print(aBit5); delay(5); tft.setTextColor(WHITE);tft.setCursor(90,160);tft.print(Bit5); } if (Bit4 != aBit4){ tft.setTextColor(BLACK);tft.setCursor(130,160);tft.print(aBit4); delay(5); tft.setTextColor(WHITE);tft.setCursor(130,160);tft.print(Bit4); } if (Bit3 != aBit3){ tft.setTextColor(BLACK);tft.setCursor(170,160);tft.print(aBit3); delay(5); tft.setTextColor(WHITE);tft.setCursor(170,160);tft.print(Bit3); } if (Bit2 != aBit2){ tft.setTextColor(BLACK);tft.setCursor(210,160);tft.print(aBit2); delay(5); tft.setTextColor(WHITE);tft.setCursor(210,160);tft.print(Bit2); } if (Bit1 != aBit1){ tft.setTextColor(BLACK);tft.setCursor(250,160);tft.print(aBit1); delay(5); tft.setTextColor(WHITE);tft.setCursor(250,160);tft.print(Bit1); } if (Bit0 != aBit0){ tft.setTextColor(BLACK);tft.setCursor(290,160);tft.print(aBit0); delay(5); tft.setTextColor(WHITE);tft.setCursor(290,160);tft.print(Bit0); } } void TouchActiveKeyBitRead() { TSPoint p = ts.getPoint(); if( p.z > ts.pressureThreshhold){ if ((p.x>565) && (p.x<855) && (p.y>610) && (p.y<692)){ // set byte BitReadAktive(); tft.setCursor(200,330); tft.setTextColor(BLUE); tft.print("BitRead"); tft.setTextColor(WHITE), tft.drawRect(180,300,120,50,BLUE); Menu = 3; } // Menu 11 if (Menu == 3 &&(sBY1 != 8) && (p.x>154) && (p.x<450) && (p.y>604) && (p.y<690)){ // key set byte // setPID = 30; tft.drawRect(20,300,120,50,GREEN);// buf 0 tft.setCursor(40,330); tft.setTextColor(RED); tft.print("set byte"); delay(200); tft.setCursor(40,330); tft.setTextColor(WHITE); tft.print("set byte"); Menu = 4; updateMenu();} } } void TouchBitselect() { TSPoint p = ts.getPoint(); if( p.z > ts.pressureThreshhold){ if(rB == 1 && Menu == 3){ if ((p.x>145) && (p.x<260) && (p.y>305) && (p.y<355)){ // set byte sBY1 = 0; // setPID = 30; tft.drawRect(15,138,50,30,GREEN);;// buf 0 delay(200); tft.drawRect(20,300,120,50,BLUE); delay(200); Menu = 4;updateMenu(); } if ((p.x>330) && (p.x<470) && (p.y>305) && (p.y<355)){ // set byte sBY1 = 1; // setPID = 30; tft.drawRect(93,138,50,30,GREEN);// buf 1 delay(200); tft.drawRect(20,300,120,50,BLUE); delay(200); Menu = 4;updateMenu(); } if ((p.x>540) && (p.x<670) && (p.y>305) && (p.y<355)){ // set byte sBY1 = 2; // setPID = 30; tft.drawRect(173,138,50,30,GREEN);// buf 2 delay(200); tft.drawRect(20,300,120,50,BLUE); delay(200); Menu = 4;updateMenu(); } if ((p.x>743) && (p.x<870) && (p.y>305) && (p.y<355)){ // set byte sBY1 = 3; // setPID = 30; tft.drawRect(253,138,50,30,GREEN);// buf 3 delay(200); tft.drawRect(20,300,120,50,BLUE); delay(200); Menu = 4;updateMenu(); } if ((p.x>140) && (p.x<255) && (p.y>450) && (p.y<500)){ // set byte sBY1 = 4; // setPID = 30; tft.drawRect(15,218,50,30,GREEN);// buf 4 delay(200); tft.drawRect(20,300,120,50,BLUE); delay(200); Menu = 4;updateMenu(); } if ((p.x>340) && (p.x<460) && (p.y>450) && (p.y<500)){ // set byte sBY1 = 5; // setPID = 30; tft.drawRect(93,218,50,30,GREEN);// buf 5 delay(200); tft.drawRect(20,300,120,50,BLUE); delay(200); Menu = 4;updateMenu(); } if ((p.x>540) && (p.x<665) && (p.y>450) && (p.y<500)){ // set byte sBY1 = 6; // setPID = 30; tft.drawRect(173,218,50,30,GREEN);// buf 6 delay(200); tft.drawRect(20,300,120,50,BLUE); delay(200); Menu = 4;updateMenu(); } if ((p.x>765) && (p.x<880) && (p.y>450) && (p.y<500)){ // set byte sBY1 = 7; // setPID = 30; tft.drawRect(253,218,50,30,GREEN);// buf 7 delay(200); tft.drawRect(20,300,120,50,BLUE); delay(200); Menu = 4;updateMenu(); } } // if rBI == 1 } } void TouchReturn() { TSPoint p = ts.getPoint(); if ( p.z > ts.pressureThreshhold){ //Retun all planes to 0 if( (p.x>182) && (p.x<325) && (p.y>315) && (p.y<880)){ p.x = 0; p.y = 0; p.z = 0; tft.drawRect(30,415,60,40,RED); if ( Return == 1){ Menu = 0;} if ( Return == 2){ Menu = 1;} if ( Return == 3){ Menu = 2;} if ( Return == 4){ Menu = 2;} Zero(); bitDisp = 0; Return = 0; setID = 0; rB = 0; delay(500); updateMenu(); } } if (Return == 2 &&( p.z > ts.pressureThreshhold)){ //Retun all planes if( (p.x>230) && (p.x<790) && (p.y>780) && (p.y<860)){ p.x = 0; p.y = 0; p.z = 0; tft.drawRect(50,400,220,50,RED); Menu = 3; Zero(); Return = 0; setID = 0; rB = 0; delay(500); updateMenu(); } } else{} } void Zero() { aBit0 = 2; aBit1 = 2; aBit2 = 2; aBit3 = 2; aBit4 = 2; aBit5 = 2; aBit6 = 2; aBit7 = 2; } //Serial.println("*******************TEST*******************");
Den Code habe ich für MiniCooper, A4 und Q7 geschrieben. Geändert werden nur die PID. Daher diverse bezeichnungen im Code. Gruß
hier als Anhang vielleicht kann ein Mod den langen Code im Beitrag löschen
Hallo Gabriel, ist schon länger her dein Eintrag. Aber vielleicht kannst du mir da noch etwas helfen bei deinem Aufbau des Can Sniffer. Ich versuch das ganze bei meinem VW da sollten Die Can ID nicht so verschieden sein zu Audi. 1. Hättest du zufällig eine Skizze deines Aufbau´s? 2. Mit was schreibst du die Daten in den FIS? Vielen Dank für deine bereitstellung des Codes.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.