Forum: Projekte & Code Simples CAN-Interface zum empfangen einer Botschaft mit AT90CAN32


von Felix Tischer (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen

Ich stelle hier meinen sehr einfachen Code zur Verfügung, mit dem es 
möglich ist, eine bestimmte CAN-Botschaft zu empfangen und deren Daten 
über den UART zu schicken.

Grundlage für den Code war die CAN-Bibliothek von Jürgen Harms:
http://www.mikrocontroller.net/articles/CAN_Bibiliothek_f%C3%BCr_AT90CAN_Prozessoren
Diese hat auch auf Anhieb funktioniert, war aber mit der Datenrate am 
CAN-BUS meines Toyota RAV4 3. Generation total überfordert. Die 
Datenrate des CAN-BUS der über OBD herausgeführt ist liegt bei ca. 1100 
Botschaften/s @ 500kbit. Dies entspricht allerdings nur ca. 20% Buslast 
( alle Daten mit Vector CanAlyzer ermittelt).
Aus diesem Grund habe ich die Bibliothek stark vereinfacht und an meine 
Bedürfnisse angepasst.

Die ursprüngliche CAN-Bibliothek von J. Harms bildet ein rudimentäres 
Multitasking-System nach und behandelt neben dem Empfangen von 
Botschaften auch das Senden von Botschaften und Fehlererkennung.
Dies war aber für meinen Fall alles zu aufwändig und überladen, daher 
habe ich das Programm so konfiguriert, dass nur auf eine bestimmte 
Nachricht gewartet wird (Identifier 0x25), und wenn diese empfangen 
wurde werden deren Daten ausgewertet (DLC, Datenbytes) und über UART 
geschickt. Dabei werden die Interrupt-Fähigkeiten des CAN-Moduls nicht 
genutzt, der Empfang der Botschaft wird durch Polling ermittelt.

Da ich erst nach langem Studium von Jürgens Quellcode und des Datenblatt 
hinter fast alle Mechanismen des in die AT90CANxx integrierten 
CAN-Controllers gekommen bin und ich leider für mein einfaches Problem 
keinen Quellcode hier im Forum gefunden habe, will ich euch meinen 
Quellcode zur Verfügung stellen, vielleicht kann es ja jemand 
gebrauchen.

Und wozu benötige ich den Code? An meinem Toyota RAV4 3. Generation ist 
eine Rückfahrkamera verbaut. Die hat allerdings den Nachteil, dass in 
das Bild der Kamera keinen Lenkwinkel-abhängigen Linien eingeblendet 
werden, womit der Fahrer abschätzen kann wo das Auto beim aktuellen 
Lenkradeinschlag hinfährt. Mit Vector CanAlyzer hab ich relativ einfach 
die CAN-Botschaft ausgemacht, die den Lenkwinkel überträgt. Die 
Datenbytes in denen der Lenkwinkel codiert ist, war auch nicht schwer zu 
finden. Mit dem hier vorgestellten Quellcode wird diese eine Botschaft 
aus dem Datenstrom herausgefiltert, der Lenkwinkel berechnet und dieser 
über UART0 einem ATMega88 zur Verfügung gestellt. Dieser modifiziert das 
Videosignal der Rückfahrkamera und blendet lenkwinkelabhängig die Linien 
ein. Das Einblenden der Linien erfolgt mit einem umgebauten Bausatz von 
ELV: 
http://www.elv.de/output/controller.aspx?cid=74&detail=10&detail2=22054&flv=1&bereich=&marke=

Vielleicht kann ja jemand etwas mit meinem Quellcode anfangen. Wer 
Fragen hat meldet sich einfach, ich versuche diese dann nach bestem 
Wissen und Gewissen zu beantworten.

Viele Grüße,
Felix

von Otto (Gast)


Lesenswert?

Hallo Felix,

danke für Deinen Code - was mich besonders interessiert:

Wie genau blendest Du mit dem modifizierten ELV-Bausatz die Linien in 
das Signal der Rückfahrkamera ein ?

Das wäre ein Feature, welches ich auch sehr gerne hätte !

Gruss Otto

von Felix T. (felix)


Lesenswert?

Hallo Otto

Wenn du auf den ELV-Link von oben klickst kommst du zu der 
Produktbeschreibung des Bausatzes. Dort findest du weiter unten die 
Bauanleitung als PDF. In der Bauanleitung findest du die Schaltung des 
Bausatzes und einer meiner Meinung nach sehr gute Erklärung der 
Schaltung. Den Analogteil der Schaltung hab ich zwar nicht zu 100% 
verstanden aber das ist auch nicht so wichtig. Wichtig ist der Teil, der 
aus dem analogen Videosignal zwei digitale Signale ableitet, den V-Sync 
und den H-Sync.
Beide digitalen Signale gehen als externer Interrupt in den ATMega88. 
Das V-Sync-Signal signalisiert den Beginn eines neuen Frame, also 
sozusagen der Beginn der ersten Zeile eine Bildes. Das V-Sync-Signal 
kommt also bei PAL mit ca. 50Hz.
Das H-Sync-Signal kommt immer dann wenn eine neue Zeile beginnt. Das 
bedeutet, dass bei 320 übertragenen horizontalen Zeilen der H-Sync im 
62,5us-Raster kommt.
Wenn man die beiden Signale hat ist der Rest eigentlich nicht mehr 
schwer. Mit V-Sync weiß der Controller ab wann ein neues Bild beginnt 
und kann dann ab diesem Zeitpunkt die H-Sync-Signale mitzählen und weiß 
somit immer in welcher Zeile sich das Videosignal befindet. Der 
Bildaufbau erfolgt von oben nach unten zeilenweise fortlaufend von links 
nach rechts.

Mit Hilfe von PINB3 und PIND1kann dann der Controller das Videosignal 
(welches im Normalfall einfach nur durchgeleitet wird) auf schwarz oder 
weiß umschalten. Wenn also der Controller weiß, er ist z.B. in Zeile 160 
und dann 30us nach dem H-Sync-Signal für 2us erst auf Schwarz schaltet, 
dann 4us auf weiß und anschließend wieder 2us auf schwarz und das Ganze 
die nächsten 30 Zeilen wiederholt, so hast du also schlussendlich 
ungefähr in der Mitte des Bildes einen kurzen senkrechten Strich der in 
der Mitte weiß ist und links und rechts schwarze Streifen hat. Diese Art 
von Strich kann man auf jedem Hintergrund erkennen, der Kontrast ist 
sehr hoch.

Ich hab die Schaltung nur minimal geändert, z.B. sind die 
Controller-Ausgänge für schwarz und weiß nicht mehr PINB3 und PIND1. 
Sind jetzt andere Pins, welche genau muss ich erst nochmal nachsehen, 
aber diese lassen sich dann mit meinem Programm besser und schneller 
programmieren.

Praktisch ist auch, dass auf der Platine von ELV (SMD-Bauteile inkl. 
Controller sind schon vorbestückt) gleich der SPI-Programmieranschluß 
vorbereitet ist, da muss man nur noch ein paar Kabel anlöten. Die 
Pinbelegung (MISO, MOSI, RST etc.) muss man aber mit einem Multimeter 
und dem Controller-Pinout aus dem Datenblatt selber rausfinden.

So ich hoffe ich konnte dir erstmal weiterhelfen.

Gruß, Felix

von Otto (Gast)


Lesenswert?

Hallo Felix,

vielen Dank für Deine exakten Ausführungen - wahrscheinlich habe ich 
mich falsch ausgedrückt - eine "echte" Rückfahrkamera bzw. das 
Toyota-IPA-System blendet (einfach ausgedrückt) Linien ein, welche 
anzeigen, ob und wie wie der PKW mit dem momentanen Lenkwinkel in die 
Parklücke gelangen kann.

Welche Information gibt der von Dir eingeblendete kontrastreiche weisse 
Strich - nur den Lenkwinkel ?

Über eine weitere Antwort würde ich mich sehr freuen

Viele Grüsse

von Felix T. (felix)


Lesenswert?

Hallo Otto

Ich weiß nicht genau was du mit Toyota-IPA-System meinst, aber das 
Original-Toyota-Navigationssystem inkl. Rückfahrkamera welches bei mir 
eingebaut ist bietet lediglich den Blick nach hinten. Außer dem 
Schriftzug "Prüfen sie ihre Umgebung" wird nichts eingeblendet, auch 
keine starren Hilfslinien.

Bei mir soll es dann ungefähr so aussehen:
http://www.conexx-video.de/audi_mmi_kamera.jpg
Abhängig vom Lenkwinkel schwenken dann die Linien an ihrem oberen Ende 
nach links oder Rechts und zeigen an wo das Fahrzeug langfährt.

Gruß, Felix

von Otto (Gast)


Lesenswert?

Hallo Felix,

vielen Dank für Deine Antwort. IPA = "Intelligent Park Assist" - das 
Fahrzeug kann eigenständig einparken siehe:

http://www.priuswiki.de/wiki/Einparkautomatik

Automatisches Einparken ist natürlich nicht mein Ziel - bei meiner 
nachgerüsteten Rückfahrkamera fehlen die Linien, da es bisher eine rein 
analoge Lösung ist (NTSC-Kamera auf Multifunktionsdisplay).

Jedoch habe ich wie Du den CAN angezapft und hätte so die Möglichkeit 
mittels des ELV-Bausatzes Linien einzublenden.

Hast Du evtl. Fotos von Deinem Monitor mit eingeblendeten Linien?

Gruss Otto

von Martin J. (bluematrix) Benutzerseite


Lesenswert?

Hallo euch allen,

ich bin schon seit einiger Zeit auf der Suche nach einem CAN-Bootlader
für den AT90CAN. Leider konnte ich dazu aber kein fertiges Projekt
finden.
Genauere Informationen gibt es unter fogendem Link:

Titel - Beitrag "CAN BUS Bootloader AT90CAN"

Ich hoffe es finden sich einige um dieses Projekt zu realisieren oder
die dabei helfen können.

Grüße martin

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.