Forum: Mikrocontroller und Digitale Elektronik CAN-Bus mit Arduino auswerten


von Mirco G. (mirco432)


Lesenswert?

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

von Michael U. (amiga)


Lesenswert?

Hallo,

Du hast Dir aber die physikalischen Parameter des CAN-Bus schon 
angesehen?

Gruß aus Berlin
Michael

von Rest (Gast)


Lesenswert?

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.

von mmm (Gast)


Lesenswert?

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.

von Mirco G. (mirco432)


Lesenswert?

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
von Olli Z. (z80freak)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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.

von Mirco G. (mirco432)


Lesenswert?

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
von Olli Z. (z80freak)


Lesenswert?

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.

von Thomas F. (igel)


Lesenswert?

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.

von fchk (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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.

von Thomas F. (igel)


Lesenswert?

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.

von Mirco G. (mirco432)


Lesenswert?

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

von Olli Z. (z80freak)


Lesenswert?

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.

von Mirco G. (mirco432)


Lesenswert?

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.

von Thomas F. (igel)


Lesenswert?

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.

von Olli Z. (z80freak)


Lesenswert?

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.

von Joachim B. (jar)


Lesenswert?

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
von Peter D. (peda)


Lesenswert?

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.

von Olli Z. (z80freak)


Lesenswert?

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.

von Olli Z. (z80freak)


Lesenswert?

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...

von Joachim B. (jar)


Lesenswert?

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

von Mirco G. (mirco432)


Lesenswert?

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

von Joachim B. (jar)


Lesenswert?

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.

von Mirco G. (mirco432)


Lesenswert?

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

von Thomas F. (igel)


Lesenswert?

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

von Datentypen sind Grundlagen (Gast)


Lesenswert?

INT8U ist wohl ein unsigned 8 bit integer.. du solltest dich erstmal mit 
Grundlagen befassen, sonst wird es nicht unbedingt einfacher

von Mirco G. (mirco432)


Lesenswert?

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!.

von Mirco G. (mirco432)


Lesenswert?

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

von Thomas F. (igel)


Lesenswert?

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
von Thomas F. (igel)


Lesenswert?

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.

von Mirco G. (mirco432)


Lesenswert?

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

von Thomas F. (igel)


Lesenswert?

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

von Mirco G. (mirco432)


Lesenswert?

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...

von Thomas F. (igel)


Lesenswert?

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/

von Mirco G. (mirco432)


Lesenswert?

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

von Thomas F. (igel)


Lesenswert?

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.

von Mirco G. (mirco432)


Lesenswert?

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.
von Mirco G. (mirco432)


Lesenswert?

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.

von Olli Z. (z80freak)


Lesenswert?

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.

von Mirco G. (mirco432)


Lesenswert?

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!

von Thomas F. (igel)


Angehängte Dateien:

Lesenswert?

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
von Mirco G. (mirco432)


Lesenswert?

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.

von Olli Z. (z80freak)


Lesenswert?

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.

von Mirco G. (mirco432)


Lesenswert?

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!

von Thomas F. (igel)


Lesenswert?

Mirco G. schrieb:
> Es gibt aber keine CAN Ground Anschluss am Steuergerät.

Dann nimmst du eben die Masse vom Steuergerät.

von Olli Z. (z80freak)


Lesenswert?

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.

von Mirco G. (mirco432)


Angehängte Dateien:

Lesenswert?

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.

von Peter (Gast)


Lesenswert?

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.

von Mirco G. (mirco432)


Angehängte Dateien:

Lesenswert?

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.

von Thomas F. (igel)


Lesenswert?

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

von Olli Z. (z80freak)


Lesenswert?

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.

von Thomas F. (igel)


Lesenswert?

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.

von Mirco G. (mirco432)


Lesenswert?

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
von Olli Z. (z80freak)


Lesenswert?

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
von Mirco G. (mirco432)


Angehängte Dateien:

Lesenswert?

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

von Mirco G. (mirco432)


Lesenswert?

Keiner eine Idee? Mir würde es schon reichen wenn mir einer sagt wie er 
bei solchen Problemen vorgeht.

von Thomas F. (igel)


Lesenswert?

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.

von Gabriel (Gast)



Lesenswert?

Mein Reader: Arduino, CANBUS Adapter, SD, RTC, 3,5 TFT Adafruit,


Gruß

von Gabriel (Gast)


Angehängte Dateien:

Lesenswert?

CANBUS Daten, Ausgabe im Display / Tacho

von Gabriel (Gast)


Angehängte Dateien:

Lesenswert?

@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ß

von Niko F. (bigdaddy)


Lesenswert?

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.

von Gabriel (Gast)


Lesenswert?

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*******************");

von Gabriel (Gast)


Lesenswert?

Den Code habe ich für MiniCooper, A4 und Q7 geschrieben. Geändert werden 
nur die PID. Daher diverse bezeichnungen im Code.

Gruß

von Thomas (kosmos)


Angehängte Dateien:

Lesenswert?

hier als Anhang

vielleicht kann ein Mod den langen Code im Beitrag löschen

von Gabriel (Gast)


Angehängte Dateien:

Lesenswert?

ich hoffe es klappt jetzt.

von M. S. (duffy666)


Lesenswert?

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
Noch kein Account? Hier anmelden.