Forum: Mikrocontroller und Digitale Elektronik senden mit at90can128


von rathma (Gast)


Angehängte Dateien:

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

von Markus R. (rathma)


Lesenswert?

wenn ich die nachrichten mit verschiedenen mobs versende stimmt die 
länge, es kommt aber vor, das von ca 1% der nachrichten dann irgendwie 
noch byteverdreher drin sind.

auf der gegenseite von at90can128 hab ich den usbcanhacker und der läuft 
problemlos.

gruss
markus

von Markus R. (rathma)


Lesenswert?

keiner eine ahnung? ich bin ein C anfänger, kann ja sein, das ich bloss 
eine variable falsch defeniert habe oder so?

von Jupp V. (mng)


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));

von Markus R. (rathma)


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

von Jupp V. (mng)


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.

von Markus R. (rathma)


Lesenswert?

danke für die tipps werd morgen berichten.

gn8

von Markus R. (rathma)


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

von Markus R. (rathma)


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

von Jupp V. (mng)


Lesenswert?

..na dann versuch dein Glück mal mit

while( !(CANSTMOB & (1<<TXOK)) );

..und nicht vergessen, danach das TXOK-Flag zu löschen..

von Markus R. (rathma)


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?

von mng (Gast)


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.

von Markus R. (rathma)


Lesenswert?

ok datenmengen entfangen hört sich schon mal gut an, aber die sind immer 
unterschiedlich lang. also kein fifo :( naja muss ich das hald 
softwaremässig versuchen abzufangen.

nochmal danke für deine hilfe

von N. P. (Gast)


Lesenswert?

Könnte ich den aktuellen Code bekommen? Ich habe versucht damit etwas zu 
senden, jedoch scheint RTR immer auf 1 zu sein und ein Bit im identifier 
ist auch falsch. (Ich sende nur einen frame)

von Markus R. (rathma)


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

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.