Nochmals hallo
Da Bascom auch direkt auf die Register des AVRs zugreifen kann sollte eine Umsetzung damit auch möglich sein. Ob das auch mit den Config-Befehlen von Bascom funktioniert kann ich nicht sagen, aber ich würde da gar nicht lange rumexperimentieren und die paar ADC-Einstellungen einfach "von Hand" setzen. Die Einleseroutine des ADCH-Registers sollte aber unbedingt selbstgeschrieben und soweit wie möglich zeitoptimiert sein, denn vermutlich kann Bascom das nicht so optieren wie wir es möchten (nur ein Verdacht). Ich habe dazu ein Feld angelegt und arbeite mit einem Zeiger. In C habe ich das schließlich so formuliert:
...allerdings schaffe ich so nur ca. 60 Werte pro Zeile. Mehr geht einfach nicht mit C, vielleicht kann man mit Assembler hier noch etwas "rauskitzeln". Mein Code für das Einlesen eines Pixels:
do *pixelzeiger=ADCH; while (*pixelzeiger++ > 20);
Alternativen wie:
while (count_pixel) pixel[--count_pixel]=ADCH;
for (;count_pixel; pixel[--count_pixel]=ADCH);
wurden fast identisch übersetzt und brachten nur ca. 50 Lesungen pro Zeile.
Wobei die Auslesegeschwindigkeit möglicherweise gar nicht so kritisch ist falls der ADC doch nicht schnell genug wandeln sollte.
Einfache Hell/Dunkel-Erkennung ohne Speichern der Werte geht allerdings deutlich einfacher:
Code:
uint8_t get_line(void)
{
uint8_t i;
cli();
// auf Bildanfang warten
do { i=0; while (ADCH > 30); while (ADCH < 50) i++; } while (i < 40);
// die ersten 50 Zeilen überlesen
i=50; while (i--) { while (ADCH > 30); while (ADCH < 50); }
// warten auf hell-dunkel-Übergang
i=0; while (ADCH > 100) i++;
sei();
return(i);
}
Diese Funktion sucht in der 50. Zeile des Bildes von links beginnend den ersten Bildpunkt (Pixel) dessen 8-bit Helligkeitswert kleiner (=dunkler) als 100 ist und gibt die Nummer dieses Punktes zurück. Das kann man ein zu eins in Bascom umsetzen, zusammen mit der ADC-Dauerlauf-Inizialisierung war das dann schon alles.
Gruß
mic
Lesezeichen