- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 10 von 177

Thema: Funktionierendes CAN Bus Projekt entwickeln unter Bascom

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #11
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.01.2006
    Ort
    Nidda
    Alter
    52
    Beiträge
    180
    Hallo Vitis,

    ich habe jetzt eine Schaltung, analog zu der des CanTestBoard aufgebaut.
    Die dort genutzten Pins musste ich etwas anpassen.

    Den Code habe ich wie folgt angepasst:
    Code:
    $regfile = "m8def.dat"                                      ' ATMega8
    $crystal = 7372800                                          ' Baudratenquarz der AVR (MCP2515 mit 16MHz)
    $hwstack = 40                                               ' default use 32 for the hardware stack
    $swstack = 80                                               ' default use 10 for the SW stack
    $framesize = 90
    
    Declare Sub Can_init()
    Declare Sub Mcp2515_write(byval Reg_add As Byte , Byval Reg_val As Byte)
    Declare Sub Mcp2515_bitmodify(byval Reg_add As Byte , Byval Reg_mask As Byte , Byval Reg_val As Byte)
    Declare Function Mcp2515_read(byval Reg_add As Byte) As Byte
    
    Mcp2515cs Alias Portb.4					    'MISO
    Config Mcp2515cs = Output
    
    Const Cmd_read = &H03                                       ' Read Command
    Const Cmd_write = &H02                                      ' Write Command
    Const Cmd_bitmodify = &H05                                  ' Bit-modify Command
    Const Cmd_readstatus = &HA0                                 ' Read Status Command (poll)
    Const Cmd_read_rx_status = &HB0
    Const Cmd_reset = &HC0                                      ' Reset Command
    Const Cmd_rts0 = &H81
    Const Cmd_rts1 = &H82
    
    
    Const Caninte = &H2B
    Const Canctrl = &H0F
    Const Canstat = &H0E                                        ' Statusregister
    Const Eflg = &H2D                                           ' Error Flag Register
    Const Cnf3 = &H28                                           ' Configuration Register 3
    Const Cnf2 = &H29                                           ' Configuration Register 2
    Const Cnf1 = &H2A                                           ' Configuration Register 1
    Const Txb0ctrl = &B00110000                                 ' Transmit Buffer 0 Control Register
    Const Txb0sidh = &B00110001                                 ' Transmit Buffer 0 Std Identifier High
    Const Txb0sidl = &B00110010                                 ' Transmit Buffer 0 Std Identifier Low
    Const Txb0eid8 = &B00110011                                 ' Transmit Buffer 0 Ext Identifier High
    Const Txb0eid0 = &B00110100                                 ' Transmit Buffer 0 Ext Identifier Low
    Const Txb0dlc = &B00110101                                  ' Transmit Buffer 0 Data Length Code
    Const Txb0d0 = &B00110110                                   ' Transmit Buffer 0 Data Byte 0
    Const Txb0d1 = &B00110111                                   ' Transmit Buffer 0 Data Byte 1
    Const Txb0d2 = &B00111000                                   ' Transmit Buffer 0 Data Byte 2
    Const Txb0d3 = &B00111001                                   ' Transmit Buffer 0 Data Byte 3
    Const Txb0d4 = &B00111010                                   ' Transmit Buffer 0 Data Byte 4
    Const Txb0d5 = &B00111011                                   ' Transmit Buffer 0 Data Byte 5
    Const Txb0d6 = &B00111100                                   ' Transmit Buffer 0 Data Byte 6
    Const Txb0d7 = &B00111101                                   ' Transmit Buffer 0 Data Byte 7
    Const Rxm0sidh = &B00100000                                 ' Receive Buffer 0 Std Identifier High
    Const Rxm0sidl = &B00100001                                 ' Receive Buffer 0 Std Identifier Low
    Const Rxm0eid8 = &B00100010                                 ' Receive Buffer 0 Ext Identifier High
    Const Rxm0eid0 = &B00100011                                 ' Receive Buffer 0 Ext Identifier low
    Const Rxm1sidh = &B00100100                                 ' Receive Buffer 1 Std Identifier High
    Const Rxm1sidl = &B00100101                                 ' Receive Buffer 1 Std Identifier Low
    Const Rxm1eid8 = &B00100110                                 ' Receive Buffer 1 Ext Identifier High
    Const Rxm1eid0 = &B00100111                                 ' Receive Buffer 1 Ext Identifier low
    
    Const Rxb0ctrl = &H60
    Const Rxb1ctrl = &H70
    
    
    ' Hardware SPI-Schnittstelle konfigurieren
    'Config Portb.6 = Input		'Vitis
    'Config Portb.5 = Output	'Vitis
    'Config Portb.7 = Output	'Vitis
    
    Config Portb.4 = Input
    Config Portb.3 = Output
    Config Portb.5 = Output
    Spcr = &B01010010
    
    'Config Pind.2 = Input		'Vitis
    Config Pind.3 = Input
    Config Int0 = Falling
    On Int0 Int_canint
    Enable Int0
    Enable Interrupts
    
    Call Can_init()
    
    Do
       ' Zu übertragende Daten setzen:
       Mcp2515_bitmodify Txb0ctrl , &B00000011 , &B00000011     ' TX-Konfiguration
       Mcp2515_write Txb0sidh , &B01010101                      ' Empfängeradresse setzen
       Mcp2515_write Txb0sidl , &B01010101                      ' Empfängeradresse setzen
       Mcp2515_write Txb0dlc , &H04                             ' Paketlänge festlegen
       Mcp2515_write Txb0d0 , &B01010101                        ' Zu übertragende Daten setzen
       Mcp2515_write Txb0d1 , &B01010101                        ' Zu übertragende Daten setzen
    
       ' Übertragung auslösen
       Reset Mcp2515cs
       Waitus 10
       Spdr = Cmd_rts0
       Do
       Loop Until Spsr.spif = 1
       Waitus 10
       Set Mcp2515cs
    
    Loop
    
    Sub Can_init()
       Local Can_tmp As Byte
    
       Reset Mcp2515cs
    
       ' Reset MCP2515
       Can_tmp = Cmd_reset
       Spdr = Can_tmp
       Do
       Loop Until Spsr.spif = 1
       Set Mcp2515cs
    
       Waitms 2000
       Mcp2515_write Canctrl , &B10001000                       ' low nibble: 3=OSM 2=CLK-Pin 1-0=CLK Divider
       Print "speed change done"
    
       ' F MCP2515 = 16MHz
       Can_tmp = Eram_param_baudrate
       Select Case Can_tmp
          Case 0:
             ' CAN 31,25 KHz
             Mcp2515_write Cnf1 , &B00001111
          Case 1:
             ' CAN 62,5 KHz
             Mcp2515_write Cnf1 , &B00000111
          Case 2:
             ' CAN 125 KHz
             Mcp2515_write Cnf1 , &B00000011
          Case 3:
             ' CAN 250 KHz
             Mcp2515_write Cnf1 , &B00000001
          Case 4:
             ' CAN 500 KHz
             Mcp2515_write Cnf1 , &B00000000
          Case Else :
             Mcp2515_write Cnf1 , &B00001111
       End Select
       Mcp2515_write Cnf2 , &B10010000                          ' Cnf2 = &H29
       Mcp2515_write Cnf3 , &B00000010                          ' Cnf3 = &H28
       Mcp2515_write Caninte , &B00000011
       Mcp2515_write Rxb0ctrl , &B01100000
       Mcp2515_write Rxb1ctrl , &B01100000
       Mcp2515_write Rxm0sidh , 0                               ' Empfängeradressen auf 0, Filter aus
       Mcp2515_write Rxm0sidl , 0
       Mcp2515_write Rxm0eid8 , 0
       Mcp2515_write Rxm0eid0 , 0
       Mcp2515_write Rxm1sidh , 0
       Mcp2515_write Rxm1sidl , 0
       Mcp2515_write Rxm1eid8 , 0
       Mcp2515_write Rxm1eid0 , 0
       Mcp2515_bitmodify Canctrl , &B11100000 , &B00000000
       'Mcp2515_write Canctrl , &B00000000                       ' low nibble: 3=OSM 2=CLK-Pin 1-0=CLK Divider
       'Mcp2515_write Canctrl , &HE0
    End Sub
    
    Sub Mcp2515_bitmodify(reg_add , Reg_mask , Reg_val)
       Local Can_tmp2 As Byte
       Mcp2515cs = 0
       Can_tmp2 = Cmd_bitmodify
       Spdr = 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
       Mcp2515cs = 1
    End Sub
    
    Sub Mcp2515_write(reg_add , Reg_val)
       Local Can_tmp2 As Byte
       Mcp2515cs = 0
       Can_tmp2 = Cmd_write
       Spdr = Can_tmp2
       Do
       Loop Until Spsr.spif = 1
       Waitms 2
       Spdr = Reg_add
       Do
       Loop Until Spsr.spif = 1
       Spdr = Reg_val
       Do
       Loop Until Spsr.spif = 1
       Mcp2515cs = 1
    End Sub
    
    
    Function Mcp2515_read(reg_add)
       Local Can_tmp2 As Byte
       Mcp2515cs = 0
       Can_tmp2 = Cmd_read
       Spdr = Can_tmp2
       Do
       Loop Until Spsr.spif = 1
       Spdr = Reg_add
       Do
       Loop Until Spsr.spif = 1
       Spdr = 0
       Do
       Loop Until Spsr.spif = 1
       Mcp2515_read = Spdr
       Mcp2515cs = 1
    End Function
    Und jetzt gleich ein paar Fragen:
    1. Die Adressierung der einzelnen Knoten spielt eine wichtige Rolle.
    Wo ist die Adresse dieses Konoten festgelegt?
    2. Verstehe ich es richtig dass der Empfängerknoten unter &B01010101 zu erreichen ist
    3. Woraus leitest du die Peketlänge "&H04" ab?


    Tobias
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken can_test_tr_v1.jpg  

Berechtigungen

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

Solar Speicher und Akkus Tests