Can Controller "SJA1000" Probleme mit Register

Gast #66145
Lesenswert?

Kann jetzt mit dem PEAK CAN Dongle die Botschaften empfangen.
Aber die Botschaft entspricht nicht dem was ich gesendet habe!
Ich habe mal jetzt jedes Register ausgelesen und auf dem Display
dargestellt.
Mir ist da folgendes ausgefall:
Rigster 5, 10, 11, 12, 13 lassen sich nicht beschreiben bzw denn
reingeschriebebeb Wert auslesen.
Die anderen Register da habe ich keine Probleme. Meine schreib und lese
Routinen funktionieren ja.
Wenn meine Routinen falsch währen, dann könnte ich ja gar nichts
schreiben bzw. auslesen.
Ich habe sogar mal einen zweiten SJA1000 eingebaut, da tritt dies
genauso auf!
Hmmm....was kann ich da noch tun????
Gast #66147
Lesenswert?

Hast Du eigentlich mal die dump-Routinen eingebaut?
Poste doch mal das, was Du laut dump sendest, und das, was Du
Empfängst.
Mit "es kommt nicht das an, was ich gesendet habe" kann man doch nur
sehr wenig anfangen. Höchstwarscheinlich kommt nämlich genau das an,
was Du gesendet hast! Bedenke, daß verschiedene Register bits haben,
die man geseondert setzen/lesen muss. Der SJA1000 hat ausserdem in den
verschiedenen Modi (BasicCan/PeliCAN) ein unterschiedliches
Registermapping.

Gruß,
Patrick...
Gast #66148
Lesenswert?

Dies Betrifft folgende Register:
5,10,11,12,13
Zum Beispiel habe ich in die Register den Wert (Daten) 0x11
reingeschrieben. Wenn ich anschließend die Werte auslesen will,
dann erhalte ich bei m Register 5 den Wert 96dez..
Bei den anderen Register bekomme ich nur NULL raus.
Ich habe den PELI Mode nicht in Benutzung.
Register 10 bis 19 sind für das Senden von Nachrichten zuständig
und Register 4 und 5 für den Akzeptanzfilter.
Angehängte Dateien:
Gast #66155
Lesenswert?

Ich habe jetzt mal folgendes gemacht


Die Nachricht ID 125h rtr=0 dlc=2 Byte0=10h und Byte1=20h senden

In der Funktion canreg_write habe ich jetzt malfolgendes eingefügt:
  canreg_write (10,0x24);
  canreg_write (11,0xA2);
  canreg_write (12,0x10);
  canreg_write (13,0x20);
  canreg_writte (1,0x01);

Auf dem Peak DOngle kann ich jetzt eine ID sehen bzw DLC und Daten.
Aber die empfangene Nachricht entspricht nicht der gesendeten
Nachricht.
Gast #66158
Lesenswert?

Rauskommen müsste:
Die Nachricht ID 125h rtr=0 dlc=2 Byte0=10h und Byte1=20h

Die PEAK CAN Dongle Software zeigt mit einen riesen großen Identifier
an. Die Daten sind insgesamt 10 byte lang. Und bei der Datenläge
sehe ich 15.
Hab leider kein Bild dazu. Ich kann es heute abend mal ins Forum
reinstellen.
Hast du mal meine beiden Funktionen gesehen???
Was meinst du, wenn der Chip Select auf Masse liegt, beeinträchtigt
doch nicht meine Funktionen oder???
Gast #66160
Lesenswert?

In diesem Register habe ich nichts getan.
Im Datenblatt steht, ich muss bei BASIC CAn das 8Bit vom
Register 31 auf NULL setzten.
Vielleicht sollte ich da noch tun.

Muss man dieses Bit setzten???
Gast #66161
Lesenswert?

Du brauchst die Bilder hier nicht reinstellen, schreib doch einfach
anstelle von "riesen groß" das, was da steht.
Ich versuche ja, Dir zu helfen, aber Du redest um den heissen Brei...
Hm, mal sehen, ob mir nicht zufällig doch noch was auffällt.
Bist Du denn sicher, daß der Controller im BasicCAN-Mode ist?
Gast #66164
Lesenswert?

Ach so ok!
Das CDR.7 Bit (Register 31) muss ich beim BASIC CAN auf NULL setzten.
Wie muss ich das Register maskieren. Hab voll die denkblokade,
so dass ich die anderen Bits nicht beeinflusse???
Gast #66165
Lesenswert?

Clear Bit (CBI) geht so:
sfr &= ~BITx

Set Bit (SBI) geht so:
sfr |= BITx

Wenn das Register also "CDR" heist, dann würde ein 'CBI CDR, 7' so
aussehen:
CDR &= ~BIT7

BIT0 bis BIT7 sollten in den headerfiles schon als Makrios definiert
sein, ansonsten:

#define BIT0 0x01
#define BITx 0x0x
..
#define BIT7 0x07

Hoffentlich klappts jetzt!
Gast #66166
Lesenswert?

Achtung, tpepiheflr:
BIT0 bis BIT7 sollten in den headerfiles schon als Makrios definiert
sein, ansonsten:

#define BIT0 0x01
#define BITx 0x0x
..
#define BIT7 0x07 <-- #define BIT7 0x08

...so muss es natürlich lauten!
Gast #66167
Lesenswert?

Ich kann es erst heute abend testen.
Ist dies wahrscheinlich der Fehler???
Das heisst wenn ich den Modus nicht auswähle, dann
befindet sich der CAN COntroller auf irgend einem Modús???
Angenommen: Ich tue den Mode nicht auswählen und
lese das register 31 aus. Dabei stelle ich fest dass das 8Bit auf
NULL steht, dann müsste sich doch der COntroller im BASIC CAN Modus
befinden oder nicht????
Gast #66168
Lesenswert?

Wenn der SJA1000 mit Spannung versorgt wird, dann
ist der MODUS Basic CAN aktiv. (laut Datenbank)
--> das Bit CDR.7 (Register31) wird automatisch auf 0 gesetzt.
Das heisst das nicht unbedingt es an dem liegt.
Gast #66170
Lesenswert?

Hallo Neo!

Ich habe den RST Pin über einen 10KOhm Widerstand an VCC angehängt.
Ist das falsch????
Wie müsste der Reset angeschlossen werden???

So hab jetzt mal den Basic Can Modus aktiviert. Leider
gibt es bei den Registern 5,10,11,12 immer noch Probleme
Gast #66174
Lesenswert?

Ich hatte mal ähnliche Probleme, aber im Peli CAN Mode. Es hat mich zum
verzweifeln gebracht, da ich einfach keinen Fehler in meinem Prog
finden konnte (hatte sogar auch deswegen hier mal gepostet, aber keiner
konnte helfen)
Irgendwann habe ich mal den Platz für den Stack vergrößert und siehe
da, es ging! Dämlicher Fehler! Vielleicht liegts bei dir auch daran,
bei mir wurde teilweise ne komplette CAN Msg auf dem Stack gesichert
und die bestehen ja bekanntlich aus einigen Bytes (besonders im Peli
CAN Mode, die sind ja noch länger). Dann noch ein oder 2
Funktionsaufrufe geschachtelt und das hat den Stack dann wohl
gesprengt. Lustigerweise ist der MC nicht abgeschmiert, sondern immer
brav weitergelaufen - sonst wäre ich vielleicht schon eher drauf
gekommen.
Gast #66175
Lesenswert?

So hab es endlich geschaft.
Ich kann jetzt Botschaften senden und empfangen!
Hab noch ne kleine Frage:
Was bedeutet eigentlich REMOTE REQUEST???
(bzw. Remote Betrieb)
Kann mir da jemand ein Beispiel dazu geben???
Gast #66179
Lesenswert?

Hab den Reset PIN vom SJA1000 über einen 10KOhm Widerstnd
an VCC (+5V) angehängt. Das reicht aus!
So habe ich es auch beim AVR gemacht.
Es lag an der Funktion can_ini().
Ich Poste mal den Code!

hat jemand eine Ahnung was Remote Betrieb bedeutet??
Gast #66181
Lesenswert?

Remote TRansmission Request... Also ich hole mal nen bisschen aus:
Das Design vom CAN sieht eigentlich so aus, daß jeder Controller
eigenständig arbeitet und die anderen Controller nicht braucht. Er
sendet nur Nachrichten unter SEINER ID auf den Bus die auch andere
Controller interessieren (eigentlicht NICHT um anderen Befehle zu
senden) könnten. Jeder Controller den die Message interessiert, kann
daraufhin irgendwas tun.
Man sendet also NICHT "Relias 0x00FF einschalten" sondern "Taster
0xAA gedrückt" und Controller A empfängt dies und entscheidet VON SICH
AUS, daß das Relias geschaltet werden muss. Andere Controller fangen
mit dieser Information ggf ganz was anderes an.
Temperatursensoneren senden nach dieser Methode z.B. nur wenn sich der
Temperaturwert mal ändert (oder z.B. alle 10 Minuten) und informiert so
die anderen Controller darüber.
Und jetzt kommt Remote Transmission Request ins Spiel: Braucht jetzt
nen anderer Controller sofort den aktuellen Temperaturwert, sendet er
einen Remote Transmission Request, daß den anderen Controller an dem
der Temp Sensor hängt dazu auffordert seine Statusmeldung auf den Bus
zu senden.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren