- Akku Tests und Balkonkraftwerk Speicher         
Seite 3 von 18 ErsteErste 1234513 ... LetzteLetzte
Ergebnis 21 bis 30 von 177

Thema: Funktionierendes CAN Bus Projekt entwickeln unter Bascom

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

    Praxistest und DIY Projekte
    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  

  2. #22
    Na ich freue mich, dass hier ein wenig schwung wieder rein gekommen ist.

    Ich kann mich nur oben anschließen; Ich habe ca. 2Jahre versucht mir selber c beizubringen und wurde leider nur von Francis Büchern unterstützt.

    Ich habe aufgegeben und Bascom entdeckt - ich war nach zwei Tagen soweit LCD Displays einwandfrei zu programmieren.....
    Jedoch glaube ich in Bezug auf MCP das ich die Grundrechenarten NICHT verstanden habe. Das Mistding kommuniziert einfach nicht mit mir!

    Zum übersetzen von C ins viel leichtere Bascom reichts bei mir leider auch nicht....

    Ich habe aber mal etwas gelernt und mich mit dem I2C Bus beschäftigt, vielleicht kann ich ja ein wenig Wissen transferieren....
    Habe zumindest den I2C zu laufen bekommen (externe Uhr und Porterweiterung als zusätzliche Ausgänge!)

    Werde mich nochmals an den MCP machen

    Grüße und witer forschen, irgendwann kriegen wir das hin!

    Michael

  3. #23
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    Die Adresse des Senderknotens ist die ID, im vorliegenden Codeschnipsel hier 0. Ist aber unerheblich, weil der Absender nicht mit übertragen wird im CAN-Bus-Frame.

    Als Empfänger ist richtig der &B01010101 &B01010101 genannt. Die Zeichenfolge verwend ich gern, weil sie im Oszi schön angesehen werden kann und so das Bittiming für die Übertragungsrate schön nachgemesen werden kann.

    Die Paketlänge ist falsch, sollte hier 2 sein weil zwei Bytes gesendet werden, das hast du richtig erkannt. Die übrigen 2 Bytes wurden in meinem Beispiel einfach als 0 gesendet, da kein weiteres Byte geschrieben wurde
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  4. #24
    Benutzer Stammmitglied
    Registriert seit
    25.09.2007
    Ort
    Oldenburg
    Alter
    50
    Beiträge
    80
    @Vitis: Na klar, die Grundrechenarten lerne ich ja auch immernoch. Ist halt alles nicht so einfach, aber ich muss schnell mit meinen Aufgaben wachsen.

  5. #25
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.08.2004
    Beiträge
    197
    Teste das mal, vorher noch die Standartwerte für den Prozessor einsetzen
    Kommt aus dem Bascom-Forum
    Code:
    $sim
    Config Spi = Soft , Din = Pinb.2 , Dout = Portb.1 , Ss = None , Clock = Portb.0
    Dim C1 As Byte
    Dim A(3) As Byte
    Declare Sub Spi_write(byval Reg_add As Byte , Byval Reg_val As Byte)
    
    
    
    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_reset = &HC0                                      ' Reset Command
    Const Canctrl = &H0F
    
    Const Cnf3 = &H28                                           ' Configuration Register 3
    Const Cnf2 = &H29                                           ' Configuration Register 2
    Const Cnf1 = &H2A                                           ' Configuration Register 1
    
    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
    
    
     Const Rts0 = &H81
    
    Print "Welcome!"
    
    Config Pinb.3 = Output
    Config Pinb.4 = Output
    Csn Alias Portb.3
    Can_reset Alias Portb.4
    
    
    
    Spiinit
    Can_reset = 1
    
    Print "Reset Done!"
    
    
    'RESET
    Csn = 0
    A(1) = Cmd_reset
    Spiout A(1) , 1
    Csn = 1
    
    Wait 2
    
    
    'Controls
    Spi_write Canctrl , &B00000100
    Print "speed change done"
    
    Spi_write Cnf1 , &H07                                       '03
    Spi_write Cnf2 , &H90                                       '90
    Spi_write Cnf3 , &H02                                       '02
    
    
    
    'Do
    
    'Spi_write Txb0d0 , 55                                       'send motor speed
    
    'Csn = 0
    'A(1) = &B10000001
    'Spiout A(1) , 1
    'Csn = 1
    
     Wait 1
     Print "here we go"
    
    
     Wait 1
    
     Print "senden"
    
    
     Spi_write Txb0sidh , &HFF
     Spi_write Txb0sidl , &H00
     Spi_write Txb0dlc , &H3
    
    
     Csn = 0
    A(1) = Rts0
    Spiout A(1) , 1
    Csn = 1
    
    
    ' Loop
    
    
    
    End
    
    
    Sub Spi_write(byval Reg_add As Byte , Byval Reg_val As Byte)
    
    Print "Reg: " ; Reg_add ; " Val: " ; Reg_val
    
    A(1) = Cmd_write
    A(2) = Reg_add
    A(3) = Reg_val
    Csn = 0
    Spiout A(1) , 3
    Csn = 1
    
    End Sub

  6. #26
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    03.10.2007
    Alter
    51
    Beiträge
    128
    Hey Super,
    so langsam kommt ja wirklich was zusammen. Vielleicht bekomme ich meinen Can-Bus so jetzt doch noch zum laufen.

    Stromi: Passt dein Programm jetzt zu dem Schaltplan den Elkokiller eingestellt hat.
    Ich vermisse bei die die Tasterabfrage.
    Wenn ich dein Programm richtig verstehe, dann überträgst du doch einfach nur ein telegram über den Bus?!

    Daniel

  7. #27
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.08.2004
    Beiträge
    197
    Hallo Daniel,
    ist nicht von mir. Schaltplan kannst du ja mal vergleichen Das kreative Chaos hat ihn ja online. Hatte es mal aufgebaut, hab' es auch nicht mehr, weil "GEFRUSTET" demontiert
    Aber im Simulator geht es.
    Gibt ja auch einige schlaue Leute hier, ev. schauen die sich das an.

    Hoffentlich keine Erinnerungen an einen Mathelehrer, der pflegte immer zu sagen:
    Wenn ihr was nicht verstanden habt, fragt mich.
    Wenn man ihn dann gefragt hatte sagte er:
    SOLL ICH EUCH DAS EIN MAL EINS ERKLÄREN?
    spart "Erklärzeit" und man bleibt immer der Schlaue!

  8. #28
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    Man kann die Software-SPI verwenden, geht fast genauso gut wie die Hardware, aber halt nur fast. Sie hat den Nachteil, dass sie deutlich langsamer ist und die Codegröße in die Höhe schnellt. Der AVR hat ne Hardware-SPI und die würde ich auch raten zu verwenden, wenn die Datenübertragung auch hurtig vonstatten gehen soll

    @Michael_avr
    Wenns mit C nicht klappt und mit Bascom schon, dann verlässt Du dich scheinbar voll auf die Bascominternen Funktionen. Das ist so auch ganz ok, knifflig wirds bei Peripheriebausteinen, die nicht den Bascomfunktionen entsprechen. LCDs sind da n schönes Beispiel. Dann stehst Du nämlich genau da wo du mit C hingekommen bist. Wichtig bei der Programmierung egal welcher Sprache oder Syntax ist das Verstehen der zugrundeliegenden Logik. Sitzt die einmal ist der Rest drum herum nur Fassade. Ob die Sytax dann
    if x=y then
    endif

    oder

    if (x==y) {
    }

    ist ist Dir dann sowas von egal. Im Grunde unterscheiden sich die Programmiersprachen nur in ihrer Syntax und was halt der Interpreter oder Compiler daraus wurstelt. Obs dann C, C++, Bascom, Java, VBasic oder PHP ist macht Dir dann echt keinen Kummer mehr.
    Mit C hättest Du halt den deutlichen Vorteil auch auf anderen Bausteinen wie ARM oder AVR32 zu werkeln. Für die Bascom-Fraktion wirds dann schon eng.

    @nikolaus10
    Ich für meinen Teil lass liber die Finger weg vom KFz-Bus, das kann (!) mächtig ins Auge gehen. Hab schon genug Blech verbogen und auch verbogen bekommen, mein Bedarf daran ist gedeckt.

    Zum geposteten Code, also ich kann da auf den ersten Blick nix verkehrtes dran finden ... achso, doch evtl. Du setzt:

    Spi_write Canctrl , &B00000100 also CLK-Pin aktiv, ok. Aber den REQUOP2 lässt Du 0. Das ist Bit 7, und ist zuständig dafür das der MCP in den Configuration-Mode geht und nur dann ist CNF1 - CNF3, Filter und Maskenregister änderbar.
    Spi_write Cnf1 , &H07 '03
    Spi_write Cnf2 , &H90 '90
    Spi_write Cnf3 , &H02 '02
    geht dann nicht. (Datenblatt Seite 55-56)
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  9. #29
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.08.2004
    Beiträge
    197
    Na, das ist ja schonmal ein Prima Hinweis.
    Vielleicht hole ich ja doch nochmal die Bauteile und baue das CAN-Teil wieder auf. Damit aus den "Nicht-CAN" ein "CAN-Do" wird.
    Danke Vitis

  10. #30
    Benutzer Stammmitglied
    Registriert seit
    25.09.2007
    Ort
    Oldenburg
    Alter
    50
    Beiträge
    80
    Ich habe auch gerade nochmal neue Teile bestellt und werde sofort nächste Woche loslegen.
    Alles wird gut... Gruß Alex

Seite 3 von 18 ErsteErste 1234513 ... LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests