Hallo
Da ich mal wieder an meiner ewigen Kamerabaustelle arbeite, kann ich nun quasi die Version 2.0 der Minimalkamera als Beta vorstellen.
Bisher hatten wir das Problem, dass wir zwar die Syncs gefunden haben, aber die Flanken wurden nicht richtig erkannt. Deshalb "zitterte" der Zeilenanfang beim Einlesen der Bilddaten. Das sieht man deutlich bei den HiRes-Bildern:
Bild hier Bild hier Bild hier
(Bilder aus https://www.roboternetz.de/community...l=1#post458253)
Nun bin ich schon vor einiger Zeit im Datenblatt der AVRs über diesen Satz in der Beschreibung des analogen Komparators (Analog Comparator) gestolpert:
The output of the Analog Comparator is synchronized and then directly connected to
ACO. The synchronization introduces a delay of 1 - 2 clock cycles.
Frei übersetzt: Der Status der Komparators wird innerhalb von 1 bis 2 Taktzyklen (!) im ACO-Bit dargestellt.
Blöderweise sind aber die Pins des Komparators bei meinen Fertigrobotern schon belegt, deshalb habe ich diesen Ansatz bisher nicht weiterverfolgt. Eher zufällig ist mir nun aufgefallen, dass mein asuro-probot genau diese Pins nicht verwendet, wenn ich die Sensorplatine nicht einstecke. Dadurch kann ich nun AIN0 und AIN1 nutzen. Als zusätzliche Hardware erzeuge ich mit einem 10k-Poti eine einstellbare Spannung an AN0 als Schwelle für den Sync-Pegel, die Erweiterung der Software beschränkt sich auf das Umschalten zwischen ADC- und AC-Betrieb und der geänderten Sync-Erkennung:
Code:
Sub Readline(byval Zeile As Word)
Local Znr As Word
' AC einschalten Vergleich zwischen AIN0 (PD6) und ADC-Kanal 4 (PC4)
Reset Adcsr.aden ' ADC dissable
Reset Acsr.acd 'enable analog comparator ACSR bit 7 = 0
Portd.4 = Acsr.aco ' Status zeigen: Warten auf Bildstart
Do ' Auf Bildanfang warten
Znr = 0
While Acsr.aco = 0 ' solange kein sync (PC4 > PD6)
Wend
While Acsr.aco = 1 ' PC4 < PD6 = Sync
Incr Znr ' syncs zählen
Wend
Loop Until Znr > 60 ' mehr als 60 (mit AC!) bedeutet Bildanfang
Znr = Zeile ' die zu lesende Zeile
While Znr > 1 ' Zeilen zählen
While Acsr.aco = 0 ' solange kein sync
Wend
While Acsr.aco = 1 ' solange sync
Wend
Decr Znr ' eine Zeile vor dem Ziel...
Wend
While Acsr.aco = 0 ' solange kein sync
Wend
' ADC einschalten
Set Adcsr.aden ' ADC Enable
Set Adcsr.adsc ' ADC Start Conversion
Portd.4 = Acsr.aco ' Status zeigen: Zeile gefunden
Set Adcsr.adif ' ADIF-Bit rücksetzen !!! Nur schreibend zugreifen !!!
While Adcsr.adif = 0 ' warten bis ADC fertig mit Wandeln
Wend
Znr = Adch ' erste Lesung ist noch Sync
Set Adcsr.adif
While Adcsr.adif = 0
Wend
Linienspeicher(01) = Adch
Set Adcsr.adif
While Adcsr.adif = 0
Wend
Linienspeicher(02) = Adch
Set Adcsr.adif
While Adcsr.adif = 0
Wend
Linienspeicher(03) = Adch
Set Adcsr.adif
While Adcsr.adif = 0
Wend
Linienspeicher(04) = Adch
Set Adcsr.adif
While Adcsr.adif = 0
Wend
Linienspeicher(05) = Adch
Set Adcsr.adif
While Adcsr.adif = 0
Wend
Linienspeicher(06) = Adch
Set Adcsr.adif
While Adcsr.adif = 0
Wend
Linienspeicher(07) = Adch
Set Adcsr.adif
While Adcsr.adif = 0
Wend
Linienspeicher(08) = Adch
Set Adcsr.adif
While Adcsr.adif = 0
Wend
Linienspeicher(09) = Adch
Set Adcsr.adif
While Adcsr.adif = 0
Wend
Linienspeicher(10) = Adch
Set Adcsr.adif
While Adcsr.adif = 0
Wend
Linienspeicher(11) = Adch
Set Adcsr.adif
While Adcsr.adif = 0
Wend
Linienspeicher(12) = Adch
Set Adcsr.adif
While Adcsr.adif = 0
Wend
Linienspeicher(13) = Adch
Set Adcsr.adif
While Adcsr.adif = 0
Wend
Linienspeicher(14) = Adch
Set Adcsr.adif
While Adcsr.adif = 0
Wend
Linienspeicher(15) = Adch
Set Adcsr.adif
While Adcsr.adif = 0
Wend
Linienspeicher(16) = Adch
Set Adcsr.adif
End Sub
Da der ADC wie gehabt im Dauerlauf gestartet wurde, schaltet die Funktion zuerst den ADC aus und den AC ein. Dann hangelt sich die Funktion durch die Syncs über den Bildanfang bis zu der Zeile, die sich vor der gesuchten Zeile befindet. Wenn am Ende dieser Zeile der Sync erkannt wird, schaltet die Funktion von AC auf ADC zurück und startet die erste Wandlung des ADC noch während des Syncs. So wird der Zeilenanfang mit einer bisher noch nicht gekannten Genauigkeit getroffen. Dieses einfache Demo
Code:
While X = X
Readline 50
For X = 1 To 16
Print Linienspeicher(x) ; " ";
Next X
Print
Waitms 300
Wend
erzeugt diese Ausgabe:
Code:
Bascom-Spielereien mit der Kamera
96 102 103 103 103 103 99 79 57 99 99 96 96 46 6 35
96 102 103 103 103 102 99 56 57 99 97 96 96 15 3 35
96 103 103 103 103 102 99 56 60 99 97 96 96 9 3 35
96 102 103 103 103 102 99 71 57 99 99 96 96 39 6 35
96 102 103 103 103 102 99 57 57 97 97 96 96 39 6 35
96 102 103 103 102 102 99 57 57 97 97 96 96 19 3 35
96 102 103 103 103 102 99 57 56 99 97 96 96 39 6 35
96 102 103 103 103 103 99 63 57 99 99 96 96 39 6 35
96 102 103 103 103 102 99 56 56 97 97 96 96 39 6 35
96 102 103 103 103 102 99 76 56 99 99 96 96 41 6 35
97 103 103 103 103 102 99 60 60 99 97 96 96 15 3 35
88 102 102 103 102 102 99 79 56 99 99 96 96 54 6 35
97 103 103 103 103 102 99 56 62 99 97 96 96 9 3 35
87 103 103 103 103 102 99 60 60 99 97 96 96 30 4 35
96 102 103 103 103 103 99 76 56 99 99 96 96 44 6 35
86 102 103 103 103 102 99 70 57 99 99 96 96 39 6 35
96 102 103 103 103 102 99 78 56 99 99 96 96 44 6 35
96 103 103 103 103 102 99 57 57 99 97 96 96 19 3 35
96 102 103 103 103 102 99 56 57 99 97 96 96 14 3 35
Werte<70 sind der Strich, <ca. 40 ist der Sync am Ende der Zeile. Es sind also ca. 13 Werte pro Zeile die gelesen werden.
Gruß
mic
Lesezeichen