Forum: Mikrocontroller und Digitale Elektronik AT90CAN128 nach 15 CAN-Nachrichten ist schluss


von Kristof K. (tigerfisch)


Lesenswert?

Hallo,

Ich verwende den AT90CAN128 mit dem Bustreiber ATA66660
Ausserdem die CAN.lib von www.kreatives-chaos.com

Als Empfänger dient ein CAN-USB-Adapter von PEAK. Der funktioniert 
fehlerfrei. Eine Andere Platine mit ATmega8 und MCP2515 läuft mit der 
Bibliothek einwandfrei

Der AT90CAN128 verschickt nicht mehr als 15 Nachrichten ... Wenn ich Ihn 
neu initialisiere schickt er auch weitere Nachrichten. Aber wieder nur 
maximal 15, bis ich Ihn wieder initialisiere.
1
#include "can.h"
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
6
7
// ----------------------------- MAIN ------------------------------------
8
9
10
int main (void) {
11
12
13
// ---- CAN original ----
14
15
16
    // initialisieren des MCP2515
17
    can_init(BITRATE_125_KBPS);
18
   
19
    // erzeuge eine Testnachricht
20
    can_t msg;
21
   
22
    msg.id = 0x123456;
23
    msg.flags.rtr = 0;
24
    msg.flags.extended = 1;
25
   
26
    msg.length = 4;
27
    msg.data[0] = 0xde;
28
    msg.data[1] = 0xad;
29
    msg.data[2] = 0xbe;
30
    msg.data[3] = 0xef;
31
   
32
    // Nachricht verschicken
33
    for(int i = 0; i < (10); i++){
34
          can_send_message(&msg);
35
      _delay_ms(100);
36
    }
37
38
    can_init(BITRATE_125_KBPS);
39
40
    for(int i = 0; i < (10); i++){
41
          can_send_message(&msg);
42
      _delay_ms(100);
43
    }
44
   return 0; 
45
}    // main(void) - Schleife

Ohne den
1
 can_init(BITRATE_125_KBPS);
 zwischendurch schickt er nur 15, statt 20.

Hat jemand Erfahrung oder Tipps was ich falsch machen könnte? Ich würde 
es immer wieder neu initialisieren ... das wäre aber sehr unschön.

mfg
Kristof

von Lutz (Gast)


Lesenswert?

Wie sieht denn Deine "can.h" aus? Original ist sie ja nicht mehr (schon 
an "can_t msg" zu sehen).

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


Lesenswert?

> Hat jemand Erfahrung oder Tipps was ich falsch machen könnte? Ich würde
> es immer wieder neu initialisieren ... das wäre aber sehr unschön.
Überrennst du den Puffer?
Was passiert denn, wenn du statt dem 2. can_init() abwartest (mit wait() 
bzw. sleep()), bis die erten 10 Msgs gesendet sind?

von Kristof K. (tigerfisch)


Angehängte Dateien:

Lesenswert?

Ich habe sie mal angefügt.

meinst du wegen dem can_t ?

Wie es auf kreatives Chaos dargestellt war geht es nicht. Es muss can_t 
sein.

von Kristof K. (tigerfisch)


Lesenswert?

Lothar Miller wrote:

> Überrennst du den Puffer?

Ja es scheint so. ich kann es mir aber nicht erklären. Weil es sonst ja 
anscheint keiner hat.

> Was passiert denn, wenn du statt dem 2. can_init() abwartest (mit wait()
> bzw. sleep()), bis die erten 10 Msgs gesendet sind?

Ich warte ja schon nach jeder Nachricht 100ms ...

von tex (Gast)


Lesenswert?

Du musst jede Box nach jedem senden und nach jedem Empfang neu 
initialisieren.
Da Dein CAN128 nur 15 Boxen hat sind nach 5 Sendungen alle in Gebrauch 
gewesen und müssen neu initialisiert werden. Ist etwas anders als USART

von tex (Gast)


Lesenswert?

sind nach 15 Sendungen...

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


Lesenswert?

> Ich warte ja schon nach jeder Nachricht 100ms...
Oh, wo ist meine gepunktete Binde, mein Stock und der Hund? :-)

Was macht can_send_message()? Welche Register werden beschrieben?

von Kristof K. (tigerfisch)


Lesenswert?

Lothar Miller wrote:
> Was macht can_send_message()? Welche Register werden beschrieben?

Ich habe keine Schimmer, dazu müsste ich mir die lib noch genauer 
ansehen ... möchte ich aber garnicht. Ich will das Rad benutzen und 
nicht wissen wie es funktioniert :-)

Mit der init Lösung kann und werde ich wohl erstmal leben müssen ... 
vielen Dank :-)

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.