- Akku Tests und Balkonkraftwerk Speicher         
Seite 7 von 18 ErsteErste ... 5678917 ... LetzteLetzte
Ergebnis 61 bis 70 von 177

Thema: Funktionierendes CAN Bus Projekt entwickeln unter Bascom

  1. #61
    Benutzer Stammmitglied
    Registriert seit
    25.09.2007
    Ort
    Oldenburg
    Alter
    50
    Beiträge
    80
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Na, da bin ich ja mal gespannt - meine neuen PCB´s sind jetzt auch fertig und bestückt, nun muss ich nur noch Zeit finden zum programmieren, dann geht´s los
    Alles wird gut... Gruß Alex

  2. #62
    Benutzer Stammmitglied
    Registriert seit
    10.10.2007
    Beiträge
    79
    Wollt ihr vielleicht nochmal hier rein schauen? https://www.roboternetz.de/phpBB2/ze...ag.php?t=35621
    Ich mache nicht gerne Werbung für meine Threads, aber da ich sehr unzufrieden bin mit der Forenstruktur (ich denke, dass die oberen Foren am meisten frequentiert sind, aber wer schaut denn unten nach?! Fast alles lässt sich doch in Elektronik posten...) muss das mal sein...
    MFG

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

    ich habe das jetzt alles mal so nachgebaut und programmiert wie oben beschrieben.
    Funktioniert so weit auch ganz gut.
    Allerdings habe ich offensichtlich einen Fehler gemacht!

    Ich habe einen Sender und einen Empfänger.
    Sobald ich am Sender eine Information auf den Bus gebe, geht diese offensichtlich in eine Endlosschleife.
    Allerdings liegt das nicht an meinem Programm sondern offensichtlich am MCP2515.
    Kann mir jemand sagen wie ich das Senden wieder stoppen kann?

    Noch etwas konkreter:
    Das Register canintf bringt mir nach dem Senden immer eine 27 und müsste eigentlich 0 sein.
    Die Nachricht wurde aber richtig übertragen!

  4. #64
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    die Endlosschleifer kommt denk ich durch das OSM-Bit.
    Die 27 = binär 00011011
    Beim Canintf bedeutet dies, das ausser den error-flags nur der tx0 flag
    fehlt.
    stellt sich die frage ob vor dem senden die flags alle gelöscht waren.
    dies macht der mcp nicht alleine, sondern muss vom mcu aktiv getan
    werden.
    die nächste frage ist dann, ob du über tx0 sendest und ob dein
    empfänger den empfang quitiert. wenn du nicht im osm sendest und
    es kommt keine quittierung, dann macht der sender immer so weiter.

    Abbfrechen kannst Du auch manuell über:
    Clearing the TxBnCTRL.TXREQ bit
    while it is set, or setting the CANCTRL.
    ABAT bit before the message
    has started transmission, will abort
    the message.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  5. #65
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    03.10.2007
    Alter
    51
    Beiträge
    128
    o.k. so etwas habe ich mir gedacht.

    wo müsste ich das tx0 einbauen?

    Code:
    Mcp2515_read_register Txb0ctrl                              '&HA0
    'Print "SPI_read_Status0: " ; Canin
    If Canin.3 = 0 Then Gosub Send_buffer0
    Mcp2515_read_register Txb1ctrl                              '&HA0
    'Print "SPI_read_Status1: " ; Canin
    If Canin.3 = 0 Then Gosub Send_buffer1
    Mcp2515_read_register Txb2ctrl                              '&HA0
    'Print "SPI_read_Status2: " ; Canin
    If Canin.3 = 0 Then Gosub Send_buffer2
    dann springt er in die einzelen buffer

    z.B.
    Code:
    '---------  senden mit Buffer 0
    Send_buffer0:
     Hilf1 = Id / 8
     Idh = Hilf1
     Hilf1 = Idh * 8
     Hilf1 = Id - Hilf1
     Hilf1 = Hilf1 * 32
     Idl = Hilf1
      'Priorität einstellen bit 1-0 11=>höchste / 10=>hoch
      '                             01=>niedrig / 00=> niedrigste
      Mcp2515_bitmodify Txb0ctrl , &B00000011 , &B00000011
      'Standard ID einstellen
      Mcp2515_write_register Txb0sidh , Idh
      Mcp2515_write_register Txb0sidl , Idl
      'Nachrichtenlänge einstellen (DFL)
      Mcp2515_write_register Txb0dlc , Dfl
       'Daten
      Mcp2515_write_register Txb0d0 , Db0(1)
      Mcp2515_write_register Txb0d1 , Db0(2)
      Mcp2515_write_register Txb0d2 , Db0(3)
      Mcp2515_write_register Txb0d3 , Db0(4)
      Mcp2515_write_register Txb0d4 , Db0(5)
      Mcp2515_write_register Txb0d5 , Db0(6)
      Mcp2515_write_register Txb0d6 , Db0(7)
      Mcp2515_write_register Txb0d7 , Db0(8)
      'nachricht versenden
      Reset Css
       Waitus 10
       Mcphilf = Spi_rts0
       Spdr = Mcphilf
       Do
       Loop Until Spsr.spif = 1
       Waitus 10
     Set Css
     'Print "gesendet Buffer-0"
     Waitms 50
    
    
      Return
    wieso sind das eigentlich 3 Buffer?

  6. #66
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    03.10.2007
    Alter
    51
    Beiträge
    128
    ist keiner da der mir sagen kann wie ich das Flag löschen kann

    müsste doch normal mit

    Mcp2515_read_register Txb0ctrl.txreq = 0

    gehen. - Tuts aber nicht!

    Genügt es eigentlich wenn ich das bit am Anfang lösche oder muss ich es nach jedem Senden löshen?

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

    ist keiner da der mir bei meinem Problem helfen kann?
    Ich ahbe doch nur den Code von feitzi bei mir eingebaut.

    Läuft des Programm bei allen anderen auch ohne Quittung und ohne dieses Flag?

  8. #68
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    lies Dir doch mal genau Deine Anweisung durch:

    Mcp2515_read_register Txb0ctrl.txreq = 0

    Du willst doch ein Bit schreiben, oder nicht?
    Es würde sich da die Methode Bit modify anbieten, oder?

    Und genau deshalb halt ich nicht viel davon
    fertigen Code zu publizieren
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  9. #69
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    03.10.2007
    Alter
    51
    Beiträge
    128
    ja, hast ja recht. Andererseits möchte ich ja mein Geld nicht mit Programmieren verdienen sondern nur die ein oder andere Idee umsetzen.
    Wenn ich mich in jedes Programm so tief rein hängen müsste, könnte ich es auch gleich bleiben lassen.

    Aber genau aus diesem Grund gibt es ja solche Foren in denen die Profis die Leien unterstützen

  10. #70
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    Also zum Unterbrechen einer Übertragung schreibt das Datenblatt:
    3.6 Aborting Transmission
    The MCU can request to abort a message in a specific
    message buffer by clearing the associated
    TXBnCTRL.TXREQ bit.
    In addition, all pending messages can be requested to
    be aborted by setting the CANCTRL.ABAT bit. This bit
    MUST be reset (typically after the TXREQ bits have
    been verified to be cleared) to continue transmitting
    messages. The CANCTRL.ABTF flag will only be set if
    the abort was requested via the CANCTRL.ABAT bit.
    Aborting a message by resetting the TXREQ bit does
    NOT cause the ABTF bit to be set.

    also, um alle Übertragungen zu unterbrechen
    erstmal TXREQ auf 0 setzen, anschließend
    den ABAT bit auch auf 1 schreiben.
    Um wieder zu senden dann wieder den ABAT auf
    0 setzen.
    Das sollte es schon gewesen sein.

    edit:
    Eine weitere Schwäche des Codes ist dann noch hier:
    Mcpempfang:
    Print "Empfangen"
    Mcp2515_read_register Canintf 'Spi_rx_status
    Canstat = Canin
    Print "CANINTF: " ; Canstat
    If Canstat.0 = 1 Then Gosub Mcp_read_buffer0
    If Canstat.1 = 1 Then Gosub Mcp_read_buffer1
    Return

    Es wird als Intquelle nur der Buffer0 und der Buffer1 ausgewertet,
    wenn ein Fehler auftritt wird der glatt ignoriert.
    Kann zwar gut gehen, aber bei größeren Projekten wirds dann
    bei debuggen schon "interessant"

    ich schlage folgende Ergänzug vor:

    if Canstat.7 = 1 then
    print "MERRF-Error"
    endif
    if Canstat.5 = 1 then
    print "ERRIF-Error"
    endif
    sinnvoll währ dann klaro auch die Ints zu enablen:
    Mcp2515_write_register Caninte , &B10100011

    Dann hat der Code noch n kleines Problemchen.
    Hier wird zwar:
    'Device zurück in den normalen Modus versetzen
    Mcp2515_bitmodify Canctrl , &B11100000 , &B00000000

    aber in den Modify-Modus wird der Canctrl zu Anfang nicht gebracht:
    Mcp2515_bitmodify Canctrl , &B11100000 , &B10000000 ' = Set Configuration mode
    Ausserdem hat man in diesem Register auch den OSM auf Bit 3,
    wenn man den aktiviert wird jede Message nur einmal gesendet, also dann:

    'Device zurück in den normalen Modus versetzen
    Mcp2515_bitmodify Canctrl , &B11101000 , &B00001000

    PS:
    >Wenn ich mich in jedes Programm so tief rein hängen müsste, könnte ich es auch gleich bleiben lassen.
    Nein, Du sparst Zeit, indem Du Dich selbst in den Code einarbeitest, weil Du dann kapiert hast was läuft und dies in anderen Projekten dann übertragen kannst. Du hast ergo was gelernt.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

Seite 7 von 18 ErsteErste ... 5678917 ... LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests