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 :)
Druckbare Version
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 :)
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
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!
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.
o.k. so etwas habe ich mir gedacht.
wo müsste ich das tx0 einbauen?
dann springt er in die einzelen bufferCode: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
z.B.
wieso sind das eigentlich 3 Buffer?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
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?
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?
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 ;)
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
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.