-
Beim Highlevelbefehl von Bascom kann ich keine Auskunft geben,
da ich die Hardwarenahe Programmierung bevorzuge,
sprich ich schreibe direkt ins SPDR Register.
Dabei ist es so, dass ich dieses abwechselnd lese und schreibe.
Der Hintergrund ist, dass nur wenn die SPI sendet der Takt
über CLK geht und die angehängte Hardware nur dann
ihre Daten senden kann.
Das läuft dann so ab, dass ich ne 0 (Null) ins SPDR schreibe,
warte bis die Übertragung beendet ist und das empfangene
Byte dann im SPDR steht. dieses dann herauskopiere und
die nächste 0 schreibe usw. usw. bis die gewünschte zahl
an Bytes rüber ist.
Sorry, aber Dein Problem scheint mir entweder
a) in der Initialisierung der SPI oder
b) in der Hardware zu liegen.
Haste die Bausteine mal getauscht um zu sehen ob nicht der MCP oder der
ATMega ne Macke haben?
Beim SPIIN scheint bascom nullen zu senden und die emfangenen werte
dann in Variablen zu speichern, beim SPIMOVE kann man gleichzeitig
Daten senden und die Rückgabewerte auslesen.
Ach so, ich initialisiere die SPI über:
config pin_mcp_reset = output
config pin_mcp_select = output
config SPI_mosi = output
config SPI_clk = output
config SPI_miso = input
SPCR=&B01010010
-
Ich bin ja so bescheuert... ich hatte natürlich die Verbindung von /CS zu /SS wieder gelöscht und meine originale Portverbindung wieder erstellt. Und das manuelle setzen von MCP_CS hatte ich natürlich vergessen. Nevermind.... -.-
Nun muss ich nur noch die Timings etc. in den Griff bekommen, er antworter jetzt und schickt mir beim auslesen von CANCTRL eine &04, welche ich ja auch hineingeschrieben habe. Jetzt muss ich erstmal wieder weiter rumprobieren, aber ich denke, ich bekomme es in den Griff...
-
Nun, die Fragen werden ja immer detailiierter... ich kann nun korrekt Register auslesen und beschreiben, zumindest das Register CANCTRL. Mit diesen Subs:
Code:
Sub Mcpinit()
Local Can_tmp As Byte 'Lokale Variable
Print "Reset 2515..." 'MCP Resetten
Can_tmp = Cmd_reset
Reset Mcp_cs
Waitus 1
Spiout Data_tmp , 1
Waitus 1
Set Mcp_cs
Waitus 20 'Warten bis Reset erledigt, evtl. Abfrage MCP einbauen ?
Print "done!"
'( Print "change prescaler..."
Spi_write_buff(1) = Cmd_write
Spi_write_buff(2) = Canctrl
Spi_write_buff(3) = &B00000100 'Prescaler CLKOUT auf Takt/1
Reset Mcp_cs
Waitus 1
Spiout Spi_write_buff(1) , 3
Waitus 1
Set Mcp_cs
Print "done!"
')
Set Trigger
Canwrite Cnf1 , &B00000100 'forum &B00010011 'selbst:&B00000100
Reset Trigger
Canwrite Cnf2 , &B11100010 'forum &B10010000 'selbst:&B11100010 '
Canwrite Cnf3 , &B00000011 '&B00000010 'selbst: &B00000011 '
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
End Sub
Sub Canwrite(reg_add , Reg_val) 'Subroutine "schreiben"
Print Cmd_write
Print Reg_add
Print Reg_val
Spi_write_buff(1) = Cmd_write
Spi_write_buff(2) = Reg_add
Spi_write_buff(3) = Reg_val
Reset Mcp_cs
Waitus 1
Spiout Spi_write_buff(1) , 3
Waitus 1
Set Mcp_cs
End Sub
Mit dem ausgeklammerten Teil ändere ich den Prescaler. Nun soll ja auch der Rest der Konfiguration gemacht werden, dort schreibt er aber immer Nullen in die Register. Ich habe daraufhin in der Sub Canwrite die übergebenen Variablen ausgeben lassen, Reg_val wird immer mit Null ausgegeben, also offenbar nicht richtig an die Subroutine übergeben - woran kann das liegen ? Die anderen Variablen (Reg_add etc.) kommen richtig an...
-
solche Dinge kommen vor wenn Stack und Frame zu klein
sind ... probiers mal mit größeren Werten dafür
ääääääääähhhhhhmmmmmm ... falscher Fehler.
Es wird wohl daran liegen, dass Du den CANCTRL nicht
in den Konfigurationsmodus versetzt.
Dann frisst er nämlich keine Konfigurationsänderung ;)
-
Ist er denn nicht nach dem Reset automatisch im Configmodus ? So stand es doch unter Punkt 10, oder ? Ich schaue mir das gleich mal an !
-
Das stimmt, nach dem Reset ist der Chip erstmal im Konfigurationsmodus.
-
das mag wohl sein, wenn du aber bit 7 bis 5 von canctral auf 0 setzt
bist du aus dem config-mode raus
edit: sorry, hab die Klammer übersehen ...
ich würds dennoch mal mit dem config Mode probieren.
-
:) ja, ich setze mich gleich nochmal dran... kann eigentlich nur noch eine Kleinigkeit sein.
-
Also, wenn ich die Register manuell schreibe, läufts. Aber sobald ich die Sub CANWRITE benutze, ist Reg_val immer null ?! Die Variable wird nicht übergeben...
/edit/
Ich habe es nochmals getestet. Schreibe ich CNF1 manuell, d.h. ohne nutzen der Subroutine, funktioniert es bestens, ich lese den geschriebenen Wert wieder aus. Sobald ich die Subroutine verwende, ist immer Reg_val &H00, egal, welchen Wert ich übergebe. Nach mehrfachem durchlesen und vergleichen checke ich einfach nicht, warum das so ist. Die anderen Variablen werden korrekt übergeben ....
-
Ja, Problem gefunden. HWStack und Framesize zu klein, wie Du sagtest...