Kampi
24.06.2012, 14:52
Hallo Forum,
ich programmiere gerade etwas meinen CAN-Bus und bin dabei auf ein kleines Hindernis gestoßen.
Ich habe dieses Unterprogramm welches ein Datenpaket verschicken soll:
Sub Send_can(byval Daten(8) As Byte , Byval Tx_identifier As Long , Byval Ex_id_enable As Byte)
Local Tx_low As Integer
Local Tx_high As Integer
Local Id_high As Byte
Local Id_low As Byte
'Prüfen ob die Nachricht mit einem 29-Bit Identifier versendet werden soll oder nicht
If Ex_id_enable = 0 Then
'Prüfen ob der Identifier die richtige Länge hat
If Tx_identifier > 2047 Then
Print "Identifier beträgt " ; Tx_identifier ; " und ist damit zu groß. Maximaler Wert ist 2047!"
Error = 1
Return
Else
'Identifier einstellen
Tx_low = Tx_identifier 'Speichert den Filter in zwei Variablen und schiebt
Tx_high = Tx_identifier 'den Wert um 5 Stellen nach rechts um die drei
Shift Tx_low , Left , 5 ' niedrigsten Bits zu gewinnen. Dasselbe passiert für
Shift Tx_high , Right , 3 'die acht höchsten Bits. Anschließend werden die Werte
'in die passenden Register geschrieben.
Id_high = Tx_high
Id_low = Tx_low
'ID in die ID-Register schreiben
Write_register Txb0sidh , Id_high
Write_register Txb0sidl , Id_low
'Daten in die Datenregister schreiben
Write_register Txb0dlc , 8
Write_register Txb0d0 , Daten(1)
Write_register Txb0d1 , Daten(2)
Write_register Txb0d2 , Daten(3)
Write_register Txb0d3 , Daten(4)
Write_register Txb0d4 , Daten(5)
Write_register Txb0d5 , Daten(6)
Write_register Txb0d6 , Daten(7)
Write_register Txb0d7 , Daten(8)
Reset Cs
Spdr = Spi_rts0 'Übertragung auslösen
Do
Loop Until Spsr.spif = 1
Set Cs
End If
Elseif Ex_id_enable = 1 Then
Else
Print "Error. Unbekannter Identifier!"
Error = 2
Return
End If
End Sub
Wie zu erkennen ist, ist oben in dem Funktionskopf eine Variable mit dem Namen "Daten" als 8 Byte Array angelegt worde.
Meine Grundidee war es, dass ich ein 8-Byte Array in die Funktion übergebe und das von diesem 8-Byte Array jede Stelle in ein anderes Register zum Senden kommt (so wie es in dem Unterprogramm bereits gemacht worden ist).
Sprich ich übergebe das Array in das Unterprogramm ein 8-Byte Array und er speichert das Array dann in der lokalen Variable "Daten" ab, welche ebenfalls ein Array ist.
Nur das Übergeben klappt bei mir noch nicht so ganz....wie rufe ich das Unterprogramm auf und übergebe das komplette Array, sodass es versendet werden kann?
Wenn ich schreibe
Send_can Test(2) , 5 , 0
wird ja nur der Wert welcher an Stelle 2 des Arrays Test steht, übergeben.
Es soll aber der komplette Inhalt von Test übergeben werden und dann richtig in dem Unterprogramm gespeichert werden.
Sprich Stelle 1 von "Test" an Stelle 1 von "Daten", Stelle 2 von "Test" an Stelle 2 von "Daten" usw.
Kann mir da jemand einen kleinen Denkanstoß geben?
Danke schonmals :)
ich programmiere gerade etwas meinen CAN-Bus und bin dabei auf ein kleines Hindernis gestoßen.
Ich habe dieses Unterprogramm welches ein Datenpaket verschicken soll:
Sub Send_can(byval Daten(8) As Byte , Byval Tx_identifier As Long , Byval Ex_id_enable As Byte)
Local Tx_low As Integer
Local Tx_high As Integer
Local Id_high As Byte
Local Id_low As Byte
'Prüfen ob die Nachricht mit einem 29-Bit Identifier versendet werden soll oder nicht
If Ex_id_enable = 0 Then
'Prüfen ob der Identifier die richtige Länge hat
If Tx_identifier > 2047 Then
Print "Identifier beträgt " ; Tx_identifier ; " und ist damit zu groß. Maximaler Wert ist 2047!"
Error = 1
Return
Else
'Identifier einstellen
Tx_low = Tx_identifier 'Speichert den Filter in zwei Variablen und schiebt
Tx_high = Tx_identifier 'den Wert um 5 Stellen nach rechts um die drei
Shift Tx_low , Left , 5 ' niedrigsten Bits zu gewinnen. Dasselbe passiert für
Shift Tx_high , Right , 3 'die acht höchsten Bits. Anschließend werden die Werte
'in die passenden Register geschrieben.
Id_high = Tx_high
Id_low = Tx_low
'ID in die ID-Register schreiben
Write_register Txb0sidh , Id_high
Write_register Txb0sidl , Id_low
'Daten in die Datenregister schreiben
Write_register Txb0dlc , 8
Write_register Txb0d0 , Daten(1)
Write_register Txb0d1 , Daten(2)
Write_register Txb0d2 , Daten(3)
Write_register Txb0d3 , Daten(4)
Write_register Txb0d4 , Daten(5)
Write_register Txb0d5 , Daten(6)
Write_register Txb0d6 , Daten(7)
Write_register Txb0d7 , Daten(8)
Reset Cs
Spdr = Spi_rts0 'Übertragung auslösen
Do
Loop Until Spsr.spif = 1
Set Cs
End If
Elseif Ex_id_enable = 1 Then
Else
Print "Error. Unbekannter Identifier!"
Error = 2
Return
End If
End Sub
Wie zu erkennen ist, ist oben in dem Funktionskopf eine Variable mit dem Namen "Daten" als 8 Byte Array angelegt worde.
Meine Grundidee war es, dass ich ein 8-Byte Array in die Funktion übergebe und das von diesem 8-Byte Array jede Stelle in ein anderes Register zum Senden kommt (so wie es in dem Unterprogramm bereits gemacht worden ist).
Sprich ich übergebe das Array in das Unterprogramm ein 8-Byte Array und er speichert das Array dann in der lokalen Variable "Daten" ab, welche ebenfalls ein Array ist.
Nur das Übergeben klappt bei mir noch nicht so ganz....wie rufe ich das Unterprogramm auf und übergebe das komplette Array, sodass es versendet werden kann?
Wenn ich schreibe
Send_can Test(2) , 5 , 0
wird ja nur der Wert welcher an Stelle 2 des Arrays Test steht, übergeben.
Es soll aber der komplette Inhalt von Test übergeben werden und dann richtig in dem Unterprogramm gespeichert werden.
Sprich Stelle 1 von "Test" an Stelle 1 von "Daten", Stelle 2 von "Test" an Stelle 2 von "Daten" usw.
Kann mir da jemand einen kleinen Denkanstoß geben?
Danke schonmals :)