Probleme mit Registerzugriffe beim SJA1000

Gast #138201
Lesenswert?

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
Gast #138202
Lesenswert?

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?
Gast #138203
Lesenswert?

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")
Gast #138204
Lesenswert?

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
Gast #138205
Lesenswert?

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?
Gast #138206
Lesenswert?

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

}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren