- Labornetzteil AliExpress         
Seite 11 von 18 ErsteErste ... 910111213 ... LetzteLetzte
Ergebnis 101 bis 110 von 177

Thema: Funktionierendes CAN Bus Projekt entwickeln unter Bascom

  1. #101
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.03.2006
    Ort
    WOB
    Beiträge
    630
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Das sieht ja eigentlich gut aus. /CS hab ich bei mir halt mit /SS verbunden und den Rest Bascom machen lassen. Aber wenn es so auch funzt, ok.

    Ist an der Takteinstellung des SPI irgendwas zu änden? Oder vielleicht was in den Fuses? Ich versuch mich mal zu erinnern, dass ich dir heute nachmittag mein Code schicke.
    Gruß Thomas \/

    Alles über AVR, PIC und CAN
    blog.cc-robotics.de

  2. #102
    Benutzer Stammmitglied
    Registriert seit
    25.09.2007
    Ort
    Oldenburg
    Alter
    50
    Beiträge
    80
    /SS könnte ich natürlich dann mal testhalber umlöten - kein Thema. Das teste ich, sobald ich Deinen Code habe - danke schonmal vorab Das ermuntert einen wieder...
    Alles wird gut... Gruß Alex

  3. #103
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.03.2006
    Ort
    WOB
    Beiträge
    630
    Jo, wenn du ein paar Seiten vorher guckst wirst du auch meine verzweifelten Versuche finden
    Ist immer schön wenn man Antworten bekommt, aber wenn das Thema sehr speziell ist gibt es kaum Leute die was sinnvolles antworten können. Außer eben welche wie ich, die genau das gemacht haben was du vor hast.

    Schau mal rein. Quarz ist am MCP (16MHz) und Pin 3 geht zum takteingang des Mega8
    Angehängte Dateien Angehängte Dateien
    Gruß Thomas \/

    Alles über AVR, PIC und CAN
    blog.cc-robotics.de

  4. #104
    Benutzer Stammmitglied
    Registriert seit
    25.09.2007
    Ort
    Oldenburg
    Alter
    50
    Beiträge
    80
    Danke, schaue ich mir an !
    Alles wird gut... Gruß Alex

  5. #105
    Benutzer Stammmitglied
    Registriert seit
    25.09.2007
    Ort
    Oldenburg
    Alter
    50
    Beiträge
    80
    HA !

    et löppt !

    Nach langem Vergleichen der Unterschiede, umlöten der /CS Leitung (um sich erstmal irrerweise auf Bascom zu verlassen) und genauer Timinganalyse habe ich es nun geschafft, den Prescaler zu ändern.

    Ich habe also die /CS mit /SS verbunden und die manuellen Befehle alle gegen spiout ersetzt. Dann ersteinmal nur einen Resetbefehl gefolgt von der Änderung des CANCTRL gesendet. Dabei fiel mir auf, daß nach dem Resetbefehl tatsächlich der Taktausgang des MCP 10µs aufhörte, d.h. der Befehl wurde verstanden. Fehler 1): Mein nächster Befehl wurde schon gesendet, während der MCP noch im Reset hing. Nach Einbau einer 20µs langen Pause sendete ich dann nacheinander die Bytes für modify, canctrl, mask und Wert - es änderte sich nichts. Dann fiel mir auf, daß Du ein ganzes Array rausschiebst und da kam es mir. Fehler 2) zwischen den einzelnen Bytes, welche zu einem Kommando gehören, wurde /CS immer wieder angehoben. Nachdem ich nun auch mit einem Array alle drei Byte hintereinander rausschiebe, bleibt /CS während der Übertragung unten und siehe da, nach dem letzten Bit ändert sich der Takt von 2 auf 16MHz !

    An dieser Stelle ersteinmal recht herzlichen Dank - nun kann ich erstmal mit der restlichen Struktur weitermachen, die Initialisierung korrekt durchführen und dann kommen sicherlich weitere Fragen. Die nächsten Tage werde ich aber wohl genug zu tun haben...

    Hier noch der entscheidende Codeschnipsel:

    Code:
    'SPI
    Config Portb.3 = Output                                     'MOSI
    Config Portb.4 = Input                                      'MISO
    Config Portb.5 = Output                                     'SCK
    Config Portb.2 = Output                                     '/SS - /CS
    
    Config Spi = Hard , Data Order = Msb , Master = Yes , Noss = 0 , Clockrate = 4
    Spiinit
    
    '*******************************************************************************
    
    Print " "
    Print "Neustart !"
    Print " "
    Print "Reset 2515..."
    Data_tmp = Cmd_reset
    Spiout Data_tmp , 1
    Waitus 20
    Spi_write_buff(1) = Cmd_write
    Spi_write_buff(2) = Canctrl
    Spi_write_buff(3) = &B00000100
    
    Spiout Spi_write_buff(1) , 3
    
    Print "done!"
    End
    Ich muss auch nochmal Vitis Recht geben, der ja zu Anfang dieses Threads sagte, man müsse selber durchblicken. Hätte ein kopierter Code auf Anhieb funktioniert, wüsste ich immernoch nicht, wie der Kram wirklich läuft. Jetzt habe ich deutlich mehr Durchblick und habe ganz sicher (mal wieder) was gelernt.
    Alles wird gut... Gruß Alex

  6. #106
    Benutzer Stammmitglied
    Registriert seit
    25.09.2007
    Ort
    Oldenburg
    Alter
    50
    Beiträge
    80
    Sodele, also schreiben klappt jetzt ganz hervorragend, ich habe den code erstmal auf das nötigste reduziert. Nachdem ich nun den Prescaler geändert habe, wollte ich das Register CANCTRL auslesen - das klappt irgendwie nicht. Muss ich dann noch irgendwie Nullen senden ? In der Help von SPIIN steht irgendwie so etwas, aber das verstehe ich nun überhaupt nicht. Jedenfalls bleibt die MISO Leitung high. Wenn ich da nochmal um einen Tip bitten dürfte ?

    Code:
    '*******************************************************************************
    '*
    '*
    '* Projekt: CAN Testboard
    '* Zielhardware: CAN Testboard V1.0
    '* Stand: 03.03.2008
    '*
    '* CAN Test10.bas
    '*
    '*******************************************************************************
    
    'Inspirationsliste
    '
    '
    
    '**** Deklarationen ************************************************************
    $hwstack = 32                                               ' default use 32 for the hardware stack
    $swstack = 8                                                'default use 10 for the SW stack
    $framesize = 24                                             'default use 40 for the frame space
    $regfile = "m8def.dat"                                      'Chipdefinition
    $crystal = 16000000                                         'Ext. crystal Osc. Speed 16Mhz
    $baud = 2400                                                'Speed COM1
    
    Declare Sub Mcpinit()
    Declare Sub Canwrite(byval Reg_add As Byte , Byval Reg_val As Byte)
    Declare Sub Canmod(byval Reg_add As Byte , Byval Reg_mask As Byte , Byval Reg_val As Byte)
    Declare Function Canread(byval Reg_add As Byte ) As Byte
    
    '**** Portinitialisierung ******************************************************
    Portb = &H00                                                'Port B hochohmig schalten
    Portc = &H00                                                'Port C hochohmig schalten
    Portd = &H00                                                'Port D hochohmig schalten
    
    Config Portb.0 = Output                                     'LED gelb
    Led_gelb Alias Portb.0
    Led_gelb = 0
    Config Portb.1 = Output                                     'LED rot
    Led_rot Alias Portb.1
    Led_rot = 0
    Config Portb.2 = Input                                      '/SS Eingang
    Config Portc = Output                                       'Aux
    Config Pind.2 = Input                                       'MCP Interrupt MCP2515 /INT
    Config Portd.4 = Output                                     'MCP_CS
    Mcp_cs Alias Portd.4
    Set Mcp_cs                                                  'low aktiv
    
    Config Portd.6 = Input                                      'Taster S1
    Portd.6 = 1                                                 'Pullup für S1
    S1 Alias Pind.6
    Config Portd.7 = Input                                      'Taster S2
    Portd.7 = 1                                                 'Pullup für S2
    S2 Alias Pind.7
    
    Led_rot = 1                                                 'Resetmerker und Zeit zum ISP Stecker abziehen ;)
    Wait 3
    Led_rot = 0
    
    
    
    '**** Variablen deklarieren ****************************************************
    Const Cmd_read = &H03                                       'Read Command
    Const Cmd_write = &H02                                      'Write Command
    Const Cmd_bitmodify = &H05                                  'Bit-modify Command
    Const Cmd_reset = &HC0                                      'Reset Command
    Const Canctrl = &H0F                                        'Control Register
    
    
    Dim Data_tmp As Byte                                        'Temp Datenbyte
    Dim Canstatus As Byte                                       'Statuswort
    
    Dim Spi_write_buff(3) As Byte                               'Sendebuffer
    Dim Spi_mod_buff(4) As Byte                                 'Modbuffer
    Dim Spi_read_buff(2) As Byte                                'empfangsbuffer
    
    
    '**** Schnittstellen konfigurieren *********************************************
    
    'SPI
    Config Portb.3 = Output                                     'MOSI
    Config Portb.4 = Input                                      'MISO
    Config Portb.5 = Output                                     'SCK
    Config Portb.2 = Output                                     '/SS - /CS
    
    Config Spi = Hard , Data Order = Msb , Master = Yes , Noss = 0 , Clockrate = 4
    Spiinit
    
    '*******************************************************************************
    
    Print " "
    Print "Neustart !"
    Print " "
    
    Print "Call mcpinit..."
    
    Call Mcpinit()
    
    Print "MCP init done!"
    
    Data_tmp = Canread(canctrl)
    Print "Canctrl=" ; Bin(data_tmp)
    
    '*******************************************************************************
    '* Hauptprogramm                                                               *
    '*******************************************************************************
    Do
    
    If S1 = 0 Then
       Led_rot = 1
       Waitms 500
       Led_rot = 0
    End If
    
    If S2 = 0 Then
       Led_rot = 1
       Waitms 500
       Led_rot = 0
    End If
    
    
    Loop
    
    '*******************************************************************************
    
    Sub Mcpinit()
       Local Can_tmp As Byte                                    'Lokale Variable
    
       Print "Reset 2515..."                                    'MCP Resetten
       Can_tmp = Cmd_reset
       Reset Mcp_cs
       Waitus 1
       Spiout Data_tmp , 1
       Waitus 1
       Set Mcp_cs
       Waitus 20                                                   'Warten bis Reset erledigt, evtl. Abfrage MCP einbauen ?
       Print "done!"
    
       Print "change prescaler..."
       Spi_write_buff(1) = Cmd_write
       Spi_write_buff(2) = Canctrl
       Spi_write_buff(3) = &B00000100                              'Prescaler auf Takt/1
       Reset Mcp_cs
       Waitus 1
       Spiout Spi_write_buff(1) , 3
       Waitus 1
       Set Mcp_cs
       Print "done!"
    End Sub
    
    Sub Canwrite(reg_add , Reg_val)                             'Subroutine "schreiben"
       Spi_write_buff(1) = Cmd_write
       Spi_write_buff(2) = Reg_add
       Spi_write_buff(3) = Reg_val
       Spiout Spi_write_buff(1) , 3
    End Sub
    
    Sub Canmod(reg_add , Reg_mask , Reg_val)
       Spi_mod_buff(1) = Cmd_bitmodify
       Spi_mod_buff(2) = Reg_add
       Spi_mod_buff(3) = Reg_mask
       Spi_mod_buff(4) = Reg_val
       Spiout Spi_mod_buff(1) , 4
    End Sub
    
    Function Canread(reg_add)
       Spi_read_buff(1) = Cmd_read
       Spi_read_buff(2) = Reg_add
       Spiout Spi_read_buff(1) , 2
       Spiin Canread , 1
    End Function
    
    End
    Alles wird gut... Gruß Alex

  7. #107
    Benutzer Stammmitglied
    Registriert seit
    15.04.2007
    Beiträge
    55
    Hallo Leute

    Habe immer RS485 benutzt, möchte auch zukünftig CAN benutzen doch habe überhaupt keine Kentnisse darüber, was muss ich zuerst lernen und wo kann ich Tutorials, einfache Bascom Beispielcode herkriegen, am liebsten auf deutsch

    Danke

    Gruss

    Sato

  8. #108
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    Basic gibts nicht auf deutsch ... gibt nur englische Syntax (Schreibweise)

    Prog (mit enlischer Basic-Syntax) siehe hier:
    https://www.roboternetz.de/phpBB2/ze...r=asc&start=44
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  9. #109
    Benutzer Stammmitglied
    Registriert seit
    25.09.2007
    Ort
    Oldenburg
    Alter
    50
    Beiträge
    80
    Aber zu meinem Problem weiß niemand was ?
    Alles wird gut... Gruß Alex

  10. #110
    Benutzer Stammmitglied
    Registriert seit
    25.09.2007
    Ort
    Oldenburg
    Alter
    50
    Beiträge
    80
    Sendet der Befehl SPIIN auch automatisch das notwendige Taktsignal ? Oder ist es dann besser, mit SPIMOVE zu arbeiten ?

    Sub Canread(reg_add)
    Spi_read_buff(1) = Cmd_read
    Spi_read_buff(2) = Reg_add
    Spiout Spi_read_buff(1) , 2

    Spi_input(1) = Spimove(data_spare) 'Spiin Spi_input(1) , 2

    End Sub

    Aber es läuft trotzdem nicht, ich empfange einfach nichts...
    Alles wird gut... Gruß Alex

Seite 11 von 18 ErsteErste ... 910111213 ... LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests