-
        

Ergebnis 1 bis 3 von 3

Thema: Problem mit MCP2515

  1. #1
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    27
    Beiträge
    3.517
    Blog-Einträge
    9

    Problem mit MCP2515

    Anzeige

    Hallo Forum,

    ich habe folgenden Quellcode für meinen MCP2515:
    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 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!
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  2. #2
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    27
    Beiträge
    3.517
    Blog-Einträge
    9
    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:

    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
    
    '-------------------------------------------------------------------------------------------------------------------
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  3. #3
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    27
    Beiträge
    3.517
    Blog-Einträge
    9
    Ich denke das Problem hat sich erledigt......hatte das Oszi falsch eingestellt und dadurch wurde die Nachricht nicht angezeigt
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

Ähnliche Themen

  1. Mal wieder CAN, MCP2515
    Von elkokiller im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 0
    Letzter Beitrag: 03.11.2010, 07:39
  2. Frage zum CAN Controller MCP2515
    Von elkokiller im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 30.07.2009, 12:46
  3. MCP2515 CAN-Controller
    Von arok im Forum Elektronik
    Antworten: 13
    Letzter Beitrag: 13.06.2007, 13:10
  4. komisches Problem SPI Takt MCP2515
    Von ba4_philipp im Forum AVR Hardwarethemen
    Antworten: 0
    Letzter Beitrag: 18.02.2007, 20:28
  5. MCP2515 Register auslesen?
    Von SeveQ im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 19.10.2006, 12:23

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •