Forum: Mikrocontroller und Digitale Elektronik mittles ATmega VISCA "hex Werte" empfangen und auswerten


von Ch S. (spelli)


Lesenswert?

Hallo,

ich möchte folgendes Vorhaben umsetzen:

Ein Videorekorder kann per remote Zugriff an die Kamera "Sony EVI D70" 
einen VISCA Befehl im Format "81 01 04 38 02 FF" schicken (Link zum 
Manual: http://www.norbain.co.uk/downloads/manuals/evi-d70%28op%29.pdf).

Nun möchte ich aber andere Dinge tun und Ausgänge schalten, wenn 
bestimmte hex-Werte übermittelt werden.

Ich habe mir das so in etwa vorgestellt:
1
Dim Eingang As Byte       ' Empfangenes Byte
2
Do
3
  If Usr.rxc = 1 Then
4
    Eingang = UDR         ' Byte aus Empfangsregister lesen
5
                          ' RXC zurücksetzen
6
    Select Case Eingang
7
      Case 97             ' Befehl a gesendet
8
        PortB.0 = 1       ' PortB.0 an
9
      Case 65             ' Befehl A gesendet
10
        PortB.0 = 0       ' PortB.0 aus
11
      Case 117            ' Befehl u gesendet
12
        PortB = 255       ' PortB alle an
13
      Case 85             ' Befehl U gesendet
14
        PortB = 0         ' PortB alle aus
15
      Case Else
16
        Print "Unbekannter Befehl"
17
    End Select
18
  End If
19
Loop
20
End

Nur wie bringe ich diese hex-Kette zustande, da auch der Fall eintreten 
könnte, dass mehrere Ketten aneinandergereiht ankommen könnten...

Vielleicht hat jmd. ähnliches schon einmal gemacht und kann zumindest 
einen Tip geben!?

Danke
Christoph

von Helfer (Gast)


Lesenswert?

Bei "81 01 04 38 02 FF" kommen sechs Zeichen. Deine Routine wertet aber 
sofort jedes einzelne Zeichen aus.

IMHO solltest du mehrere Zeichen sammeln, bis ein Kommando fertig ist 
und dann das Kommando auswerten.

Für mich sieht es im Manual so aus, dass es eine Maximallänge der 
Kommandos gibt und jedes Kommando mit FF abgeschlossen ist.

Diese Info kannst du beim Zeichensammeln benutzen.

Die Schreibweise für hexadezimale Darstellung von Zeichen und die 
Verarbeitung von Hexzeichen innerhabl von Strings in BASIC ist dir 
bekannt?

von Ch S. (spelli)


Lesenswert?

Hallo!

Ja, Befehle werden mit FF abgeschlossen. Die Routine ist das einige, was 
ich gefunden habe und wodran ich mich langhangeln wollte...

Die Befehle haben unterschiedliche Längen. Ich bin völlig frei in der 
Wahl der Befehle!

Grds. könnte ich auch nur ein einzelnes Zeichen verwenden..

Ich möchte anhand von mir frei wählbaren Befehlen (die Videorekorder 
senden eben hex-Werte - ich kann die aber frei in einem Skript 
hinterlegen).

Passender wäre es, wenn ich gleiche Befehle eben wie in dem manual 
beschrieben verwenden könnte...

> Die Schreibweise für hexadezimale Darstellung von Zeichen und die
> Verarbeitung von Hexzeichen innerhabl von Strings in BASIC ist dir
> bekannt?

Da bin ich noch nicht hinter gekommen. Mir soll ja auch keiner was 
programmieren. Ich würde mich über einen Tip freuen.

Danke,
Christoph

von Helfer (Gast)


Lesenswert?

Verstehe ich nicht.

Willst du statt der "Sony EVI D70" Kamera etwas eigenes anschliessen und 
die vom Videorekorder gesendeten (eigentlich für die Kamera gedachten 
Befehle) mit eigener Hardware für etwas anderes nutzen?

oder

Willst du dem Videorekorder zusätzliche, selbstdefinierte Befehle bei 
bringen?

>> Die Schreibweise für hexadezimale Darstellung von Zeichen und die
>> Verarbeitung von Hexzeichen innerhabl von Strings in BASIC ist dir
>> bekannt?
>
> Da bin ich noch nicht hinter gekommen. Mir soll ja auch keiner was
> programmieren. Ich würde mich über einen Tip freuen.

Das ist grundsätzliche BASIC Programmierung. Das sollte sich mit einem 
BASIC Buch, dem BASIC Manual und Hilfe von BASIC Usern beheben lassen.

von Ch S. (spelli)


Lesenswert?

Ja, ich möchte die von dem Videorekorder gesendeten Befehle mit eigener 
Hardware für etwas anderes Nutzen.

Die Hex Werte können daher auch eigentlich aus einem Zeichen bestehen!

Das Kamera Manual habe ich als Erklärung herangezogen bzw. um die 
Befehle darzustellen.

Da ich aber die Befehle in einem Skript für den Videorekorder selbst 
festlege kann das ja auch problemlos nur ein Zeichen sein....

Also Videorekorder sendet einen Befehl, den ich selbst vorgebe und der 
dann vom uC umgesetzt wird; Ausgang schalten, Servo etc. ...

Danke, Christoph

von Ch S. (spelli)


Lesenswert?

Hallo,

soweit bekomme ichs hin. Das gesendete Hex-Zeichen bewegt den Servo.

Jetzt habe ich aber ein Problem mit dem 3. "Case-Ablauf". Der hakt 
irgendwie...

1
$regfile = "m8def.dat"
2
$crystal = 4000000
3
$baud = 9600
4
5
6
Led Alias Portd.7
7
8
Config Servos = 1 , Servo1 = Portd.5 , Reload = 10
9
10
Config Led = Output
11
Config Portd.5 = Output
12
13
Enable Interrupts
14
15
Dim Com1 As Byte
16
Dim Winkel As Byte
17
Winkel = 70
18
Servo(1) = Winkel
19
20
Do
21
  If Usr.rxc = 1 Then
22
    Com1 = Udr                                              ' Byte aus Empfangsregister lesen
23
                                                            ' RXC zurücksetzen
24
    Select Case Com1
25
26
      Case &H04 And Winkel >= 30                            'links
27
       Decr Winkel                                          'um 1 verkleinern
28
       Servo(1) = Winkel
29
       Led = 1
30
       Waitms 50
31
       Led = 0
32
33
      Case &H06 And Winkel <= 110                           'rechts
34
       Incr Winkel                                          'um 1 erhöhen
35
       Servo(1) = Winkel
36
       Led = 1
37
       Waitms 50
38
       Led = 0
39
40
      Case &H44
41
       Winkel = 70
42
       Led = 1
43
       Waitms 50
44
       Led = 0
45
46
      Case Else
47
       Led = 0
48
49
50
    End Select
51
  End If
52
Loop
53
End

von Karl H. (kbuchegg)


Lesenswert?

ein waitms ist fast immer müll. vor allen Dingen dann, wenn Gefahr 
besteht, dass der µC ein per UART übertragenes Zeichen nicht mitkriegt, 
weil er in der Zwischenzeit mit Warten beschäftigt war.

von Ch S. (spelli)


Lesenswert?

Hallo kbuchegg,

dass klingt plausibel... Könntest du einen Tip bzgl. einer Alternative 
geben.. Wahrscheinlich über einen Timer..?

Aber die 50 ms dachte ich würden zumindest zwischen den beiden oberen 
Fällen eine nötige Pause einbringen, bis der Servo seine Position 
verändert hat...

von Karl H. (kbuchegg)


Lesenswert?

Ch Sp schrieb:
> Hallo kbuchegg,
>
> dass klingt plausibel... Könntest du einen Tip bzgl. einer Alternative
> geben.. Wahrscheinlich über einen Timer..?
>
> Aber die 50 ms dachte ich würden zumindest zwischen den beiden oberen
> Fällen eine nötige Pause einbringen, bis der Servo seine Position
> verändert hat...

Ich weiß ja nicht, was du da eigentlich steuerst. Aber die Ansteuerung 
des Servos kann den Servowert durchaus schon wieder verändern, so lange 
das Servo noch unterwegs ist. Die muss nicht warten, bis das Servo seine 
Position erreicht hat.

von Ch S. (spelli)


Lesenswert?

Ich habe einen Videorekorder (dort kann ich in einem Script einer Taste 
einen Wert/Zeichen in diesem Fall ein Hexwert zuordnen), der an den 
ATmega8 einen Hexwert sendet.
Aufgrund dieses Hexwertes soll etwas passieren. Beispielsweise ein Servo 
gesteuert (Schwenk-Neiger für feste Kamera) oder Ausgang geschaltet 
werden etc.

Nun habe ich festgestellt, dass ich das mit dem Servo (testweise nur 
"Schwenken") so hinbekommen würde.

Aber:

der dritte Case macht ärger. Möchte ich zum Beispiel eine LED 3x 
aufblinken lassen, funktioniert das nicht über die Taste, die dem 
dritten, also untersten Case zugeordnet ist....

Wohl aber: wenn ich mich schrittweise per Incr oder Decr (die Hexzeichen 
04 und 06) durch klicke, bekomme ich in der Mitte (~ Winkel 70) ein LED 
blinken...

Welchen Weg sollte ich den sonst alternativ gehen, wenn z. B. waitms 
nicht geeignet ist?

Danke,
Christoph

von Ch S. (spelli)


Lesenswert?

Habe es hinbekommen, anscheinend hat der "Fix-Wert" ein Problem 
verursacht. Am Anfang der Fall-Kette gehts...

von Ch S. (spelli)


Lesenswert?

Hallo,

ich habe es soweit hinbekommen, dass aufgrund eines einzelnen
Hex-Wertes etwas passiert (nicht mit case, sondern mit Schleifen).

Nun möchte ich meine ursprüngliche Idee, den Befehlssatz von VISCA zu 
verwenden, umsetzen!

Sprich der Wert bzw. die Werte: "01060100020301FF" bewirken ein -UP- 
bzw. verringern Winkel1 um "1".

Wie sammle ich den Befehl und vergleiche ihn dann mit 
"01060100020301FF"?

Hintergrund ist, dass der Videorekorder eine Standard-Bibliothek für 
VISCA-Befehle hat. Ich erspare mir die Verwendung einer extra von mir 
erstellen Bibliothek, wo pro Steuerbefehl nur ein hex-Wert hintelegt 
ist.

1. Problem ist, dass Com1 ein String ist. Da meckert zumindest BASCOM.

Vielen Dank,
Christoph


1
$regfile = "m8def.dat"
2
$crystal = 4000000
3
$baud = 9600
4
5
Led Alias Portd.7                                           'alias LED
6
7
Config Servos = 2 , Servo1 = Portd.5 , Servo2 = Portb.1 , Reload = 10       'Servos konfigurieren
8
9
Config Led = Output                                         'LED bzw. PortD.7 als Output
10
Config Portd.5 = Output                                     ' Servo1 als Output
11
Config Portb.1 = Output                                     ' Servo2 als Output
12
13
Enable Interrupts
14
15
Dim Eedummy As Eram Byte                                    ' erstes Byte im EEProm belegen
16
17
Dim Com1 As String * 20                                     'Variable für RS232
18
Dim Winkel1eeram As Eram Byte                               ' Winkel1 im EEProm
19
Dim Winkel1 As Byte                                         ' Arbeitsvariable Winkel1
20
Dim Winkel2eeram As Eram Byte                               ' Winkel2 im EEProm
21
Dim Winkel2 As Byte                                         'Winkel2 als Arbeitsvariable
22
23
Winkel1 = Winkel1eeram                                      ' Winkel1 aus EEProm holen
24
Winkel2 = Winkel2eeram                                      'Winkel2 aus EEProm holen
25
26
Servo(1) = Winkel1                                          ' Servo1 fahre zu Winkel1
27
Servo(2) = Winkel2                                          ' Servo2 fahre zu Winkel2
28
29
Print "RS232c v.4"                                          ' Versionsinfo
30
31
32
Do
33
  If Usr.rxc = 1 Then                                       ' Byte aus Empfangsregister lesen
34
    Com1 = Udr
35
36
  Select Case Com1
37
38
      Print "VISCA empfangen:" ; Com1                       'eingelesenen Wert wiedergeben
39
40
      Case &H06 And Winkel1 >= 40                           'S1 links AM BESTEN WÄRE DIE VERABREITUNG VON WERT: "01060100020301FF" !!!
41
       Decr Winkel1                                         'um 1 verkleinern
42
       Servo(1) = Winkel1
43
       Winkel1eeram = Winkel1
44
       Led = 1
45
       Waitms 50
46
       Led = 0
47
48
      Case &H04 And Winkel1 <= 100                          'S1 rechts
49
       Incr Winkel1                                         'um 1 erhöhen
50
       Servo(1) = Winkel1
51
       Winkel1eeram = Winkel1
52
       Led = 1
53
       Waitms 50
54
       Led = 0
55
56
      Case &H00 And Winkel2 >= 40                           'S2 hoch
57
       Decr Winkel2                                         'um 1 verkleinern
58
       Servo(2) = Winkel2
59
       Winkel2eeram = Winkel2
60
       Led = 1
61
       Waitms 50
62
       Led = 0
63
64
      Case &H02 And Winkel2 <= 100                          'S2 runter
65
       Incr Winkel2                                         'um 1 erhöhen
66
       Servo(2) = Winkel2
67
       Winkel2eeram = Winkel2
68
       Led = 1
69
       Waitms 50
70
       Led = 0
71
72
73
      Case &H44                                             'quasi Mittelstellung, schreiben in EEProm
74
       Winkel1 = 70
75
       Servo(1) = Winkel1
76
       Winkel1eeram = Winkel1
77
       Winkel2 = 70
78
       Servo(2) = Winkel2
79
       Winkel2eeram = Winkel2
80
81
      Case Else
82
83
       Print "unbekannter Befehl"
84
85
       Led = 0
86
87
88
    End Select
89
  End If
90
Loop
91
End

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.