www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit Registerzugriffe beim SJA1000


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

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

Autor: Joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Autor: Tobi (Gast)
Datum:

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

Autor: Volker (Gast)
Datum:

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

Autor: Joe (Gast)
Datum:

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

Autor: mthomas (Gast)
Datum:

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

Autor: Volker (Gast)
Datum:

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

Autor: Joe (Gast)
Datum:

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

Autor: Joe (Gast)
Datum:

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

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.