mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik senden mit at90can128


Autor: rathma (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Markus R. (rathma)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus R. (rathma)
Datum:

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

Autor: Jupp Van de balken (mng)
Datum:

Bewertung
0 lesenswert
nicht 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));

Autor: Markus R. (rathma)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jupp Van de balken (mng)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus R. (rathma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für die tipps werd morgen berichten.

gn8

Autor: Markus R. (rathma)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus R. (rathma)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jupp Van de balken (mng)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
..na dann versuch dein Glück mal mit

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

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

Autor: Markus R. (rathma)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: mng (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus R. (rathma)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: N. Potthoff (Firma: BUW) (nuelspferd)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Markus R. (rathma)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.