Hallo an alle! Ich habe hier ein Riesen Problem! Ich versuche schon seit Tagen den ATMEGA162 so zu programmieren, dass er über den SJA1000 CAN-Nachrichten versendet, welche im ATMEGA vordefiniert sind. Also ein selbstarbeitendes Interface. Habe schon überall gesucht werde aber leider nichts, was mir weiter hilft. Ich habe schon die Datenblätter rauf und runter studiert, bekomme aber überhaupt keine message raus. Den SJA1000 spreche ich als externes RAM an so wie es auch im Datenblatt beschrieben ist. Habe auch schon mit dem Beispielcode von CANDIP experimentiert, aber das läuft auch nicht. Die Steuerleitungen AD0 - AD7 sind 1:1 verschaltet, wie auch INT0, ALE, WR, RD und Reset. MODE ist an VDD und CS an GND. Hat einer schon mal erfolgreich so einen ATMEGA162 mit SJA1000 zum laufen bekommen? Hat vielleicht jemand ein funktionierenden Beispielcode? Am besten in C oder BASCOM. Vielen Dank für eure Hilfe! Gruß Hermy
Bascom scheided glaube ich aus, da hast du keine richtige kontrolle darüber, wie du den xram ansprichst... (glaub ich)
Wie sieht denn dein Code aus? Funktioniert die Hardware überhaupt?
Die Hardware funktioniert. Isn universal Can-bus interface aus der firma welches schon für lfb-fernbedienungen eingesetzt wird. Z.B. Can-bus -> Remote-Control Radio Ich versuche nun mit diesem Interface ein bischen zu experimentieren, damit ich eigene Anwendungen darüber laufen lassen kann. Der Code is der Beispiel Code von Candip für BASCOM, aber damit hab ich gar keinen erfolg, hab auch schon sämtliche timings ausprobiert unter anderem berechnet und diverse Steuerbits getestet, es scheint so als wenn am sja1000 nichts ankommt. code im anhang Gruß Hermy
Vielen Dank Michael! Ich werd Deinen Code mal studieren und probieren, werde aber wohl noch einige Anpassungen vornehmen müssen, denn an der Schaltung ist ja kein PC-Interface und keine Status-LED's, aber es ist schonmal ein sehr guter Grundstein. Damit werd ich wohl sicher weiter kommen. Meld mich wieder, wenn es klappt oder noch Probleme geben sollte und werde berichten! Gruß Hermy
Hallo mal wieder! Hab es mit Michaels Software versucht, aber irgendwie bin ich am verzweifeln. Bekomme einfach keine Nachricht über CAN-Bus raus. Muss anmerken, dass CS auf GND liegt und RST vom SJA an RESET (AT162) geht, kann diese Ports also nicht softwareseitig steuern. Steuern könnte ich nur AD0-7, ALE, RD, WR und INT. AD0 - AD7 -->> PA0 - PA7 ALE -->> PE1 CS -->> GND RD -->> PD7 WR -->> PD6 MODE -->> VSS RST -->> RESET INT -->> PD2 Hab mal den Sourcecode mit angefügt, vielleicht hab ich was übersehen? @Michael, wäre total nett, wenn Du mir helfen könntest und den Code mal checken würdest. Vielen Dank, Gruß Hermy
Du kannst CS nicht direkt auf Ground legen, damit wird das Memory Interface des SJA ständig aktiviert. Wenn du bei einem AVR das XMEM Interface aktivierst, dann ändern sich die ALE und RD/WR Signale an den entsprechenden Pins auch dann, wenn auf internen SRAM zugegriffen wird. Wenn nun CS ständig aktiviert ist, dann bekommt der SJA allen Traffic auf dem Adress- und Datenbus mit, auch wenn er NICHT angesprochen werden soll, und das führt zu großer Verwirrung. CS muss also zwingend auf einen IO Pin des AVR gelegt, und von der Software entsprechendet behandelt werden. Und ich kann dir nur empfehlen auch das RST Signal auf einen IO Pin zu legen.
Hab mir sowas schon fast gedacht... Ok, dann werd ich mal die Schaltung entsprechend modifizieren und dann mal schaun... Vielen Dank, Meld mich wieder! Gruß Hermy
Laut Doku führt ein interner Speicherzugriff nicht zu Aktivität auf RD/WR.
Habe die CS und die Resetleitung nun auf einen eigenen Port gelegt, aber irgendwas haut da noch nicht hin. Bekomme immernoch nichts raus. Hab ich noch irgendwas übersehen??? Code im Anhang. Gruß Hermy
>> Bekomme immernoch nichts raus.
Eine wage Aussage...
Vielleicht solltest du erst mal bescheiben was überhaupt geht und was
nicht.
Kannst du überhaupt den SJA lesen und schreiben? Also die Register.
Was hängt als weitere Node am CAN Bus?
Woher weist du das nichts gesendet wird?
Ein paar mehr Details sind schon nötig...
Hallo Michael, das Interface habe ich an nem CAN-Bus Logger angeschlossen und das ganze mit 120R Widerstand terminiert, so wie es auch sein sollte. Da ich kein PC am Interface habe kann ich auch nicht die Register auslesen, aber ich habe mal nachgemssen. Die Resetleitung ist nun dauerhaft auf Logisch 1 also 5V und die CS-Leitung auf 0. Ist das korrekt so? Ist denn der Code, welchen ich im Post hiervor angefügt habe, soweit in Ordnung oder habe ich noch was übersehen? Timing habe ich auf 100KBit eingestellt. Gruß Hermy
Ganz ohne Debugging Möglichkeit dürfte es schwierig werden das Problem zu finden. Du solltest wenigstens versuchen temporär eine serielle Ausgabe für einen PC zu erzeugen um überhaupt zu wissen wo es hängt. Den Code hab ich nur mal überflogen, aber deiner Änderungen sind sehr unübersichtlich. Vielleicht solltest du mal alles löschen was du von dem was ich geschrieben hab nicht brauchst, die ganzen USB Handler zB. Oder schreib einen minimum Code, der nur die SJA Handler Files benutzt.
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.