- 12V Akku mit 280 Ah bauen         
Seite 4 von 18 ErsteErste ... 2345614 ... LetzteLetzte
Ergebnis 31 bis 40 von 177

Thema: Funktionierendes CAN Bus Projekt entwickeln unter Bascom

  1. #31
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    26.07.2004
    Beiträge
    274
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,

    ich hab mich auch ein wenig mit CAN-Bus befasst und dem MCP. Jetzt mal ne doofe Frage :

    Wie mach ich es das ich zwei CAN-Bus-Controller (als Übersetzter) an einen AVR häng?

    Es geht darum :

    Ich hab ein Bordcomputer welcher an den CAN-Bus gehängt werden kann um Daten wie Drehzahl etc abzufragen. Da aber im BUS keine Aussentemperatur mitübertragen wird (aber der Bordcomputer sie anzeigen kann) wollte ich ein Zwischenmodul basteln welches einen A-Tempsensor abfrägt und und in den CAN-Bus (richtung BC) einschleift.

    Wie müsste ich soetwas anstellen?

    Grüße
    Alex

  2. #32
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.08.2004
    Beiträge
    197
    @Alex
    hast du diesen Bordcomputer in Bascom programmiert?
    Gehe mal davon aus, sonst würdest du ja nicht im Bascom-Forum landen, kannst du den Code mal hier reinstellen?

  3. #33
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    26.07.2004
    Beiträge
    274
    Hi Stromi,

    nein hab ich nicht. Ich hab den von nem Bekannten. Sonst würde ich den Code so anpassen das ein TempSensor abgefragt werden kann.
    Den Adapter würde ich aber gerne in Bascom schreiben.

  4. #34
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    03.10.2007
    Alter
    51
    Beiträge
    128
    Hallo,

    ich habe mal ein paar grundsätzliche Frage zum Anschluss des MCP2515!
    Wenn ich über den ISP auf den CAN zugreife und damit eine eigene Beschaltung vornehme, wie kann ich diesen dann in Zukunft zum Programmieren nehmen?
    Der AVR wertet doch ständig die Informationen des Busses aus. Dadurch kann es doch zu erheblichen Verzögerungen im Programm kommen!?
    Ist es richtig dass der Atmega 8 über einen Interrupt vom MCP2515 angesprochen wird?

    Ich bin echt froh dass wir diesmal offensichtlich eine funktionierende Schaltung hinbekommen!
    Daniel =D>

  5. #35
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    @Duesentrieb:
    Der ISP ist ja nur in Funktion wenn der Reset low gezogen wird (vom Programmierdongle). Ansonsten ist der AVR im normalen Arbeitsmodus und dann ist die ISP ne SPI-Schnittstelle. kommt sich also nicht direkt ins Gehege ... mal abgesehen vom Verify. Da kommts dann tatsächlich zu Differenzen beim Flashen. Nicht darüber wundern, einfach ignorieren

    @Alex20q90
    Mehr als einen MCP? ... naja, Du kannst natürlich x MCP anhängen, indem Du diese über Software-SPI benutzt. Dann kannst Du soviele anhängen wie Du Port-Pins zur Verfügung hast. Bascom unterstützt zwar meines Wissens nach nur eine Software SPI, aber die kannst Du recht einfach zu Fuß über Bitschupserei und Pingewackel emulieren.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  6. #36
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    03.10.2007
    Alter
    51
    Beiträge
    128
    Danke Vitis! D.h. der CAN-Controller wertet das Protokoll aus und gibt bei Bedarf einen Interrupt an den AVR.
    Welche Empfängeradresse muss ich setzen um alle Nachrichten des Busses an den AVR weitergeleitet zu bekommen?
    Damit würde ich doch dann testen können ob und was über den Bus geht (ein Oszi habe ich leider noch nicht)

    Übrigens, programmieren kann ich nach der Schaltung, die hier auf der ersten Seite vorgestellt wurde, nur noch wenn ich den CAN Controller rausziehe!

  7. #37
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    Ja, habs schon gesehen, der Reset in der Schaltung geht auf den Reset vom ISP. Ist nicht gut. Den Reset vom MCP würd ich entweder per Pullup fest
    legen oder auf nem Pin vom AVR, aber auch da nen Pullup mit dran.
    Alle Nachrichten bekommst du mit ID 0 (sprich Null)

    EDIT: Für solche Geschichten rate ich dringend zur Anschaffung eines Oszilloskopes !!! Das erspart zig Stunden Debuggen.
    N Speicheroszi währ optimal, aber auch mit nem analogen kann man
    schon sehr viel sehen. Beispielsweise ob der Oszillator schwingt, oder
    auf dem CLK-Pin was kommt etc.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  8. #38
    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  

  9. #39
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.08.2004
    Beiträge
    197
    Hast du denn den Toogle und Print effekt?`
    In der Schaltung würde ich den Reset vom CAN-Controller noch mit einem Pullup versehen.
    Ich sollte mir doch mal die Hardware bestellen, es geht ja hier doch weiter

  10. #40
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    der Reset vom ISP geht laut Schaltung nicht auf den Reset vom AVR.
    Dafür in den MCP, entweder stimmt Dein Plan nicht mit Deinem
    Aufbau überein oder Du drückst beim Proggen jedesmal den Reset-Button?
    Ist nicht so elegant, aber das hab ich ja schonmal geschrieben.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

Seite 4 von 18 ErsteErste ... 2345614 ... LetzteLetzte

Berechtigungen

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

12V Akku bauen