Forum: Mikrocontroller und Digitale Elektronik Auf CAN Nachricht zugreifen


von Schmelz (Gast)


Lesenswert?

Hi,

wir haben bei der Uni ein Projekt mit zwei Dice-Kits. Wir senden eine 
Nachricht mit einer Hexadezimalen Zahl via CAN aif ein zweites Dice-Kit 
von Fujitsu. Jedoch bekommen wir es nicht hin auf diese Hexadezimale 
Zahl zuzugreifen.
Meine Frage ist nun, wie können wir die Nachricht auslesen und somit 
unsere if-Funktion welche diese Zahl als Startvariable hat starten.

Z.B. hschicken wir eine 0x01 als Startvariable für unsere AC-Messung und 
wollen doe Funktion if(0x01) dann das Teilprogramm starten.
Hoffe Ihr könnt mir helfen.
Gruß Schmelz

von Andreas W. (geier99)


Lesenswert?

Schmelz schrieb:
> Hoffe Ihr könnt mir helfen.

Na ja,

aber diesen Link kennt Ihr schon?

http://mcu.emea.fujitsu.com/mcu_tool/detail/DICE-KIT.htm

Gruss
 Andi

von Schmelz (Gast)


Lesenswert?

Hi Andi,

ja die Seite haben wir uns auch schon zu gemüte geführt. Jedoch wenn wir 
das mit zum Beispiel der Switch case Funktion machen, startet er nicht 
die Teilprogramme weil er die Zahlen die wir Senden nicht erkennt,
Ich weiß nicht ob es daran liegt, dass er die in einem extra Register 
abspeichert, aufjedenfall springt er nicht in die Teilprogramme

von Marc Rupprath (Gast)


Lesenswert?

H

Schmelz schrieb:
> Jedoch wenn wir
> das mit zum Beispiel der Switch case Funktion machen, startet er nicht
> die Teilprogramme weil er die Zahlen die wir Senden nicht erkennt,
> Ich weiß nicht ob es daran liegt, dass er die in einem extra Register
> abspeichert, aufjedenfall springt er nicht in die Teilprogramme

Hallo;

Meine Fragen:

1. "Ich weiß nicht ob es daran liegt, dass er die in einem extra 
Register
> abspeichert"

Die Frage lautet also zunächst einmal:
Funktioniert der CAN Bus ?
Wird die Nachricht gesendet und auch empfangen ??

Wenn ich 1. richtig verstanden habe wird offenbar etwas empfangen.
Greift doch mal "auf dieses "Extra Register zu und prüft ob ihr dort den 
Wert wieder findet.

Wenn der Wert dem Wert der gesendeten Nachricht / Zahl entspricht 
bräuchtet ihr diese doch nur in eine Variable zu kopieren und diese in 
eure Bedingung verwenden ??


Hintergrund (nicht euer Controller):
Beispielsweise landen die Nachrichten bei der CCAN Übetragung bei STM32 
Controllern in einem FIFO. Ausserdem wird beim  Empfang ein Interupt 
ausgelöst.


Nach dem Erkennen des Interrupt / Ereigniss "Sie haben Post".
Brache ich dann "nur" in den "Briefkasten" zu sehen.

Hoffe das hilft euch etwas weiter.


Bei grundlegenden Problemen bei der CAn Bus übetragung hilft hier nur 
ein Analyser.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Schmelz schrieb:
> Hoffe Ihr könnt mir helfen.
Teile und herrsche.
1. Übertrage eine (1) CAN-Message
2. Werte diese Message aus
Ich vermute überaus sehr, dass es hier schon bei 1. klemmt. Man könnte 
das evtl. am nicht geposteten Code abschätzen...

> unsere if-Funktion
> Switch case Funktion
Du solltest mal in einem C-Buch (das ist vermutlich die 
Programmiersprache, die verwendet werden soll) ganz vorn nachlesen, was 
eine Funktion und was eine Anweisung ist...

> bekommen wir es nicht hin auf diese Hexadezimale Zahl zuzugreifen.
Es gibt keine "hexadezimalen Zahlen" im uC. Es gibt dort nur binäre 
Vektoren (Speicherzellen, Register, Stati, Kommandos,...) die man zur 
besseren Lesbarkeit statt binär auch hexadezimal oder dezimal 
darstellen kann.

> bei der Uni
Das gibt mir jetzt wirklich zu denken...  :-o

von Mic R. (microller)


Angehängte Dateien:

Lesenswert?

Hallo Schmelz,
Problem gelöst?
So ganz ist mir nicht klar, wo dein Problem ist.
Es gibt ein Beispiel fon Fujitsu, welches sehr schön zum Evaluieren des 
CAN auf dem DICE-Kit geeignet ist: dicekit_can_uart_async-v30.zip
Gefunden auf Andi's Seitenempfehlung: 
http://mcu.emea.fujitsu.com/mcu_tool/detail/DICE-KIT.htm -> DICE-KIT - 
SOFTWARE EXAMPLES
Ich hab's dir angehängt ;-)

Wenn Du Interrupts einschaltest, wird __interrupt void IRQ_CANRX (void) 
aufgerufen.
Dort
1
 
2
GetCanData (buffer, CAN_Receive_Data); /* Readout Message Buffer */
und Du hast díe Empfangsdaten iin CAN_Receive_Data[] stehen.
Die ID in CAN_Receive_ID.

Du könntest also zum Beispiel sowas machen:
1
if (CAN_Receive_Data[1] == 0x01
2
{
3
  Teilprogramm1();
4
}
5
6
if (CAN_Receive_Data[1] == 0x02
7
{
8
  Teilprogramm2();
9
}
ginge natürlich auch mit einer switch Anweisung:
1
switch (CAN_Receive_Data[1])
2
{
3
  case 0x01: Teilprogramm1();
4
             break;
5
6
  case 0x02: Teilprogramm2();
7
             break;
8
9
  default: ... Teilprogramm_unbekannt();
10
11
}
Okay, in der Interrupt-Routine sollte das vielleicht nicht gerade 
passieren, aber das Prinzip sollte klar sein ...

Sind dir denn die Prinzipien von CAN klar, was IDs sind, und wie CAN 
Nachrichten aussehen?

Poste doch mal dein Projekt, dann verstehen wir vielleicht besser was Du 
meinst und wo das Problem liegt.
Ich habe übrigens auch ein DICE-Kit ... und für einfache Dinge ist das 
ganz gut brauchbar und einfuch zu bedienen. Und die Entwicklungssoftware 
bei Fujitsu ist kostenlos. Allerdings ist der Core etwas veraltet, und 
auch Fujitsu setzt mitlerweile auf ARM Cortex-M3.
Aber für einfache Steuerung und Lehrzwecke ist das DICE-Kit ein schönes 
"Spielzeug"

Gruß,
Mic Roller

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.