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