PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Problem mit MCP2515



Kampi
24.02.2012, 16:26
Hallo Forum,

ich habe folgenden Quellcode für meinen MCP2515:


'Mikrocontroller
$regfile = "m32def.dat"
$crystal = 16000000

'Stacks
$hwstack = 200
$swstack = 200
$framesize = 400

'UART konfigurieren
$baud = 19200

'SPI konfigurieren
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Noss = 1 , Clockrate = 16
Spiinit

'Unterprogramme
Declare Sub Read_register(byval Adress As Byte )
Declare Sub Write_register(byval Adress As Byte , Byval Daten As Byte)
Declare Sub Bit_modify(byval Register As Byte , Byval Bitmaske As Byte , Byval Daten As Byte)
Declare Sub Senden(byval Daten As Byte)
Declare Sub Init
Declare Sub Prio_txb0

'Befehle
Const Spi_read = &H03
Const Spi_write = &H02
Const Spi_reset = &HC0
Const Spi_rts = &H80

'Registeradressen
Const Cnf1 = &H2A
Const Cnf2 = &H29
Const Cnf3 = &H28
Const Canctrl = &H0F
Const Caninte = &H2B
Const Txb0ctrl = &H30

'I/O Einstellungen
Config Portb.4 = Output

'Namen vergeben
Css Alias Portb.4

'Variablen
Dim Canin As Byte
Dim Data_out As Byte

'Chipselect auf High setzen
Set Css
Wait 1

'MCP2515 initialisieren
Call Init

Write_register Canctrl , &H86

'Priorität von TXB1 auf "Highest" setzen
Call Prio_txb0


'Hauptprogramm
Do

Read_register Cnf1
Print "Registerinhalt CNF1: " ; Canin
Read_register Cnf2
Print "Registerinhalt CNF2: " ; Canin
Read_register Cnf3
Print "Registerinhalt CNF3: " ; Canin
Read_register Canctrl
Print "Registerinhalt CAN Control: " ; Canin
Read_register Txb0ctrl
Print "Registerinhalt TXB0 Control: " ; Canin

Print "----------------------------------------------------------"

Wait 1

Loop
End

'-------------------------------------------------------------------------------------------------------------------

Sub Read_register(byval Adress As Byte )

Reset Css 'Chipselect auf Low ziehen
Spdr = Spi_read 'Inhalt von "SPI_Read" im Datenregister speichern
Spiout Spdr , 1 'Read Instruction (0000 0011) senden
Spiout Adress , 1 'Registeradresse senden
Spiin Canin , 1 'Registerinhalt einlesen
Waitms 10
Set Css 'Chipselect auf High ziehen
End Sub

'-------------------------------------------------------------------------------------------------------------------

Sub Write_register(byval Adress As Byte , Byval Daten As Byte)

Reset Css 'Chipselect auf Low ziehen

Spdr = Spi_write 'Inhalt von "SPI-Write" ins SPI_Data_Register schieben
Do 'Schleife bis SPI Interrupt Flag gesetzt wurde, also bis
Loop Until Spsr.spif = 1 'die Übertragung abgeschlossen ist

Spdr = Adress
Do
Loop Until Spsr.spif = 1

Spdr = Daten
Do
Loop Until Spsr.spif = 1

Set Css 'Chipselect auf High ziehen
End Sub

'-------------------------------------------------------------------------------------------------------------------

Sub Init

'MCP2515 reseten
Reset Css
Spdr = Spi_reset
Spiout Spdr , 1
Set Css
Waitms 10 '10ms warten, da sonst das Auslesen von CNF1
'nicht richtig erfolgen kann
'Bittiming einstellen
Write_register Cnf1 , &H06 'Baudrate einstellen
Write_register Cnf2 , &HA0 'Phasensegmenteinstellungen
Write_register Cnf3 , &H02
Write_register Caninte , &H03

End Sub

'-------------------------------------------------------------------------------------------------------------------

Sub Senden(byval Daten As Byte)

Reset Css
Spdr = Spi_rts
Spiout Spdr , 1
Spdr = Daten
Spiout Spdr , 1
Set Css
Print "GESENDET"
End Sub

'-------------------------------------------------------------------------------------------------------------------

Sub Bit_modify(byval Register As Byte , Byval Bitmaske As Byte , Byval Daten As Byte)

Reset Css 'Chipselect auf Low ziehen
Spiout Register , 1 'Registeradresse ausgeben
Spiout Bitmaske , 1 'Bitmaske ins Register schreiben
Spiout Daten , 1
Set Css
End Sub

'-------------------------------------------------------------------------------------------------------------------

Sub Prio_txb0

Bit_modify Txb0ctrl , &H03 , &H03

End Sub

'-------------------------------------------------------------------------------------------------------------------


Dieser Code beschreibt erstmal ein paar Register und ließt diese dann 1x die Sekunde aus (ist erstmal nur ein Testcode um die Register nacheinander zu beschreiben. Das Senden über CAN kommt später dazu). Im Terminal habe ich dann aber das hier stehen:

----------------------------------------------------------
Registerinhalt CNF1: 6
Registerinhalt CNF2: 160
Registerinhalt CNF3: 2
Registerinhalt CAN Control: 134
Registerinhalt TXB0 Control: 0
----------------------------------------------------------

Wie man sieht steht bei "TXBO Control" eine 0 aber da soll eine 3 stehen.
Ich finde den Fehler einfach nicht.
Kann da mal jemand drüber gucken und mir sagen wo ich was falsch gemacht habe?
Danke für die Hilfe!

Kampi
24.02.2012, 21:32
Also das Problem habe ich gelöst. Jetzt versuche ich ein paar Daten zu senden. Aber auf dem Oszi wird nichts angezeigt. Ich habe mir Sicherheitshalber nochmal die Registerinhalte per Terminal anzeigen lassen.
Dort steht folgendes:
----------------------------------------------------------
Registereinstellungen:
Registerinhalt CNF1: 3
Registerinhalt CNF2: 144
Registerinhalt CNF3: 2
Registerinhalt CAN Control: 140
Registerinhalt TXB0 Control: 11
Registerinhalt TXB0 Identifier Low: 3
Registerinhalt TXB0 Identifier High: 0
Registerinhalt TXB0 Data Lenght: 8
GESENDET
----------------------------------------------------------
Also in den Teil des Programmes wo er Senden soll springt er.....aber wie gesagt da tut sich nichts auf dem Oszi.
Hier ist nochmal der neue Code:



'Mikrocontroller
$regfile = "m32def.dat"
$crystal = 16000000

'Stacks
$hwstack = 200
$swstack = 200
$framesize = 400

'UART konfigurieren
$baud = 19200

'SPI konfigurieren
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Noss = 1 , Clockrate = 16
Spiinit

'Unterprogramme
Declare Sub Read_register(byval Adress As Byte )
Declare Sub Write_register(byval Adress As Byte , Byval Daten As Byte)
Declare Sub Senden
Declare Sub Init

'Befehle
Const Spi_read = &H03
Const Spi_write = &H02
Const Spi_reset = &HC0
Const Spi_rts = &H81

'Registeradressen
Const Cnf1 = &H2A
Const Cnf2 = &H29
Const Cnf3 = &H28
Const Canctrl = &H0F
Const Caninte = &H2B
Const Txb0ctrl = &H30 ' Transmit Buffer 0 Control Register
Const Txb0sidh = &H31 ' Transmit Buffer 0 Std Identifier High
Const Txb0sidl = &H32 ' Transmit Buffer 0 Std Identifier Low
Const Txb0eid8 = &H33 ' Transmit Buffer 0 Ext Identifier High
Const Txb0eid0 = &H34 ' Transmit Buffer 0 Ext Identifier Low
Const Txb0dlc = &H35 ' Transmit Buffer 0 Data Length Code
Const Txb0d0 = &H36 ' Transmit Buffer 0 Data Byte 0
Const Txb0d1 = &H37 ' Transmit Buffer 0 Data Byte 1
Const Txb0d2 = &H38 ' Transmit Buffer 0 Data Byte 2
Const Txb0d3 = &H39 ' Transmit Buffer 0 Data Byte 3
Const Txb0d4 = &H3A ' Transmit Buffer 0 Data Byte 4
Const Txb0d5 = &H3B ' Transmit Buffer 0 Data Byte 5
Const Txb0d6 = &H3C ' Transmit Buffer 0 Data Byte 6
Const Txb0d7 = &H3D ' Transmit Buffer 0 Data Byte 7

'I/O Einstellungen
Config Portb.4 = Output

'Namen vergeben
Css Alias Portb.4

'Variablen
Dim Canin As Byte
Dim Data_lenght As Byte
Dim Data0 As Byte
Dim Data1 As Byte
Dim Data2 As Byte
Dim Data3 As Byte
Dim Data4 As Byte
Dim Data5 As Byte
Dim Data6 As Byte
Dim Data7 As Byte

Data_lenght = 8
Data0 = 0
Data1 = 1
Data2 = 2
Data3 = 3
Data4 = 4
Data5 = 5
Data6 = 6
Data7 = 7

'Chipselect auf High setzen
Set Css
Wait 1

'MCP2515 initialisieren
Call Init



'Hauptprogramm
Do

Print "Registereinstellungen:"
Read_register Cnf1
Print "Registerinhalt CNF1: " ; Canin
Read_register Cnf2
Print "Registerinhalt CNF2: " ; Canin
Read_register Cnf3
Print "Registerinhalt CNF3: " ; Canin
Read_register Canctrl
Print "Registerinhalt CAN Control: " ; Canin
Read_register Txb0ctrl
Print "Registerinhalt TXB0 Control: " ; Canin
Read_register Txb0sidl
Print "Registerinhalt TXB0 Identifier Low: " ; Canin
Read_register Txb0sidh
Print "Registerinhalt TXB0 Identifier High: " ; Canin
Read_register Txb0dlc
Print "Registerinhalt TXB0 Data Lenght: " ; Canin
Senden
Print "----------------------------------------------------------"

Wait 1

Loop
End



'Unterprogramme
'-------------------------------------------------------------------------------------------------------------------

Sub Read_register(byval Adress As Byte )

Reset Css 'Chipselect auf Low ziehen
Spdr = Spi_read 'Inhalt von "SPI_Read" im Datenregister speichern
Spiout Spdr , 1 'Read Instruction (0000 0011) senden
Spiout Adress , 1 'Registeradresse senden
Spiin Canin , 1 'Registerinhalt einlesen
Waitms 10
Set Css 'Chipselect auf High ziehen
End Sub

'-------------------------------------------------------------------------------------------------------------------

Sub Write_register(byval Adress As Byte , Byval Daten As Byte)

Reset Css 'Chipselect auf Low ziehen

Spdr = Spi_write 'Inhalt von "SPI-Write" ins SPI_Data_Register schieben
Do 'Schleife bis SPI Interrupt Flag gesetzt wurde, also bis
Loop Until Spsr.spif = 1 'die Übertragung abgeschlossen ist

Spdr = Adress
Do
Loop Until Spsr.spif = 1

Spdr = Daten
Do
Loop Until Spsr.spif = 1

Set Css 'Chipselect auf High ziehen
End Sub

'-------------------------------------------------------------------------------------------------------------------

Sub Init

'MCP2515 reseten
Reset Css
Spdr = Spi_reset
Do
Loop Until Spsr.spif = 1
Set Css
Waitms 10 '10ms warten, da sonst das Auslesen von CNF1
'nicht richtig erfolgen kann
'One Shot aktivieren / Osc aktivieren
Write_register Canctrl , &H8C

'Bittiming einstellen
Write_register Cnf1 , &H03 'Baudrate einstellen
Write_register Cnf2 , &H90 'Phasensegmenteinstellungen
Write_register Cnf3 , &H02
Write_register Caninte , &H03

'Priorität einstellen
Write_register Txb0ctrl , &H03 'Highest Message Priority für Transmit Buffer 0

'Message Identifier einstellen
Write_register Txb0sidh , &H00
Write_register Txb0sidl , &H03

'Nachrichtenlänge einstellen (DFL)
Write_register Txb0dlc , Data_lenght

End Sub

'-------------------------------------------------------------------------------------------------------------------

Sub Senden

Write_register Txb0d0 , Data0 'Cand(1)
Write_register Txb0d1 , Data1 'Cand(2)
Write_register Txb0d2 , Data2 'Cand(3)
Write_register Txb0d3 , Data3 'Cand(4)
Write_register Txb0d4 , Data4 'Cand(5)
Write_register Txb0d5 , Data5 'Cand(6)
Write_register Txb0d6 , Data6 'Cand(7)
Write_register Txb0d7 , Data7 'Cand(8)

Reset Css
Waitms 10
Spdr = Spi_rts
Do
Loop Until Spsr.spif = 1
Waitms 10
Set Css
Print "GESENDET"
End Sub

'-------------------------------------------------------------------------------------------------------------------

Kampi
25.02.2012, 22:04
Ich denke das Problem hat sich erledigt......hatte das Oszi falsch eingestellt und dadurch wurde die Nachricht nicht angezeigt :(