Forum: Mikrocontroller und Digitale Elektronik Probleme mit Registerzugriffe beim SJA1000


von Joe (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Joe (Gast)


Lesenswert?

Hallo

von Tobi (Gast)


Lesenswert?

du hast schon unter pc-programmierung einen thread und nur weil dir da
keiner antwortet machst du jetzt hier den nächsten auf??

von Volker (Gast)


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

von Joe (Gast)


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?

von mthomas (Gast)


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")

von Volker (Gast)


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

von Joe (Gast)


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?

von Joe (Gast)


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

}

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
Noch kein Account? Hier anmelden.