Hallo! Ich steuere den SJA1000 mit der LPT unter Win2000 an. Mit den Registerzugriffe gibt es Probleme. Geschrieben habe ich diesen Code unter Borland Builder C++. Kann mir jemand sagen, was ich da falsch gemacht habe?
du hast schon unter pc-programmierung einen thread und nur weil dir da keiner antwortet machst du jetzt hier den nächsten auf??
Hallo Joe, hab mir deinen Code nochmals angesehen. Beim Schreiben könnte es eventuell ein Timing Problem beim WR-Signal sein. write_DataRegister(daten); pause(); clear_bit(0x37A,WR); //WR = 0; set_bit(0x37A,WR); // WR = 1; vor set_bit noch pause(); einfügen clear_bit(0x37A,ALE); // ALE = 1 vor clear_bit ALE acuh eine pause Bist du dir eigentlich sicher, dass du korrekt auf den LPT-Port ausgeben kannst. Haste mal ein Oszi drangehängt, notfalls hänge mal ein 74xx753 Latch mit LEDs an die LPT um zu sehen ob deine Daten richtig ankommen. (Oder mit einem Multimeter messen) Das gleich gilt fürs Einlesen. Kannst du, wenn du z.B. 0x3A in Canregister xy schreibst diesen Wert wieder korrekt auslesen? Wenn das schon nicht geht kann das ganze CAN nicht funzen. Was mir auch noch aufgefallen ist: set_bit(0x37A,WR); // WR = 1; hier macht set_bit eine 1 set_bit(0x37A,ALE); // ALE = 0 hier macht set_bit eine 0 hast du ALE,WR... dementsprechend richtig definiert? Ansonsten fällt mir auch nichts mehr ein. Volker
Hallo Volker! Danke für die Unterstützung. Das Oszi habe ich bisher noch nicht verwendet. Die Signale ALE, WR und RD kann ich schon korrekt ansprechen. Was mir da noch einfällt ist, dass es möglicherweise unter Win2000 Timing Probleme geben kann. Wie kann ich unter Borland Builder C++ noch eine Pause realisieren? Das hier stimmt auch: Bei manchen Siganlen ist es umgekehrt set_bit(0x37A,WR); // WR = 1; hier macht set_bit eine 1 set_bit(0x37A,ALE); // ALE = 0 hier macht set_bit eine 0 clear_bit(0x37A,WR); //WR = 0; set_bit(0x37A,WR); // WR = 1; vor set_bit noch pause(); einfügen clear_bit(0x37A,ALE); // ALE = 1 vor clear_bit ALE acuh eine pause Hast du schon mal mit der LPT einen SJA1000 angesteuert?
Falls die api-Funktion ::Sleep() nicht genau genug ist, Windows API-Dokumentation zu Mulitmedia-Timern lesen (msdn bei microsoft.com) (Der Thread ist hier deplaziert (noch keine PC-Programmierung) und das staendige hochpushen durch den OP hier und in anderen Threads ist nicht die "feine Art")
Hallo Joe, nein ich habe noch kein SJA1000 per LPT angesteuert. Du hast meine Frage noch nicht beantwortet, kannst du die Register, die du mit irgendwelchen Werten beschreibst, korrekt wieder auslesen. Bevor du feststellst, dass dein Programm nicht tut prüfe erstmal die einzelnen Funktionen (das kann nicht so schwer sein). z.B. write_DataRegister(daten); kontrollieren mit Oszi, LED oder Multimeter dementsprechend auch die anderen Teilfunktionen. Volker
Hallo Volker! Mit dem Multimeter hab ich es schon getestet. Ergebnis: kein Fehler festgestellt Ich habe mal sämtliche Register mit Daten beschrieben. Den Inhalt habe ich auch zum Teil wieder lesen können. Nicht bei jedem Register kann ich den gleichen Inhalt auslesen. Dies liegt daran dass ich den SJA in den operating mode bringen muss. Hast du meinen C-Code angeschaut. Ist dir dabei was aufgefallen?
Hallo! So wie es aussieht läuft bei mir jetzt die CAN Initialisierung korrekt. Nur das Senden von Botschafzen sowie empfangen funktioniert nicht. Das Programm bleibt immer in der Sendefunktion bei der do...while Schleife hängen. Natürlich habe ich auch einen CAN Teilnehmer (PEAK CAN DONGLE) an meine Applikation angehängt.Als Abschlußwiderstand habe ich einfach 60Ohm zwischen CAN HIGH und CAN LOW angehängt. Ich weiss jetzt nun nicht was ich da noch tun kann? Was habe ich da falsch gemacht? /*----CAN Botschaft senden------------------------------------------------*/ void TForm1::canmessage_write(struct message *ptransmit) { unsigned int id_1,id_2,id_3; unsigned int id_1_hilf,id_2_hilf,id_3_hilf; unsigned int trdscr_wert; unsigned int i; id_3=(ptransmit->id)&0x0f; id_2=((ptransmit->id)/16)&0x0f; id_1=((ptransmit->id)/256)&0x0f; id_1_hilf=id_1*32; id_2_hilf=id_2*2; id_3_hilf=id_3/8; trdscr_wert=(id_1_hilf)|(id_2_hilf)|(id_3_hilf); canreg_write(10,trdscr_wert); id_3=(ptransmit->dlc)&0x0f; id_2=(ptransmit->rtr)*16; id_1=((ptransmit->id)&0x0f)*32; trdscr_wert =(id_3)|(id_2)|(id_1); canreg_write(11,trdscr_wert); for (i=0;i<=7;i++) { canreg_write (12+i,ptransmit->byte[i]); } canreg_write (1,0x01); //Sendung auslösen do { } while (((canreg_read(2))&0x08)==0); //warten bis Sendung fertig }
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.