senden mit at90can128

Gast #699789
Lesenswert?

Hallo,
ich hab ein kleines problem mit den senden von cannachrichten und zwar:

wenn ich über ein mob, was ich als sender defeniert habe nacheinander 
mehrere nachrichten in verschieder länge sende wird die dlc(anzahl der 
bytes) nicht richtig gesetzt. meist nimmer er immer die länge der ersten 
cannachricht.

im anhang ist der quellcode und eine hex, die für 16mhz ist. canbaudrate 
ist auf 100kbit gestellt


Gruss
Markus
Angehängte Dateien:
#701773
Lesenswert?

..schon versucht, das TXBSY-Flag NACH dem Einleiten des Sendevorgangs 
abzufragen? Evtl. pfuscht sonst der nächste Aufruf von can_txa im noch 
sendenden MOB rum.

//nachricht senden
CANCDMOB |= (1<<CONMOB0);

//tybsy abwarten
while (CANGSTA & (1<<TXBSY));
#701790
Lesenswert?

du meinst, das ich so schnell nacheinander daten sende, das bevor die 
daten raus sind schon wieder neue reinkommen?

//tybsy abwarten
while (CANGSTA & (1<<TXBSY));

//nachricht senden
CANCDMOB |= (1<<CONMOB0);

//erst weitermachen wenn sie wirklich raus ist?
while (CANGSTA & (1<<TXBSY));


noch eine verständnissfrage, das senden von der cannachricht macht der 
avr paralell zum abarbeiten seines programmes oder braucht er dafür auch 
rechenzeit?

morgen wird gested und hier auch gleich berichted :-)

gruss
markus
#701798
Lesenswert?

Genau das meine ich. Es macht aber wenig Sinn, VOR dem Senden das 
TXBSY-Flag auch nochmal abzufragen.

Da fällt mir noch ein: Am praktischsten wäre es, wenn Du in Deiner 
Sendefunktion keinen festen MOB benutzt, sondern bei jedem Aufruf 
einfach den Status aller MOBs prüfst und dann den ersten freien benutzt. 
Also in etwa:


for(a=0;a<15;a++) {

  CANPAGE = a<<4;

  if(!CANCDMOB || (CANCDMOB & 1<<CONMOB0 && CANSTMOB & 1<<TXOK)) {

    // Dieser Teil wird ausgeführt, wenn der MOB entweder inaktiv ist
    // oder seinen letzten Sendevorgang abgeschlossen hat

    return;

  }

}


Dann kannst Du die Funktion fast beliebig oft und schnell hintereinander 
aufrufen, ohne dass es zu Problemen kommt.

Das Senden läuft parallel zu Deinem Programm ab... ganz richtig.
#703315
Lesenswert?

also das warten auf das ok bzw nicht busy hat zwar was verändert und 
zwar werden jetzt immer alle nachrichten mit der längsten dlc gesendet.
in den überschüssigen bytes die dann bei kürzeren nachrichten zu viel 
sind, steht ab und zu "00" drin und ab und zu irgend ein mischmasch.

wenn ich jeder nachricht einen eigenen mob zuordne gibts kein problem, 
ich werd aber in mein programm wenns mal soweit ist das alles läuft 
wahrscheinlich sowieso 12 rx mobs brauchen.

hast noch einen tipp für mich?

lg
markus
#703999
Lesenswert?

so jetzt hab ich eine ganz blöde "lösung" gefunden, nach den senden mach 
ich eine delay von einer ms. das senden von einer canmsg bei 100kb 
sollte in optimalen falle ca 0,8 ms dauern.

das blöde an der ganzen sache ist, die 1ms hab ich eigendlich nicht in 
der zwischenzeit will ich eigendlich andere sachen machen.


entwerder haut "while (CANGSTA & (1<<TXBSY));" nicht richtig hin oder???

gruss
markus
#705118
Lesenswert?

DANKE DANKE DANKE DANKE DANKE DANKE DANKE DANKE DANKE DANKE DANKE DANKE 
DANKE DANKE DANKE DANKE DANKE DANKE DANKE DANKE DANKE DANKE DANKE DANKE 
DANKE DANKE DANKE DANKE DANKE DANKE DANKE DANKE DANKE DANKE DANKE DANKE 
DANKE DANKE DANKE DANKE

ich hab mir jetzt noch 5x das datenblatt durchgelesen und kapier 
immernochnicht warum das mit TXBSY nich hinhaut, aber egal so gehts auch 
:-)

da ich hier jetzt ein profie da habe, was ist den der framebuffer? kann 
ich mir den so vorstellen, das ich mehere mobs zu "einen" 
zusammenschalte und das  dann so eine art puffer/fifo ist?
Gast #705239
Lesenswert?

Wäre ich Profi, wär ich da sicher schon eher drauf gekommen... Hab das 
TXBSY Flag noch nie verwendet.

Der Framebuffer-Mode dient zum Empfang von Datenmengen, die nicht in 
einen einzelnen CAN-Frame passen. Der Prozessor meldet in diesem Fall 
erst einen vollständigen Empfang, wenn alle MOBs, die in diesem Modus 
arbeiten, je einen Frame empfangen haben. Ob diese MOBs dabei alle auf 
gleiche oder verschiedene IDs oder DLCs konfiguriert sind, spielt keine 
Rolle.
#707132
Lesenswert?

also beim senden von cannachrichten hab ich da noch nix geändert im 
quellcode, das sollte eigendlich alles gehen, nur beim empfangen von 
cannachrichten hab ich was geändert(was die id angeht). mit was 
empfängst du die nachrichten die du mit meinen quellcode sendest?

gruss
markus

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