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
keiner eine ahnung? ich bin ein C anfänger, kann ja sein, das ich bloss eine variable falsch defeniert habe oder so?
..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
..na dann versuch dein Glück mal mit while( !(CANSTMOB & (1<<TXOK)) ); ..und nicht vergessen, danach das TXOK-Flag zu löschen..
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.