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