- 12V Akku mit 280 Ah bauen         
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 zusammen,

    ich habe mich zwischenzeitlich mal an die Hardware gemacht und das hier beschriebene CAN-MEGA8 Modul nach dem Entwurf aus "kreatives-chaos.com" nachgebaut.
    Nach regem Kontakt mit Vitis habe ich das folgende Programm in so weit angepasst dass es zumindes möglich sein sollte, eine Nachricht (welcher Taster gedückt wurde) über den CAN Bus zu senden.

    Code:
    'Testprogramm CAN Sender und Empfänger
    
    $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
    $baud = 9600
    
    ' Allgemeine Config ************************************************************
    
    Const Keys = 5                                              '5 angeschlossene Taster
    
    Config Pinc.0 = Input                                       'Eingang 1 bis 5
    Config Pinc.1 = Input
    Config Pinc.2 = Input
    Config Pinc.3 = Input
    Config Pinc.4 = Input
    Config Pinc.5 = Input
    
    Config Portb.0 = Output                                     'Relaisausgang 1 bis 5
    Config Portb.1 = Output
    Config Portb.2 = Output
    Config Portd.7 = Output
    Config Portd.6 = Output
    
    
    Dim I As Byte
    Dim Key As Byte
    
    Dim T1 As Bit                                               'Variable für Tasterzustand
    Dim T2 As Bit
    Dim T3 As Bit
    Dim T4 As Bit
    Dim T5 As Bit
    
    Dim Taster As Byte
    
    Portb.0 = 0                                                 'Grunsstellung fixieren
    Portb.1 = 0
    Portb.2 = 0
    Portd.7 = 0
    Portd.6 = 0
    
    
    'CAN relevante Config **********************************************************
    
    
    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 Portd.4                                     'CS am 2515
    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.4 = Input                                      'MISO  von 2515
    Config Portb.3 = Output                                     'MOSI  von 2515
    Config Portb.5 = Output                                     'SCK
    Spcr = &B01010001                                           'Bit7=0:IntAus, Bit6=1:SPIAn, Bit5=0:MSBfirst,
                                                                'Bit4=1:Masterfunktion, Bit3=0:SCK=0wennIdle,
                                                                'Bit2=0:L-H-Flanke, Bit1+0=01:AVRClock/16
    
    'Config Pind.3 = Input                                       'INT1 am AVR und MCP2515
    
    Config Int1 = Falling
    On Int1 Int_canint                                          'Interrupt zum empfangen
    Enable Int1
    Enable Interrupts
    
    
    'Programm Start*****************************************************************
    Print "Start Programm"
    Gosub Can_init
    
    
    Do
    
     For I = 1 To Keys
     Key = I
     Select Case Key
     Case 1 : Debounce Pinc.0 , 0 , Key_o1 , Sub                'Port 1.
     Case 2 : Debounce Pinc.1 , 0 , Key_o2 , Sub                'Port 2
     Case 3 : Debounce Pinc.2 , 0 , Key_o3 , Sub                'Port 3
     Case 4 : Debounce Pinc.3 , 0 , Key_o4 , Sub                'Port 4
     Case 5 : Debounce Pinc.4 , 0 , Key_o5 , Sub                'Port 5
    
    
     End Select
    Next
    
    Loop
    
    
    
    ' Zustandsänderung Ausgänge
       Key_o1:
       Toggle Portb.0
       Print "Portb.0"                                          'Buchse 1
       If T2 = 0 Then
       T2 = 1
       Else
       T2 = 0
       End If
       Gosub Data_send                                          'Statusänderung per CAN übertragen
       Return
    
       Key_o2:
       Toggle Portb.1
       Print "Portb.1"                                          'Buchse 2
       If T5 = 0 Then
       T5 = 1
       Else
       T5 = 0
       End If
       Gosub Data_send                                          'Statusänderung per CAN übertragen
       Return
    
       Key_o3:
       Toggle Portb.2                                           'Buchse 3
       Print "Portb.2"
       If T3 = 0 Then
       T3 = 1
       Else
       T3 = 0
       End If
       Gosub Data_send                                          'Statusänderung per CAN übertragen
       Return
    
       Key_o5:
       Toggle Portd.6                                           'Buchse 4
       Print "Portd.6"
       If T1 = 0 Then
       T1 = 1
       Else
       T1 = 0
       End If
       Gosub Data_send                                          'Statusänderung per CAN übertragen
       Return
    
       Key_o4:
       Toggle Portd.7                                           'Buchse 5
       Print "Portd.7"
       If T4 = 0 Then
       T4 = 1
       Else
       T4 = 0
       End If
       Gosub Data_send                                          'Statusänderung per CAN übertragen
       Return
    
    
    End
    
    
    'CAN Initialisieren *****************************
    
    Can_init:
    
    Reset Mcp2515cs                                             ' Reset MCP2515
    
       Spdr = &HC0
       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   &B10001000
    
       Print "speed change done"
    
    
       ' CAN 31,25 KHz
       Mcp2515_write Cnf1 , &B00001111
       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                               ' Eigene Empfängeradressen auf 00000000 setzen, kein Filter
       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
    
    
    Return
    
    
    'Daten übertargen    ****************************
    Data_send:
    
       Mcp2515_bitmodify Txb0ctrl , &B00000011 , &B00000011     ' TX-Konfiguration
       Mcp2515_write Txb0sidh , &B01010101                      ' Empfängeradresse setzen
       Mcp2515_write Txb0sidl , &B01010101                      ' Empfängeradresse setzen
       Mcp2515_write Txb0dlc , &H01                             ' Paketlänge festlegen für ein Byte
    
       'Hier soll der Status abgefragt werden: T1, T2, T3, T4, T5
       Taster = Pinc
       Taster = Taster And &B00011111
    
       Mcp2515_write Txb0d0 , Taster                            ' Zu übertragende Daten setzen
    
       ' Übertragung auslösen
       Print "Datenuebertragung"
       Reset Mcp2515cs
       Waitus 20
       Spdr = Cmd_rts0
    
    
       Do
       Loop Until Spsr.spif = 1
       Waitus 20
       Set Mcp2515cs
       Print "Datenuebertragung end"
    
    Return
    
    
    Int_canint:
    
       Print "Datenempfang - Prüfung"
    
       'Prüfung der ankommenden Daten
    
    
       Print "Daten:"
    
    
    Return
    
     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

    Beim Empfänger der 1:1 in der Hardware ist, sollte zumindest ein Interrupt ausgelöst werden und dies per Print Befehl ausgeben.

    Leider funktioniert dies bei mir noch nicht. Den Fehler konnte ich bisher nicht feststellen.
    Aber ich denke dass dies schon mal ein Anfang ist um vielleicht gemeinsam etwas weiter zu kommen.

    Mein Vorschlag wäre, dass ihr euch die Schaltung anseht und vielleicht auch nachbaut. Irgent wo hat sich ein (Hardware-)Fehler eingeschlichen. Ich kann ihn einfach nicht finden. Vermutlich sehe ich den Wald vor lauter Bäumen nichtmehr.

    Wer macht mit?

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

Berechtigungen

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

12V Akku bauen