Hallo

Gleich vorweg die Warnung: Dieser Beitrag ist nur für die wirklich harten Kamera-Fans geeignet.

Zur Zeit versuche ich die Kamera auch mit Bascom in den Griff zu bekommen. Das klappt auch ganz gut:



Basis ist der eigentlich schon getestete Code für den RP6. Wie üblich hangelt sich der Code an den Syncs zum Bildanfang und dann zur Zielzeile, in meinem Programm zur 50. Zeile. Dann wird laufend geprüft, ob die Helligkeit größer einer bestimmten Schwelle ist. Die Anzahl der Prüfungen wird mitgezählt und das Ergebnis ist dann der Wert für die Position der Kante der Linie:

Code:
   Do                                                       ' Auf Bildanfang warten
   B = 0
      While Adch > 30                                       ' solange kein sync
      Wend
      While Adch < 50                                       ' solange sync
         Incr B                                             ' syncs zählen
      Wend
   Loop Until B > 40                                        ' mehr als 40 bedeutet Bildanfang
   B = 50                                                   ' die zu lesende Zeile
   While B > 0                                              ' Zeilen zählen
      While Adch > 30                                       ' solange kein sync
      Wend
      While Adch < 50                                       ' solange sync
      Wend
      Decr B
   Wend                                                     ' Zeile gefunden
   B = 0
   While Adch > 65                                          ' Hell/Dunkel-Schwelle
     Incr B                                                 ' warten und zählen bis Schwellwert erreicht wird
   Wend
   Linie = B                                                ' Rückgabewert kopieren
Wichtig ist nun diese kleine und eigentlich unscheinbare Funktion:
Code:
   B = 0
   While Adch > 65                                          ' Hell/Dunkel-Schwelle
     Incr B                                                 ' warten und zählen bis Schwellwert erreicht wird
   Wend
Was mache ich da? Der Pegel des Videosignals in ADCH ist beim Sync deutlich unter 30, alles was größer als 50 ist, wird als Bildinformation interpretiert. Alle Werte über der Schwelle von 65 werden als "Hell" gewertet, ein Wert unter der Schwelle bedeutet die Kante der Linie ist gefunden.

Eigentlich hätte ich nun erwartet, dass bei einem 8MHz-RISC-Kontroller der Zähler sofort in die Höhe schießt, denn die Ausführung der kleinen Scheife dauert nur ein paar Takte. Dem ist aber nicht so! Wenn ich mit Adch > 50, quasi alles was nicht Syncpegel ist, als Bildbereich gelten lassen, komme ich auf Zählerstände von maximal 27. Das ist auch das, was man im Video oben sieht und hört: Wenn der Linienwert >26 ist wird keine Linie erkannt, weil sie außerhalb des Sichtbereichs der Kamera ist. Aber warum ist der Wert so unerwartet niedrig? Ich vermute, Bascom wartet intern bis der ADC mit der Wandlung fertig ist bevor der Wert von ADCH gelesen werden kann. Das würde also 26 echte Positionen bedeuten, was allerdings zu den in C ermittelten maximalen 16 nicht ganz passt. Hier muss man noch etwas weiter forschen, aber ich schweife auch ab....

Wirklich spannend ist nun folgendes: Wenn man die Schwelle nicht als absoluten Wert angibt sondern als Variable, dann verändern sich die gemessenen Werte:

Dim Schwelle As Byte

...
Adch > Schwelle
...

So komme ich nur noch auf Maximalwerte von ca. 23! Irgendwas an der Art der Zuweisung scheint so länger zu dauern als in der Variante mit Konstanten. Sehr seltsam. Was Basom da übersetzt sollte man mal disassemblieren.

Gruß

mic