Hier nochmal der aktuelle Code. Jetzt läuft die SPI, allerdings ist auf dem CAN noch Ruhe (Skop) - offenbar sendet der MCP nichts. Hat jemand eine Idee ? Sieht jemand auf Anhieb einen Fehler ?
Ha ! So, den Fehler habe ich schonmal gefunden. Die /SS Leitung vom Mega8 hing in der Luft und war nicht als Eingang geschaltet. Somit wurde immer das MSTR Bit gelöscht und der SPI wollte nicht senden. Das tut er jetzt.
Hat es eigentlich irgendeinen Vorteil, das SPDR Register manuell zu laden und eine Zeitschleife zu programmieren, die auf das SPIF Bit wartet ? Man kann doch sicherlich genauso den Bascom Befehl SPIout nutzen, oder ?
Jetzt kann ich dann als nächstes den MCP wieder anklemmen. Noch eine Frage, eher Hardware: So ganz habe ich den Zusammenhang mit der /SS Leitung noch nicht erfasst - wozu ist die denn gut, wenn man die nur auf high klemmt ? Oder kann man damit noch etwas anfangen ?
Und noch eine prinzipielle Frage zum SPI Bus: Das muss doch eigentlich auch ohne die /CS Leitung gehen, oder wie klemmt man mehrere Slaves an einen Bus ? Im Bascom Buch von Kühnel sind wir Slaves mit 4 einzelnen /CS Leitungen angeschlossen, aber das kann doch nicht Sinn und Zweck eines Bussystems sein ? (Hat sich erledigt - weiß Bescheid )
Alles wird gut... Gruß Alex
Hier nochmal der aktuelle Code. Jetzt läuft die SPI, allerdings ist auf dem CAN noch Ruhe (Skop) - offenbar sendet der MCP nichts. Hat jemand eine Idee ? Sieht jemand auf Anhieb einen Fehler ?
Alles wird gut... Gruß Alex
Ein weiterer Fehler war schonmal die falsche Nachrichtenlänge 0x04h, die muss natürlich 0x02h sein. Trotzdem bislang kein Erfolg
Alles wird gut... Gruß Alex
Die routine zum Senden sieht nicht falsch aus. Aber überprüf mal deine CNF config des MCP. Eine Gültige Config muss mind. 6 X TQ haben laut Datenblatt. Ich bin nicht sicher ob du das eingehalten hast.
6*TQ ? Gib mir doch mal einen Tip, auf welcher Seite ich dazu was finde Ich Suche hektisch...
Alles wird gut... Gruß Alex
Ah, OK... Seite 37ff - die Bit Timings meinst Du, ja ? Das habe ich jetzt zumindest nach einmaligem Lesen noch nicht komplett verstanden. Ich hatte gedacht, man stellt nur die gewünschte Bitrate ein uns gut ist ?
Da hätten die auch gut mal ein Beispiel reinpacken können, denn das erschließt sich mir irgendwie nicht....
Ich werde nochmal weitergrübeln, danke einstweilen für den Hinweis !
Alles wird gut... Gruß Alex
Ich bekomme es einfach nicht hingefummelt.... die Beschreibung im Datenblatt finde ich einfach nur kryptisch. Ist BRP gleich NBR ? Könnte mir das nicht mal jemand in einfachen Worten erklären, wie ich mit meinem Takt von 16MHz diese Forderung für die Konfiguration erfülle ? Die Details kann ich mir dann sicherlich rückwärts erarbeiten...
/edit/
Nach knappen zwei Stunden habe ich einige Fortschritte erzielt, denke ich. Ein paar Dinge konnte ich jetzt begreifen:
Bei einer Fosc von 16MHz und einer gewünschten Bitrate von 125kbit/s berechne ich also TQ wie folgt: (2*125)/62,5ns=4
Das SyncSegment muss 1TQ sein, PropSeg setze ich mit 2TQ, PS1 auf 4TQ (BTLMode auf 0) und um die unter 5.3 gelisteten Regeln zu erfüllen also PS2 auf 3. Dann sähe das so aus:
CNF1 = &B00000100
CNF2 = &B01100010
CNF3 = &B00000011
Aber: Was ist Tdelay unter Punkt 5.3 ? Und wie kommen die bei Punkt 5.3 auf folgende Aussage: "Tosc=50ns, choose BRP<5:0>=04H, then TQ=500ns. To obtain 125kHz, the bit time must be 16TQ" ?? Wäre super, wenn mir das jemand erklären könnte...
Alles wird gut... Gruß Alex
Trotz der Änderungen schreibt er wie es aussieht nichts in den MCP.
Dieser Part:
mit MCPinit wie folgt:Code:Print "Call mcpinit..." Call Mcpinit() Print "done!" Post = Canread(caninte) Print "CANINTE:" ; Post Post = Canread(canintf) Print "CANINTF:" ; Post Post = Canread(cnf1) Print "CNF1=" ; Post Post = Canread(cnf2) Print "CNF2=" ; Post Post = Canread(cnf3) Print "CNF3=" ; Post
bringt dieses Ergebnis:Code:Sub Mcpinit() Local Can_tmp As Byte 'Lokale Variable Reset Mcp_cs 'MCP Chip select an (aktiv) Waitus 10 'Warten bis Pegel stabil Can_tmp = Cmd_reset Spdr = Can_tmp '&HC0 ins SPI Data Register laden Do 'Warte bis Loop Until Spsr.spif = 1 'SPI Interrupt cleared (Transfer abgeschlossen) Waitus 10 'Warten bis Pegel stabil Set Mcp_cs 'Chip select wieder an (inaktiv) Led_gelb = 1 Waitms 500 ' Canwrite Canctrl , &B10001000 Canwrite Cnf1 , &B00000100 'Timing &H13=50kbit/s, &H07=125kb/s, &H01=250kb/s Canwrite Cnf2 , &B01100010 '&H90 Canwrite Cnf3 , &B00000011 '&H02 Canwrite Caninte , &B00000011 'Interrupt einstellen Canwrite Rxb0ctrl , &B01100000 'Buffer 0: Empfangen aller Nachrichten Canwrite Rxb1ctrl , &B01100000 'Buffer 1: Empfang aller Nachrichten Canwrite Rxm0sidh , 0 'Kein Filter, Empfängeradresse Null Canwrite Rxm0sidl , 0 Canwrite Rxm0eid8 , 0 Canwrite Rxm0eid0 , 0 Canwrite Rxm1sidh , 0 Canwrite Rxm1sidl , 0 Canwrite Rxm1eid8 , 0 Canwrite Rxm1eid0 , 0 Canwrite Bfpctrl , 0 'Deaktivieren der RXnBF Pins (High Impedance) Canwrite Txrtsctrl , 0 'TXnRTS Bits als Inputs schalten Canmod Canctrl , &B11100000 , &B00000000 'Device zurück in den normalen Modus versetzen Led_gelb = 0 End Sub
Call mcpinit...
done!
CANINTE:0
CANINTF:0
CNF1=0
CNF2=0
CNF3=0
Alles wird gut... Gruß Alex
Ich bin sicher, daß die Initialisierung des SPI ansich noch fehlerhaft ist. Zwar wird etwas gesendet, aber der MCP scheint einfach nichts zu empfangen / verstehen. Könnte darauf nochmal jemand einen Blick werfen ? Am Montag werde ich mir nochmal genau die Timings der SPI Schnittstelle anschauen...
Alles wird gut... Gruß Alex
Also ich finde einfach nichts, es ist zum Mäusemelken - die SCK Leitung taktet sauber und auf MOSI gehen auch sinnvolle Datenpakete raus. Trotzdem reagiert der MCP auf nichts. Ich würde mich wirklich sehr über Hilfe freuen !
Testhalber habe ich das Programm von feitzi mal angepasst, das scheint zu laufen, auch wenn ich mit den Ausgaben (noch) nicht wirklich etwas anfangen kann. Vielleicht war der SPI bei mir zu langsam oder zu schnell, keine Ahnung. Oder es liegt einfach an der Ein- und Ausgaberoutine...
Alles wird gut... Gruß Alex
Lesezeichen