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!
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!