- LiFePO4 Speicher Test         
Ergebnis 1 bis 3 von 3

Thema: Fehlersuche Mega32 am CAN

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.01.2006
    Ort
    Nidda
    Alter
    51
    Beiträge
    180

    Fehlersuche Mega32 am CAN

    Anzeige

    E-Bike
    Hallo,

    ich habe einige Mega8 über einen MCP2515 (CAN-Bus) verbunden.
    Nun möchte ich einen Mega32 in den Bus aufnehmen und habe diesen mit einen MCP2515, wie zuvor den Mega auch über SPI verbunden.

    Leider hängt sich das Programm auf sobald ich das Bit-Timing einstelle.
    Ich habe alle Verbindungen überprüft und die Chips ausgetauscht.
    Kein Erfolg

    Hat jemand eine Idee an was es noch liegen kann?

    Schaltbild und Code findet ihr hier:

    Code:
      $regfile = "m32def.dat"
     $crystal = 7372800
     $baud = 9600
    
    
    ' Sonderzeichen und LCD Display ************************************************
    
    
     Config Lcdpin = Pin , Db4 = Porta.3 , Db5 = Porta.2 , Db6 = Porta.1 , Db7 = Porta.0 , E = Porta.4 , Rs = Porta.5
     Config Lcdmode = Port
     Config Lcdbus = 4                                          '4 bit mode
     Config Lcd = 16 * 2                                        'LCD-Display mit 16 Zeichen in 2 Zeilen verwendet
    
    
    ' CAN Bus Init******************************************************************
     Config Spi = Hard , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Noss = 1 , Clockrate = 16       'Test mir Atmega wegen HardwareSPI
     Spiinit
    
     Config Pind.3 = Input
     Mcpint Alias Pind.3                                        ' Mcpint Alias Pind.3
     Css Alias Portd.4
     Config Css = Output
     Set Css
     Wait 1
    
    
     Declare Sub Mcp2515_write_register(byval Adress As Byte , Byval Daten As Byte)
     Declare Sub Mcp2515_read_register(byval Adress As Byte )
     Declare Sub Mcp2515_bitmodify(byval Reg_add As Byte , Byval Reg_mask As Byte , Byval Reg_val As Byte)
    
     Dim Mcphilf As Byte
    
     Dim Absender As Integer
    
     Dim Id As Integer
     Dim Idh As Byte
     Dim Idl As Byte
     Dim Dfl As Byte
     Dim Idi As Byte
     Dim Canin As Byte
     Dim Db0(8) As Byte
     Dim Canstat As Byte
     Dim Hilf1 As Word
    
     Dim T As Integer
     Dim L As Byte
    
     Dim Verify As Byte
     Verify = 10
    
     Const Spi_reset = &HC0
     Const Spi_write = &H02
     Const Spi_read = &H03
     Const Spi_rts0 = &H81
     Const Spi_rts1 = &H82
     Const Spi_rts2 = &H84
     Const Spi_read_status = &HA0
     Const Spi_bit_modify = &H05
    
     Const Rxb0ctrl = &H60
     Const Rxb1ctrl = &H70
    
     Const Rxm0sidh = &H20
     Const Rxm0sidl = &H21
     Const Rxm1sidh = &H24
     Const Rxm1sidl = &H25
    
     Const Rxf0sidh = &H00
     Const Rxf0sidl = &H01
     Const Rxf1sidh = &H04
     Const Rxf1sidl = &H05
    
    
     Const Bfpctrl = &H0C
     Const Txrtsctrl = &H0D
     Const Canctrl = &H0F
    
     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 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
    
     Const Txb1ctrl = &H40                                      ' Transmit Buffer 1 Control Register
     Const Txb1sidh = &H41                                      ' Transmit Buffer 1 Std Identifier High
     Const Txb1sidl = &H42                                      ' Transmit Buffer 1 Std Identifier Low
     Const Txb1dlc = &H45                                       ' Transmit Buffer 1 Data Length Code
     Const Txb1d0 = &H46                                        ' Transmit Buffer 1 Data Byte 0
     Const Txb1d1 = &H47                                        ' Transmit Buffer 1 Data Byte 1
     Const Txb1d2 = &H48                                        ' Transmit Buffer 1 Data Byte 2
     Const Txb1d3 = &H49                                        ' Transmit Buffer 1 Data Byte 3
     Const Txb1d4 = &H4A                                        ' Transmit Buffer 1 Data Byte 4
     Const Txb1d5 = &H4B                                        ' Transmit Buffer 1 Data Byte 5
     Const Txb1d6 = &H4C                                        ' Transmit Buffer 1 Data Byte 6
     Const Txb1d7 = &H4D                                        ' Transmit Buffer 1 Data Byte 7
    
     Const Txb2ctrl = &H50                                      ' Transmit Buffer 2 Control Register
     Const Txb2sidh = &H51                                      ' Transmit Buffer 2 Std Identifier High
     Const Txb2sidl = &H52                                      ' Transmit Buffer 2 Std Identifier Low
     Const Txb2dlc = &H55                                       ' Transmit Buffer 2 Data Length Code
     Const Txb2d0 = &H56                                        ' Transmit Buffer 2 Data Byte 0
     Const Txb2d1 = &H57                                        ' Transmit Buffer 2 Data Byte 1
     Const Txb2d2 = &H58                                        ' Transmit Buffer 2 Data Byte 2
     Const Txb2d3 = &H59                                        ' Transmit Buffer 2 Data Byte 3
     Const Txb2d4 = &H5A                                        ' Transmit Buffer 2 Data Byte 4
     Const Txb2d5 = &H5B                                        ' Transmit Buffer 2 Data Byte 5
     Const Txb2d6 = &H5C                                        ' Transmit Buffer 2 Data Byte 6
     Const Txb2d7 = &H5D                                        ' Transmit Buffer 2 Data Byte 7
    
     Const Rxb0sidh = &H61
     Const Rxb0sidl = &H62
     Const Rxb0dlc = &H65
     Const Rxb1sidh = &H71
     Const Rxb1sidl = &H72
     Const Rxb1dlc = &H75
    
     Const Cnf1 = &H2A
     Const Cnf2 = &H29
     Const Cnf3 = &H28
     Const Caninte = &H2B
     Const Canintf = &H2C
    
     $framesize = 32                                            'Stack
     $swstack = 32
     $hwstack = 64
    
    
    'CAN Modul Identifikation
    
    
    Id = 10
    
    
    
    ' Startanzeige
    
    '                 LCD "1   5   10    16  20"
      Cls
      Locate 1 , 1 : Lcd "test1"
      Locate 2 , 1 : Lcd "V1.1  05.01.2009"
    
     Wait 2
    
      Hilf1 = Id / 8
      Idh = Hilf1
      Hilf1 = Idh * 8
      Hilf1 = Id - Hilf1
      Hilf1 = Hilf1 * 32
      Idl = Hilf1
    
      Gosub Mcp2515_init
    
    
      Mcp2515_read_register Caninte
      Mcp2515_read_register Canintf
      Mcp2515_read_register Canstat
      Mcp2515_read_register Canctrl
      Mcp2515_read_register Cnf1
      Mcp2515_read_register Cnf2
      Mcp2515_read_register Cnf3
      Mcp2515_read_register Txb0ctrl
      Mcp2515_read_register Txb1ctrl
      Mcp2515_read_register Txb2ctrl
      Mcp2515_read_register Rxb0ctrl
      Mcp2515_read_register Rxb1ctrl
      Mcp2515_read_register Bfpctrl
      Mcp2515_read_register Txrtsctrl
    
    
     Idi = 10
    
    
      Locate 2 , 1 : Lcd "Eigene-ID " ; Id ; "  o.k."           ' Bestätigungsmeldung
    
    
    ' Haupt-Programm Ausführung
    
     Wait 2
    
    
     Cls
    
     If Mcpint = 1 Then
    
    
    '   Id = Eigenid                                            'Identifer der zu sendenden Daten
         Dfl = 8                                                'Nachrichtenlänge einstellen (DFL)
         Db0(1) = 0                                             'Befehl                                        'Anweisung
         Db0(2) = 0                                             'Ziel                                          'Empfänger
         Db0(3) = 0
         Db0(4) = 0
         Db0(5) = 0
         Db0(6) = 0
         Db0(7) = 0
         Db0(8) = Absender
    
    
    
     Gosub Senden
     Else
     End If
    
     Wait 3
    
    
     Gosub Status                                               'Aktivmeldung an CAN Bus
    
    Do
    
    
    
    Loop
    
    '**** CAN Sequenzen ************************************************************
    
    
    
     Mcp2515_init:
    
     Print "Mcp2515_init:"
    
    
     'MCP2515 per Software Reset zurücksetzen
     Mcphilf = Spi_reset
     Reset Css
       Waitus 10
       Spdr = Mcphilf
       Do
    
       Print "do"
    
       Loop Until Spsr.spif = 1
    
       Waitus 10
    
     Set Css
     Waitus 20
    
      Print "einstellen des Bit Timings "
    
     'einstellen des Bit Timings    +++++++++ UND HIER HÄNGT SICH DAS PROGRAMM DANN AUF ++++++++++++++++++++
    
     Mcp2515_write_register Cnf1 , &H13
     Mcp2515_write_register Cnf2 , &H90
     Mcp2515_write_register Cnf3 , &H02
    
     Print "einstellen des Bit Timings o.k."
    'Interrupt einstellen
     Mcp2515_write_register Caninte , &B00000011
      Print "Interrupt einstellen "
    
    
     Mcp2515_write_register Rxb0ctrl , &B01100000
    '                                     **
    
    'Buffer 1: Empfang aller Nachrichten
     Mcp2515_write_register Rxb1ctrl , &B01100000
    '                                     **
    
    
    '****************************************************************************
    '******************       Filter  und Maske einstellen   ********************
    '****************************************************************************
    
    'Maske setzen       - alle Bits auf "1" führen zu einem eindeutigen Filtern einer ID
     Mcp2515_write_register Rxm0sidh , &B00111111               '
     Mcp2515_write_register Rxm0sidl , &B11100000               '
     Mcp2515_write_register Rxm1sidh , &B00111111               '
     Mcp2515_write_register Rxm1sidl , &B11100000               '
    
    'Filter setzen
     Mcp2515_write_register Rxf0sidh , &B00000011
     Mcp2515_write_register Rxf0sidl , &B00100000
     Mcp2515_write_register Rxf1sidh , &B00000011
     Mcp2515_write_register Rxf1sidl , &B00100000
    
    
    
     Mcp2515_write_register Bfpctrl , 0
    
     Mcp2515_write_register Txrtsctrl , 0
    
     Mcp2515_bitmodify Canctrl , &B11100000 , &B00000000
    
    
    
     Print "return"
     Return
    
    
    '********MCP2515  schreiben****************************************
    
     Sub Mcp2515_write_register(byval Adress As Byte , Byval Daten As Byte)
      'Print "Reg: " ; Adress ; " Val: " ; Daten
     Mcphilf = Spi_write
     Reset Css
     Spdr = Mcphilf
     Do
     Loop Until Spsr.spif = 1
     Waitms 2
     Spdr = Adress
     Do
     Loop Until Spsr.spif = 1
     Spdr = Daten
     Do
     Loop Until Spsr.spif = 1
     Set Css
     End Sub
    
    
    
    '********MCP2515  lesen****************************************
    
     Sub Mcp2515_read_register(byval Adress As Byte )
     Mcphilf = Spi_read
     Reset Css
     Spdr = Mcphilf
     Do
     Loop Until Spsr.spif = 1
     Waitms 2
     Spdr = Adress
     Do
     Loop Until Spsr.spif = 1
     Spdr = 0
       Do
       Loop Until Spsr.spif = 1
       Canin = Spdr
     Set Css
     End Sub
    
    
    
    '********MCP2515  bitmodify****************************************
    
    Sub Mcp2515_bitmodify(reg_add , Reg_mask , Reg_val)
       'Local Can_tmp2 As Byte
       Reset Css
       Mcphilf = Spi_bit_modify
       Spdr = Mcphilf                                           'Can_tmp2
       Do
       Loop Until Spsr.spif = 1
       Waitms 2
       Spdr = Reg_add
       Do
       Loop Until Spsr.spif = 1
       Spdr = Reg_mask
       Do
       Loop Until Spsr.spif = 1
       Spdr = Reg_val
       Do
       Loop Until Spsr.spif = 1
       Set Css
    End Sub
    
    '******** Datenempfang ********************************************
    
     Mcpempfang:
     'Print "Empfangen"
     Mcp2515_read_register Canintf                              'Spi_rx_status
     Canstat = Canin
     'Print "CANINTF: " ; Canstat
     If Canstat.0 = 1 Then Gosub Mcp_read_buffer0
    ' If Canstat.1 = 1 Then Gosub Mcp_read_buffer1
     Return
    
     '--------   lesen vom Buffer 0
     Mcp_read_buffer0:
     Mcp2515_read_register Rxb0sidh
     Idh = Canin
     Mcp2515_read_register Rxb0sidl
     Idl = Canin
     Mcp2515_read_register Rxb0dlc
    
     Dfl = Canin
     Id = Idh * 8
     Hilf1 = Idl / 32
     Id = Id + Hilf1
    
     'Print "ID-0=" ; Id ; "  DFL-0=" ; Dfl
     'Daten
     For L = 1 To 8
     If L = 1 Then Mcp2515_read_register &H66
     If L = 2 Then Mcp2515_read_register &H67
     If L = 3 Then Mcp2515_read_register &H68
     If L = 4 Then Mcp2515_read_register &H69
     If L = 5 Then Mcp2515_read_register &H6A
     If L = 6 Then Mcp2515_read_register &H6B
     If L = 7 Then Mcp2515_read_register &H6C
     If L = 8 Then Mcp2515_read_register &H6D
     Db0(l) = Canin
     Next L
     Mcp2515_bitmodify Canintf , &B00000001 , &B00000000
     'Print "Daten Buffer-0:" ; Db0(1) ; "$-" ; Db0(2) ; "-" ; Db0(3) ; "-" ; Db0(4) ; "-" ; Db0(5) ; "-" ; Db0(6) ; "-" ; Db0(7) ; "-" ; Db0(8) ; "-#"
    
    
      Gosub Auswertung
    
     Return
    
    
    '**************************************************
    Auswertung:
      Print "Empfang:" ; Db0(1) ; "-" ; Db0(2) ; "-" ; Db0(3) ; "-" ; Db0(4) ; "-" ; Db0(5) ; "-" ; Db0(6) ; "-" ; Db0(7) ; "-" ; Db0(8)
    
      Return
    
    
    '**************************************************
       Status:
    
    If Mcpint = 1 Then
    
    
    '   Id = Eigenid                                            'Identifer der zu sendenden Daten
         Dfl = 8                                                'Nachrichtenlänge einstellen (DFL)
         Db0(1) = 001                                           'Befehl                                        'Anweisung
         Db0(2) = 000                                           'Ziel                                          'Empfänger
         Db0(3) = 0
         Db0(4) = 0
         Db0(5) = 0
         Db0(6) = 0
         Db0(7) = 0
         Db0(8) = Absender
    
         Gosub Senden
    
    
         Else
         End If
    
    
    
      Mcp2515_read_register Canintf                             'Spi_rx_status
      Canstat = Canin
    '  Print "CANINTF: " ; Canstat
    
    
      Mcp2515_bitmodify Canctrl , &B00001000 , &B00001000
    
    
    
    
     Waitms 500
     Return
    
    Senden:
    
    Mcp2515_read_register Txb0ctrl                              '&HA0
    
     Hilf1 = Id / 8
     Idh = Hilf1
     Hilf1 = Idh * 8
     Hilf1 = Id - Hilf1
     Hilf1 = Hilf1 * 32
     Idl = Hilf1
    
    'Print Id
    
    'Print "SPI_read_Status0: " ; Canin
    If Canin.3 = 0 Then Gosub Send_buffer0
    Mcp2515_read_register Txb1ctrl                              '&HA0
    
    
    'Print "Senden-Ende"
    
    '********senden mit Buffer 0****************************************
    
    Send_buffer0:
    
    'Priorität einstellen
      Mcp2515_bitmodify Txb0ctrl , &B00000011 , &B00000011
    
    
      'Standard ID einstellen
      Mcp2515_write_register Txb0sidh , Idh                     ' Empfängeradresse setzen
      Mcp2515_write_register Txb0sidl , Idl                     ' Empfängeradresse setzen
      'Nachrichtenlänge einstellen (DFL)
      Mcp2515_write_register Txb0dlc , Dfl
       'Daten
      Mcp2515_write_register Txb0d0 , Db0(1)
      Mcp2515_write_register Txb0d1 , Db0(2)
      Mcp2515_write_register Txb0d2 , Db0(3)
      Mcp2515_write_register Txb0d3 , Db0(4)
      Mcp2515_write_register Txb0d4 , Db0(5)
      Mcp2515_write_register Txb0d5 , Db0(6)
      Mcp2515_write_register Txb0d6 , Db0(7)
      Mcp2515_write_register Txb0d7 , Db0(8)
      'nachricht versenden
      Reset Css
       Waitus 10
       Mcphilf = Spi_rts0
       Spdr = Mcphilf
       Do
       Loop Until Spsr.spif = 1
       Waitus 10
     Set Css
    ' Print "gesendet Buffer-0"
     Waitms 50
      Return
    
    
    
    End
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken mega32ancan.jpg  

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.01.2006
    Ort
    Nidda
    Alter
    51
    Beiträge
    180
    Hallo,

    kann mir keiner helfen?
    Offesichtlich ist es die Einstellung am Mega32 selbst denn wenn ich keinen MCP2515 einstecke bleibt das Programm auch hängen.

    Aber wo muss ich den Fehler dann suchen. Die Hardware ist 1:1 zu der des Mega8 aufgebaut.
    Quarz am Mega32 = 7,3728 Mhz am MCP2515 = 16 Mhz.
    Die Fusebits sind auch 1:1 übernommen.
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken fusemega32.jpg  

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.01.2006
    Ort
    Nidda
    Alter
    51
    Beiträge
    180
    Hallo,
    hat keiner eine Idee an was der Fehler hängen kann?

    Ich bin jetzt kurz davor alles in die Ecke zu werfen.

    das Programm Bleibt an folgender Stelle hängen

    Code:
    Senden:
    Print "Senden"   'wird noch angezeigt
    'kombinierte Abfrage, ob ein Register frei zum senden ist ( Datenblatt Seite64)
    'es werden abgefragt (&H30 40 50) TXBnCTRL.TXREQ  (n steht für Buffer 0,1,2)
    'Alternativ Buffer0 (&H30) TXB0CTRL abfragen und bit 3=Status muss "0" sein (Seite 18)
    Mcp2515_read_register Txb0ctrl                              '&HA0
    Print "hier gehts nicht weiter!" ' hier wird nichts mehr angezeigt
    Hat jemand mal ein beispielprogramm für dem Mega32 zum vergleichen?

Berechtigungen

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

Labornetzteil AliExpress