Hallo Dirk
Du legst dich ja mächtig ins Zeug.
Aufgeschreckt durch dein Mitmachprojekt habe ich ja auch einen erneuten Anlauf mit der Kamera unternommen (BMP erzeugen) und ein paar neue Erkenntnisse zum Thema Auflösung gefunden.
Wie schon mehrfach von verschiedenen Seiten angemerkt kann der ADC bei 4MHz pro Zeile maximal 16 Werte hintereinander samplen. Das läßt sich bei dieser Betriebsart (Dauerlauf) nicht ändern und auch die Startverzögerung am Anfang der Zeile (die ich bisher ja auch verwendete um die Auflösung zu "Erhöhen") ändert daran nichts. Es wird immer nur auf einen dieser 16 Werte zugegriffen.
Abhilfe schafft hier das Anhalten und erneute Starten des ADCs. Sobald der Zeilensync erkannt ist, wird der ADC angehalten. Dann startet die Verzögerung für den gesuchten Zeilenpixel und erst dann wird der ADC erneut gestartet. Nachdem der erste eingelesene Wert (diesmal legal ermittelt mit Warten auf das Flag:) abgespeichert wurde, läuft alles wie gewohnt mit dem Warten auf den nächsten Sync weiter. Nun dauert das erste Samplen zwar einige Zyklen mehr als im Dauerlauf, aber wir lösen uns damit von den sturen 16 Werten die wir bisher erhalten hatten:
Code:
while(zeile--) {while (ADCH > 20); while (ADCH < 30);}
ADCSRA = (1<<ADATE)|(0<<ADEN)|(1<<ADIF)|(0<<ADSC)|(1<<ADPS0); // ADC stoppen
while(i--); // Pixel ansteuern
ADCSRA = (1<<ADATE)|(1<<ADEN)|(1<<ADIF)|(1<<ADSC)|(1<<ADPS0); // ADC wieder starten
while (!(ADCSRA & (1<<ADIF))); // 26 ADC-Takte warten bis Wandlung fertig
*bildzeiger++=ADCH; // das sind ca. 6,5µs
ADCSRA |= (1<<ADIF);
Zur weiteren Steigerung der Auflösung habe ich noch an der Verzögerung rumoptimiert. Die while(i--)-Verzögerungeschleife benötigt ca. 3 Takte pro Durchlauf mit Sprung, deshalb lese ich zwei nacheinanderliegende Pixel mit einer "halben" Verzögerungsstufe ein:
Code:
ADCSRA = (1<<ADATE)|(0<<ADEN)|(1<<ADIF)|(0<<ADSC)|(1<<ADPS0); // ADC stoppen
nop(); nop(); // nächste Spalte zwei NOPs später einlesen
while(i--); // Pixel ansteuern
ADCSRA = (1<<ADATE)|(1<<ADEN)|(1<<ADIF)|(1<<ADSC)|(1<<ADPS0); // ADC wieder starten
Obwohl ich mit dieser Technik nun horizontal über 100 Pixel ansteuern könnte, funktioniert das in Phase1 noch nicht optimal. Das liegt wieder an den nur 16 Werten pro Zeile im Dauerlauf. Ich kann so nicht erkennen in welchem Takt das Syncsignal erkannt wurde. Diese kleine Ungenauigkeit beim Start der Pixelverzögerung führt in Phase1 dazu, dass die Pixel nicht ganz genau getroffen werden. Dass der ADC nicht syncron mit dem Bild läuft, verstärkt diesen Effekt auch noch.
Ganz anders sind aber die Möglichkeiten der Phase3 mit ihrer Hardwaresyncerkennung. Da hierbei der Sync digital ausgewertet wird fällt die Wandelzeit des ADCs weg und das Ende des Sync kann nahezu auf den Takt genau erkannt werden. Dadurch sollte das gesuchte Pixel viel besser getroffen werden können. (Ich kann's nicht testen weil ich immer noch Phase1 verwende)
Funktioniert es mit dem M32 eigentlich auch mit ADC-Prescaler /2, also 8MHz am ADC?
Gruß
mic
Lesezeichen