PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sensor aus Flachbettscanner ansteuern/auslesen



Uwe_123
14.08.2008, 11:45
Guten Tag,

ich habe vor einiger Zeit mal einen Flachbettscanner auseinander genommen, damals ging es mir eher um die Mechanik, jetzt eher um die Elektronik. Da ich demnächst etwas Zeit habe wollte ich mich mal dem Sensor des Scanners widmen. Leider konnte ich nicht rausfinden was genau das für ein Sensor ist.

http://img208.imageshack.us/img208/3407/foto4dq1.th.jpg (http://img208.imageshack.us/my.php?image=foto4dq1.jpg)

Die Platine sieht allerdings genau so aus, wie diese, die ich bei Pollin gefunden habe:

Bildsensor NEC µPD8872CY (http://www.pollin.de/shop/shop.php?cf=detail.php&pg=OA==&a=MjAwOTk4OTk=&w=ODg4OTk4&ts=0)

Hier das
Datenblatt µPD8872 (http://www.pollin.de/shop/downloads/D100997D.PDF)

Meine Idee war diesen Sensor mit Optik für verschiedene Zwecke zu verwenden. Z.B. wollte ich eine damit eine Münzerkennung machen. Die Münze soll dabei an der Optik vorbeilaufen. Dadurch ergibt sich ein ca. 20 cm breiter Sensor. Aus dem eindimensionalen Bild wollte ich dann die Breite der Münze und die Laufgeschwindigkeit ermitteln. Dabei würde mit ein Farbkanal reichen.

Da ich kürzlich meine ersten Erfahrungen mit AVRs gemacht habe wollte ich gerne einen zum Auswerten der Daten verwenden.

Leider bin ich relativ unerfahren was das lesen von Datenblättern angeht.

Hier mal das Blockschaltbild:
http://img148.imageshack.us/img148/1412/bild1wi9.th.png (http://img148.imageshack.us/my.php?image=bild1wi9.png)
Leider kann ich das Blockschaltbild gar nicht richtig lesen, wenn ich das mal vermuten darf, würde ich sagen, dass die Werte im Chip analog gespeichert werden. Man müsste sie also noch AD wandeln, richtig?

Wenn ich das richtig sehe sind die Logikpegel schonmal kompatibel mit denen des AVRs. Die "Data rate" ist hier mit 2Mhz angegeben, eine minimale Rate ist nicht angegeben. 2 Mhz sind natürlich viel zu hoch für einen AVR. Es würde natürlich sicher reichen nicht jeden Wert zu nehmen, sondern die Auflösung zu halbieren und nur jeden zweiten Wert zu wandeln. Haben solche analogen Speicher eine Mindestfrequenz? Verschwinden die Ladungen nach kurzer Zeit? Ist die Ausgangsverstärkung groß und stabil genug um sie direkt mit dem AD-Wandlers zu verbinden?

Ich würde mich wirklich freuen, wenn ihr mir helfen könnt.
Soweit ich das bisher in diesem Forum überblicken kann sitzen hier einige echt fähige Leute.

Uwe

mikro-VIIV
14.08.2008, 12:58
Schau dir mal das hier (http://mitglied.lycos.de/bk4/ccds.htm) an.

Ich wollte das auch schon mal probieren, nur leider habe ich die Optik meines Sensors nicht mehr. :( Da bringt mir das leider nicht viel.

Besserwessi
14.08.2008, 17:23
Wenn es um eine Bildauswertung oder gar Bilderkennung geht ist ein 8 Bit AVR Controller überfordert, schon wegen dem sehr begrenzen Speicher.
Es gibt für den CCD Chip auch eine Grenze nach unten, wie lansam man die Daten auslesen darf. Wenn man sehr langsam (ab etwa 1 sekunde) ausließt kriegt man etwas mehr Rauschen und vor allem Drift der Daten. Mit dem AVR internen AD geht das aber schon so einigermaßen, vor allem wenn man sich auf einen Teil des Bildes beschränkt, denn für viel mehr ist ohnehin kein Platz im Speicher. Diesen Speziellen Chip kenne ich nicht, aber oft wird da noch ein extra Offsetabgleich analog durchgefürt um den Offset des internen Verstärkers auszugleichen. Ich habe aber auch schon gelesen das dies direkt am AD Eingang eines AVR machen kann.

Den Chip würde ich auf alle Fälle auf der kleinen Platine lasssen, denn CCDs sind oft relativ empfindlich gegen ESD. Wenn da auf der Platine noch ein bischen Schaltung mit drauf ist, kann man die wahrscheinlich mit benutzen. Oft sind Widerstände vor den Takteingängen um die Flanken-steilheit passend einzustellen, das übernmmt man am besten so.

Uwe_123
14.08.2008, 21:42
Schau dir mal das hier (http://mitglied.lycos.de/bk4/ccds.htm) an.

Ich wollte das auch schon mal probieren, nur leider habe ich die Optik meines Sensors nicht mehr. :( Da bringt mir das leider nicht viel.

Super Link, das ist ja echt ein starkes Projekt!
Schau doch mal bei Ebay, da bekommt man die Teile doch zum Preis der Versandkosten.



Wenn es um eine Bildauswertung oder gar Bilderkennung geht ist ein 8 Bit AVR Controller überfordert, schon wegen dem sehr begrenzen Speicher.
Es gibt für den CCD Chip auch eine Grenze nach unten, wie lansam man die Daten auslesen darf. Wenn man sehr langsam (ab etwa 1 sekunde) ausließt kriegt man etwas mehr Rauschen und vor allem Drift der Daten. Mit dem AVR internen AD geht das aber schon so einigermaßen, vor allem wenn man sich auf einen Teil des Bildes beschränkt, denn für viel mehr ist ohnehin kein Platz im Speicher. Diesen Speziellen Chip kenne ich nicht, aber oft wird da noch ein extra Offsetabgleich analog durchgefürt um den Offset des internen Verstärkers auszugleichen. Ich habe aber auch schon gelesen das dies direkt am AD Eingang eines AVR machen kann.

Den Chip würde ich auf alle Fälle auf der kleinen Platine lasssen, denn CCDs sind oft relativ empfindlich gegen ESD. Wenn da auf der Platine noch ein bischen Schaltung mit drauf ist, kann man die wahrscheinlich mit benutzen. Oft sind Widerstände vor den Takteingängen um die Flanken-steilheit passend einzustellen, das übernmmt man am besten so.

Ich würde ja vermutlich eh auf den Großteil der Daten verzichten, wenn ich mehrmals pro Sekunde eine Bild auswerten möchte sind die Frequenzen so hoch, dass der AD des AVR vermutlich schon stark rauscht. Was ich brauche ist aber auch fast nur eine Threshold-Entscheidung. Vielleicht reicht es da sogar einen Komparator an den Ausgang des Chips zu löten und die Daten direkt digital zu verarbeiten.

Scheinbar ist es aber ja sogar möglich Farbbilder mit dem AVR zu verarbeiten (siehe Link von mikro-VIIV).

Leider ist mir immer noch nicht klar, wie ich den Chip genau verdrahten muss. Hat da jemand Erfahrung? In dem Link ist das ganze leider nur prinzipiell beschrieben. Gerade der Offset-Abgleich ist mir gar nicht klar.

Gruß,

Uwe

Besserwessi
15.08.2008, 11:05
Der Link hat eigentlich eine relativ gute Beschreibung. Der Offsetabgleich ist eigentlich relativ einfach:

Das Signal wird per Kondensator (ca. 1-10 nF) an den Controller gekoppelt. Entweder zu Anfang einer Zeile, oder nach jedem Pixel wird dem CCD gesagt das die Nullreferenz anliegen soll. Dann wird der AD Eingang (oder komperator) kurz auf Ausgang und low geschaltet. Dadurch Speicher der Kondensator die Offsetspannung. Danach wird wieder auf Eingang geschaltet und dann die zu messende Intensität ausgelesen. Durch den Kondensator in Reihe fällt die Offsetspannung dann weg.

Der Takt zum Weiterschieben der Daten muß auch nicht die ganze Zeit gleich sein. Den uninteressanten Teil kann man schnell durchschiebe und sich dann beim interessanten teil Zeit für den AD Wandler lassen. Wenn es nur um eine Schranke geht, kann man auch den AVR internen Komperator nehmen.

Uwe_123
15.08.2008, 14:25
Den Chip würde ich auf alle Fälle auf der kleinen Platine lasssen, denn CCDs sind oft relativ empfindlich gegen ESD.

Da werde ich leider nicht drum herum kommen. Ich muss ja rausfinden, was genau das für ein Chip ist. Und das scheint leider auf der Unterseite zu stehen.


Der Link hat eigentlich eine relativ gute Beschreibung. Der Offsetabgleich ist eigentlich relativ einfach:

Das Signal wird per Kondensator (ca. 1-10 nF) an den Controller gekoppelt. Entweder zu Anfang einer Zeile, oder nach jedem Pixel wird dem CCD gesagt das die Nullreferenz anliegen soll. Dann wird der AD Eingang (oder komperator) kurz auf Ausgang und low geschaltet. Dadurch Speicher der Kondensator die Offsetspannung. Danach wird wieder auf Eingang geschaltet und dann die zu messende Intensität ausgelesen. Durch den Kondensator in Reihe fällt die Offsetspannung dann weg.

OK, das habe ich glaube ich verstanden. Dann ist aber vermutlich das Timing relativ entscheidend, oder? Sonst verschwindet doch die Ladung auf dem Kondensator. Werde den Chip mal auslöten und dann das korrekte Datenblatt raussuchen. Das oben könnte es sein, ganz sicher bin ich mir da aber nicht.

Danke für die Antworten!

Uwe

Besserwessi
15.08.2008, 22:31
Was ist denn sonst noch so auf der platine ? Ich habe es geschaft die Funktion der Pins aus der Restlichen Schaltung zu erkennen bzw. den Rest durch ausprobieren rauszukriegen. Was Ausgang, und was Eingang ist kann man oft erkenen, dann bleibt im wesentlichen noch die Art des eingans, auch da gibt es aus symmetreigründen oft schon Hinweise.

Das timing für den Offsetabgelich ist ziehmlich unkritisch. Die größe des kondesators gibt vor wie lange der die Ladungen hält. Die Zeit zum Kondenator Laden muß dann nur noch lange genug sein. Zu lange verschenkt im wesentlichen Zeit in der man was besseres tun könnte. Es muß dann halt nur genug zeit sein das der Kondensator in der Zeit einigermaßen den stationären Zustand erreicht. Also etwas von der Größe 2*RC, wobei R der Ausgangswiderstand des Verstärkers ist. Wenn man recht oft (jedes Pixel) den Abgleich machen sollte es auch recht kurz reichen, denn der Kondensator ist dann jedesmal schon fsat richtig geladen.

Uwe_123
16.08.2008, 21:58
Hallo Besserwessi,

Auf der Platine befindet sich neben dem Sensor nur noch ein anderer Chip. Ein 74HC86D (Exkulsiv-Oder). Einige Transistoren, ich vermute mal für die Gabellichtschranke. Außerdem sind da noch ein par Kondensatoren, Widerstände und Spulen. Außerdem noch ein wenig Elektronik für die Beleuchtung. Da mein neues Multimeter noch nicht da ist kann ich das ganze Leider noch nicht durchmessen.

Wäre nicht eigentlich auch ein Offsetabgleich per Software möglich? Indem man einfach den Offset (AD-Wert bei Referenz am Ausgang) misst und von allen anderen Werten abzieht? Natürlich würde man damit ein wenig Dynamik verschenken, aber die Schaltung würde (von meinem Standpunkt aus) ein par Fehlerquellen weniger beinhalten ;-).

Danke für die Hilfe. Sobald mein Multimeter da ist messe ich die Schaltung auf jeden Fall durch und werde mal versuchen einen Schaltplan des Board aufzustellen.

Uwe

Besserwessi
17.08.2008, 08:03
Der Offset kann im Vergleich zum Signals relativ groß sein. Wenn man den Abgleich in Software machen will, dann sollte man aber wenigstens einen Poti für den Grobabgleich vorsehen.

Der 74HC... könnte gut die Taktsignale für das CCD treiben. Damit wären dann schon mal die Takteingänge festgelegt. Durchmessen mit dem multimeter wird nicht alzuviel bringen. Nach einer groben identifikation von GND, +5V, ggf. +12V , Takt Eingängen und Ausgängen hilft dann eigentlich nur Probebetrieb mit dem Oszilloskop am Ausgang.

Bei mir waren auf der Platine ein 74HC04 (oder so ähnlich), ein Spannungsregler, ein Transistor als Emitterfolger für den Ausgang (nur eine Farbe) und dann ein paar Widerstände / Kondensatoren.

Uwe_123
17.08.2008, 11:36
Also ich habe mich mal versucht grob zu orientieren.
Ganz ohne Multimeter und damit Durchgangsprüfer ist es leider doch recht schwer. Die drei Transistoren von denen ich dachte sie wären für die Gabellichtschranke sind wohl doch für was anderes gut. Auf ihnen steht BS (GH) t. dazu konnte ich leider gar nichts finden. Da ist drei mal die exakt gleiche Transistorschaltung aufgebaut. Leider kann ich noch nicht genau sagen wie sie verschaltet sind. Neben den Transistoren steht Q1, Q2, Q3. Deutet das darauf hin, dass es sich um Mosfets handelt? Wenn ich das richtig sehe handelt es sich um eine Basis(Gate)schaltung. Dann sind da noch 3 Widerstände 302 (sind das 3kOhm?) und drei mal 101 (100 Ohm?).

Wenn das Multimeter da ist (ich hoffe es kommt morgen) werde ich diese Transistorschaltung mal sizzieren. Dass die Schaltung 3 mal vorkommt deutet ja vermutlich darauf hin, dass es sich dabei um eine Verstärkung der Ausgänge handelt.

Leider besitze ich kein Oszilloskop. Darauf muss ich also wohl verzichten.
Relativ viele Pins sind mit Masse verbunden. Leider sind einige unter dem Chip verbunden. Da sehe ich leider (noch) gar nichts.

Also ich hoffe morgen gibts News ;-)

Uwe

Besserwessi
17.08.2008, 20:10
Viel Pins auf Masse ist normal. Die 302 sollte wirklich 3k Ohm sein udn die 101 auch 100 Ohm. Vermutlich sind das Emitterfolger für die Ausgänge. Ohne Oszilloskop wird das schon etwas schwieriger, aber so eine AVR hat ja einen AD Wandler. dann muß halt schon das Testprogramm die Daten digitalisieren und schnell zum PC schicken. Sollte auch schon reichen, schließlich soll der AD Wandler ja später auch ausreichen. Man braucht dann nur eine schnelle UART (z.B. ca. 500 kbaud) um die Daten rüber zu kriegen.

Uwe_123
19.08.2008, 22:25
Ja, das wird noch ein Problem. 500 kbaud sind schon eine ganze Menge.

Endlich ist mein Multimeter gekommen, allerdings liegt es beim Nachbarn.
Ich hoffe dass ich es morgen abholen kann und endlich mal einen Schaltplan zeichnen kann.

Uwe

Besserwessi
20.08.2008, 22:02
Ich weiss, 500 kBaud ist ne Menge, abe viele PCs sollten das gerade noch schaffen. Ein AVR sollte das mit einem 8 Mhz Quarz hinkriegen. Man sollte aber vorher nachsehen, welche Rate der PC kann und muß dann ggf, einen passenden Quarz nehemen. Es sollte auch etwas langsamer gehen, aber 57 kBaud oder so sollten es wirklich schon sein.

Uwe_123
21.08.2008, 20:26
Endlich ist das Multimeter da!

Also der "Transistor" den ich auf der Platine gefunden habe sieht so aus:
http://img225.imageshack.us/img225/4941/bsghtgk5.th.jpg (http://img225.imageshack.us/my.php?image=bsghtgk5.jpg)

Kann man irgendeine Aussage über die Pinbelegung machen? Gibt es eine Standardbelegung?

Die Transistorschaltung sieht wie folgt aus:
http://img98.imageshack.us/img98/7132/fetrb3.th.jpg (http://img98.imageshack.us/my.php?image=fetrb3.jpg)

a,b und c führen direkt zu einer Leitung zur fixierten Platine des Scanners.
1,2,3 und 4 sind mit dem Sensor verbunden. Von den Kondensatoren vermute ich, dass es welche sind. Es steht kein Wert drauf.

Wird der Kondensator hier zum Offset-Abgleich benutzt?
Wozu wird die Leitung 1 benutzt? Wird sie zum Offset-Abgleich verwendet?

Uwe

Besserwessi
21.08.2008, 21:17
Für SMD Codes gibt es datenbanken. z.B.
http://info.electronicwerkstatt.de/bereiche/bauteile/smd/smd_aktiv/b.html
oder
http://www.marsport.org.uk/smd/mainframe.htm


Danach sollte das ein PNP Transsistor sein. Pin 1 der Emittern, Pin2 der Collector und Pin3 die Basis sein.
Wie schon vermutet, sind das 3 Emitterfolger (Collektorschaltung) als Puffer für das Signal. Die Kondensatoren und die Widerstände zum Sensor sind als Tiefpass geschaltet um ganz hohe Frequenzen abzuhalten.
Mit dem Offsetabgelich hat das noch nichts zu tun, der kommt später.
Leitung 1 solle die positive Versorgung sein. Ob das 5 oer 12 V sind kann man so noch nicht erkennen.

Uwe_123
21.08.2008, 22:32
Super, danke.
Du hast Recht, 1 ist mit 12 Volt verbunden.

Ich werde nächste Woche mal einen Schaltplan des gesamten Boards erstellen. Ich bin leider am Wochenende nicht da, muss also bis Montag warten.

Die Platine hat einen 22-Poligen Anschluss, im Grunde müsste man doch nur versuchen allen Pins eine Funktion zuzuschreiben. Dann könnte man die Platine theoretisch steuern, oder?

Uwe

Besserwessi
21.08.2008, 22:38
So ähnlich habe ich das jedenfalls gemacht, ahtte aber nur etwa 12 Pins. Vermutlich wird bei den 22 Polen fast jeder 2 te pin Masse oder VCC sein. Es werden dann noch ein ganz paar Unsicherheiten bleiben mit den Taktleitunge, die man dann relativ einfach ausprobieren kann. Ich habe so etwa 10 Versuche gebraucht bis es ging, wobei oft ein einfaches Tauschen der Kabel auf dem Steckbrett reichte. Allerdings könnte es ohne Oszilloskop etwas schwieriger werden.

Uwe_123
25.08.2008, 00:15
Es werden dann noch ein ganz paar Unsicherheiten bleiben mit den Taktleitunge, die man dann relativ einfach ausprobieren kann. Ich habe so etwa 10 Versuche gebraucht bis es ging, wobei oft ein einfaches Tauschen der Kabel auf dem Steckbrett reichte. Allerdings könnte es ohne Oszilloskop etwas schwieriger werden.

Das fürchte ich auch.

Also, ich habe es geschafft endlich einen Schaltplan zu erstellen. Leider kenne ich mich mit eagle nicht so gut aus. Die Ex-Ors sind so angeordnet, wie in dem IC. Der Sensorchip ist jetzt nur als Steckerleiste eingezeichnet.

Die nicht verbundenen Leitungen sind für die Gabellichtschranke und die Beleuchtung. Hier nun der Plan:

http://img228.imageshack.us/img228/6315/planhf2.th.jpg (http://img228.imageshack.us/my.php?image=planhf2.jpg)

Scheinbar gibt es zwei getrennte Spannungsversorgungen auf dem Chip. Die eine treibt allerdings nur den Ex-Or-Chip.
Am Sensor gibt es also scheinbar 4 Eingänge, drei mit einem 10 Ohm (100?) Widerstand und einen mit einen 47 Ohm (470?) Widerstand. Acht Pins des Sensors sind nicht belegt, ein Durchgangstest zeigt allerdings, dass sie mit der Masse verbunden sind.

Spät genug heute.

Gruß Uwe

Besserwessi
25.08.2008, 17:27
So ungefähr hätte ich die Schaltung auch erwartet. Die XOR gatter sind also nur als Treiber geschaltet. Im Vergleich zu dem Datenblatt ober würde ich man vermuten das R11 an die Tranfer Gates geht (TG1,TG2,TG3). R9 und R10 gehen dann vermutlich an die Takteingänge (pins 8,9,14,15 im Datenblatt), Wie die Phasenlage ist, kann man da wohl nur probieren. R8 wird dann vermutlich den Ausgangsverstärker steuern (entpsricht Pin 3 im Datenblatt). Die Pins 2,4,19 im Datenblatt scheint es bei dem CCD nicht zu geben (bzw. irgendwie intern mit dem Takt verbunden).
Damit gibt es gar nicht mehr viel auszuprobieren: im wesentlichen die Phasenlage der beiden Takteingänge und die Polarität der beiden anderen Signale. Den ersten test sollte man mit dem Schalter für den Ausgangsverstärker machen. Wenn man den umschatet sollten sich die Ausgäge ändern, auch wenn der Rest konstant bleibt. Das kann man zur wohl auch noch mit dem Multimeter sehen. Für den Rest schreubt man dann am Besten eine Testprogramm auf einem Controller, das Versucht das CCD Auszulesen. Dabei sollte man beachten, das schon recht wenig Licht reicht um den CCD in die Sättigung zu bringen. Zum Test also den CCD eher abdecken.
Mein Testprogramm ist für einen Tiny26. Wegen der Software Uart ist es aber auf 4800/9600 oder 19200 baud beschränkt und etwas unübersichtlich.

Uwe_123
26.08.2008, 10:26
Danke für die Antwort.
Sorry, das Datenblatt scheint nicht zum Chip zu gehören.


Den ersten test sollte man mit dem Schalter für den Ausgangsverstärker machen.

Ist das das Signal um den Offset zu messen?


Für den Rest schreubt man dann am Besten eine Testprogramm auf einem Controller, das Versucht das CCD Auszulesen.

OK, das werde ich machen. Leider bin ich zur Zeit meine Sachen nicht hier. Es wird wohl 2-3 Wochen dauern, bis ich wieder was basteln kann.


Damit gibt es gar nicht mehr viel auszuprobieren: im wesentlichen die Phasenlage der beiden Takteingänge und die Polarität der beiden anderen Signale.

Daran habe ich ehrlich gesagt gar nicht gedacht. Ist die Polarität nicht immer gleich? Da wäre ich jetzt blind reingefallen.

Gruß Uwe

Besserwessi
26.08.2008, 17:27
Mir ist schon klar, dass das oben hezeigte Datebaltt zu einem anderen CCD gehärt, aber die Ansteuerung ist ähnlich. Bei dem CCD hier scheinen ja auch einige der Signale mit extern zugeführt zu werden müssen. Die Pinangaben waren auch mehr da um die Funktion zu klären, die die dann auch irgendwo im Rest des Datenblattes beschrieben ist.

Der Test mit den Ausgangspins ist relativ einfach weil man da keinen schnellen Takt braucht und nur das ausgangssignal und die eine Steuerleitung. Was man sieht ist halt abwechselnd den Offset und das zuflääig anliegende Signal aus der Zeile. Normalerweise sollten die nicht genau gleich sein, sodaß man einen Unterschied sehen sollte.

Die Polarität der Steuersignale muß nicht bei allen CCDs gleich sein, ich kenne aber auch nicht so viele um zu sagen das beide Polatitäten tatsächlich vorkommen.

Uwe_123
28.08.2008, 13:26
Mir ist schon klar, dass das oben hezeigte Datebaltt zu einem anderen CCD gehärt, aber die Ansteuerung ist ähnlich. Bei dem CCD hier scheinen ja auch einige der Signale mit extern zugeführt zu werden müssen. Die Pinangaben waren auch mehr da um die Funktion zu klären, die die dann auch irgendwo im Rest des Datenblattes beschrieben ist.


Gut, so hatte ich das auch verstanden. Wollte nur sicher gehen, dass da keine Missverständnisse auftreten. Vielen Dank noch mal dafür.

Wie müsste ich den Chip den eigentlich ansteuern? Im Datenblatt des Chips von Pollin gibts zwei Modes "Bit clamp mode" und "Line clamp mode". Mir ist ehrlich gesagt nicht klar, wo da der Unterschied liegt. Wird im Bitmode der Offset jedesmal an den Ausgang gelegt?

Vermutlich ist das Datenblatt aber eh nicht sonderlich hilfreich, da ich an meinem Chip kein RB und 1L habe, oder?

Ich bin schon auf die ersten Tests gespannt, die werde ich aber wie gesagt wohl erst in 2 Wochen machen können... leider.

Gruß,

Uwe

Besserwessi
28.08.2008, 19:48
Beim Bitmode wird nach jedem Pixel eine Offset korrektur gemacht, beim "Line Clamp mode" nur einmal für die Ganze Zeile. Wenn man nicht extrem Langsam ausließt sollte der "Line Clamp modus" ausreichen, der ist einfacher zu programmieren und man sollte weniger Störungen auf AVcc am Controller kriegen.

Uwe_123
29.08.2008, 23:55
OK dann werde ich gerne darauf verzichten,

Hier mal ein par Ausschnitte aus dem Datenblatt (Bildsensor NEC µPD8872CY (http://www.pollin.de/shop/shop.php?cf=detail.php&pg=OA==&a=MjAwOTk4OTk=&w=ODg4OTk4&ts=0)):

http://img148.imageshack.us/img148/1412/bild1wi9.th.png (http://img148.imageshack.us/my.php?image=bild1wi9.png)

http://img149.imageshack.us/img149/6780/bild3tb8.th.png (http://img149.imageshack.us/my.php?image=bild3tb8.png)

Wenn ich das jetzt richtig verstehe besitzt mein Chip nicht die Eingänge:
φRB Reset gate clock
φ1L Last stage shift register clock 1
φ2L Last stage shift register clock 2

http://img222.imageshack.us/img222/7633/bild2cj1.th.png (http://img222.imageshack.us/my.php?image=bild2cj1.png)

Ich bin nicht ganz sicher ob ich den Output richtig interpretiere, da scheint es drei Pegel zu geben. Mir ist nicht klar welcher Pegel anliegt, wenn φRB low ist. Wenn φRB high ist scheint der analoge Pegel anzuliegen.

Warum gibt es überhaupt φ1 und φ2? Die Pegel scheinen ja einfach nur gegensätzlich zu sein.

Danke für die Hilfe,

Uwe

Uwe_123
12.09.2008, 15:58
Hallo,

also ich habe nun eine kleine Testumgebung zusammengestellt.
Leider hat mich das nicht viel weiter gebracht. Ich konnte die Funktion der verschiedenen Pins nicht feststellen.

Immerhin ändern sich die Werte abhängig von der beleuchtung. Allerdings direkt, d.h. die Werte Steigen, wenn ich den Sensor beleuchte. Außerdem gibt es eine Abhängigkeit von 3 der 4 Eingänge von high und low pegeln.

Ich habe noch mal ein wenig gegoogelt und herausgefunden, dass vermutlich ein CCD namens "P98003" verbaut ist. Leider habe ich kein Datenblatt dazu finden können.

Gruß Uwe

Besserwessi
12.09.2008, 17:39
Die genaue Type vom CCD ist eher unwichtig. Man sollte mal sehen wer der Hersteller ist. Soweit ich das gesehen habe werden die CCDs eines Hersteller oft ähnlich angesteuert. So viel Hersteller gibt es da gar nicht ?. Ich hatte erst auch ein paar probleme mit dem Signal, weil viel zu viel licht drauf kam. Das muß schon ziehmlich dunkel sein, damit der CCD Chip moch nicht in die Sättigung kommt und man das normale Verhalten hat.

Uwe_123
12.09.2008, 20:05
Also bei der Ansteuerung des Chips hatte ich eher das Gefühl, dass er sehr viel Licht braucht. Bei direkter Taschenlampen-Beleuchtung änderten sich die Werte erst. Leider drifften die Werte aber auch ständig. Ich werde in den nächsten Tagen noch ein par Sachen ausprobieren.

Ich habe noch mal ein bisschen gesucht und folgendes gefunden:
http://www.gjaeger.de/scanner/plustek_pp/
http://gkall.hobby.nl/scan-chips-back.html

Demnach ist wohl Plustek selber der Hersteller des Chips.
Leider kann ich zu den Plustek Chips (P9xxxxx) generell keine Datenblätter finden.

Weiß jemand wie man da dran kommen kann? da die Chips ja verkauft werden müssen doch Datenblätter existieren.

Gruß Uwe

shaun
12.09.2008, 21:07
Bei sane interessiert man sich nicht wirklich für den CCD-Sensor, sondern für den Controller des Scanners, das sind die dort genannten Scanner Chips. Der wiederum dürfte Dich für Dein Vorhaben nicht interessieren, oder?

Besserwessi
12.09.2008, 21:30
Die eigentlichen Pixel sind wirklich recht empfindlich auch Licht. Wenn man noch normale Schrift auf papier lesen kann, ist der CCD bei einer Belichtungszeit von 1/10 s oder so noch überbelichtet. Allerdings reageiren auch der Verstärker und die Schiebezellen etwas auf Licht. Da wird man aber deutlich mehr Licht für brauchen.

Uwe_123
14.09.2008, 14:06
Bei sane interessiert man sich nicht wirklich für den CCD-Sensor, sondern für den Controller des Scanners, das sind die dort genannten Scanner Chips. Der wiederum dürfte Dich für Dein Vorhaben nicht interessieren, oder?

Oh, ja das stimmt, ein Blick auf die Hauptplatine hätte mir da wohl auch weiter geholfen... OK, dann stehe ich da wieder vor der Frage welcher Chip das ist.


Die eigentlichen Pixel sind wirklich recht empfindlich auch Licht. Wenn man noch normale Schrift auf papier lesen kann, ist der CCD bei einer Belichtungszeit von 1/10 s oder so noch überbelichtet. Allerdings reageiren auch der Verstärker und die Schiebezellen etwas auf Licht. Da wird man aber deutlich mehr Licht für brauchen.

OK, das könnte erklären, warum sich die Werte bei direkter Bestrahlung mit der Taschenlampe ändern. Wie sah dein Testprogramm den ungefähr aus? Wie bist du da vorgegangen. Ich habe jetzt einfach nur ein par toggelnde Ausgänge und messe einen Kanal. Je nach Eingang erhalte ich dann Einen Wert um 500 und 1023 (10-Bit-ADC). Bei Starker Bestrahlung ändern sich sowohl die Werte um 500 als auch die um 1023. Das spricht natürlich dafür, dass die Verstärker auch empfindlich sind.

Ich bin ab morgen erst mal ein Woche im Urlaub, werde mich also erst in einer Woche wieder darum kümmern können. Ich werde auch nochmal nach dem CCD-Chip suchen. Vielleicht finde ich da ja noch was.

Danke für eure Hilfe!

Gruß Uwe

Uwe_123
14.09.2008, 20:35
Also ich mache mich entschieden den Chip zu opfern und zu versuchen den gleichen Scanner nochmal zu kaufen. Beim auslöten mit Heißluft ist er dann auch wirklich dabei kaputt gegangen, er ist nun merkwürdig gebogen und und es sieht so aus als wären einige Bonddrähtchen gerissen.

Dafür weiß ich jetzt, dass es ein µPD3799 ist, Juhu!

Hier ist das Datenblatt:
http://www.alldatasheet.com/datasheet-pdf/pdf/6939/NEC/UPD3799CY.html?

Also, in einer Woche werde ich versuchen den Chip anzusteuern.

Gruß Uwe

Uwe_123
18.10.2008, 16:33
Also leider bin ich bisher noch nicht weitergekommen, was daran liegt, dass ich mir den Arm gebrochen habe. Da macht das Programmieren leider wenig Spaß. Deshalb versuche ich mal in der Theorie weiter zu kommen.

Ich habe aus dem Datenblatt mal eine kleine Grafik zusammengefasst:
http://img233.imageshack.us/img233/8758/unbenanntzp5.png (http://imageshack.us)

Wenn ich das richtig verstanden habe ist das einzig wirklich zeitkritische die Belichtungszeit, diese ist mit 3000ns (min) bis 10000ns (typ) angegeben.
10000ns also 10µs würden bei einem 16 Mhz Quartz 160 Takten entsprechen und ist damit wohl der einzige "typische" Wert, den ich einhalten kann.

Ich habe allerdings einige Fragen:

Unter "Note" (siehe Grafik) steht, dass der Takt weiterlaufen soll. Ist entscheidend wie viele Takte in dieser Zeit gemacht werden? Oder ist nur entscheidend wie am Anfang und Ende gerade die Taktphasen sind?

Ist der Messwert der, den ich da eingetragen habe?

Wie Takte ich am besten? Ich habe mal gehört, dass der Aufruf eines Interrupts alleine schon etwa 60 Takte dauert.

@Besserwessi: Wie hattest du das gemacht?

Danke für alle Antworten,

Gruß Uwe

Besserwessi
18.10.2008, 19:54
Die Belichtungszeit sollte von einem TG Puls zum nächsten sein, also nicht nur wärend des TG Pulses. Wenn man nicht schnell genug ausließt, hat man da ein paar Probleme ganz kurze Belichtungszeiten zu bekommen. Das Problem läßt sich aber lösen.

Das Signal liegt nicht da an wo es vermutet wurde, sondern, während des RB puilses, also etwas später.
Der RB Takt soll weiterlaufen, vermutlich deshalb, weil der Offset am Ausgang davon abhängen kann wie das Taktverhältnis des RB Signals ist. Auf die Zahl der Zyklen sollte es da nicht ankommen. Man solle aber natürlich sehen eine Ganze Zahl von Pulse zu haben. Vermutlich sollte auch das Taktverhältnis in etwa dem Entsprechen, was man später bein Auslesen hat.

Ich habe das Programm komplett in ASM geschrieben, fast alles im Hauptprogramm. Nur der AD-Wandler und die Software-UART sind zusammen im AD Wandler-Interrupt. Das ist eine aus einem anderen Programm übernommene Lösung für die Software-UART und eigentlich keine so gute Lösung.
Die Verzögerungen sind kurze Schleifen, bzw. beim Auslesen durch den AD-Wandler gegeben.
Schon wegen des internen AD Wandlers wird man relativ langsam auslesen müssen, da sollte es auch möglich sein das Ganze in C zu schreiben. Die etwa 60 Zyklen für die ISR könnten für C hinkommen, hängt aber von der ISR ab.

Uwe_123
25.10.2008, 19:27
Danke für die Hilfe, ich glaube ohne euch würde ich auf keinen grünen Ast kommen.

Damit wir über das gleiche sprechen habe ich die Zeitpunkte mal in den Diagrammen durchnummeriert:

http://img528.imageshack.us/img528/4307/10872335wq9.png (http://imageshack.us)
http://img528.imageshack.us/img528/10872335wq9.png/1/w1010.png (http://g.imageshack.us/img528/10872335wq9.png/1/)


Die Belichtungszeit sollte von einem TG Puls zum nächsten sein, also nicht nur wärend des TG Pulses. Wenn man nicht schnell genug ausließt, hat man da ein paar Probleme ganz kurze Belichtungszeiten zu bekommen.

Also du meinst die Belichtungszeit läuft von 1' bis 3'? Ich hatte vermutet, dass sie von 1' bis 2' geht. Dann sollte man wirklich versuchen die Daten so schnell wie möglich auszuwerten. Vielleicht lässt man auch einfach ein par Messwerte aus, man braucht ja nicht unbedingt alle 5xxx Werte.


Das Signal liegt nicht da an wo es vermutet wurde, sondern, während des RB puilses, also etwas später.
Du meinst, dass es eher bei 6 bis 7 (also während 16-17) anliegt? Das erklärt due Pfeile O:)


Ich habe das Programm komplett in ASM geschrieben, fast alles im Hauptprogramm. Nur der AD-Wandler und die Software-UART sind zusammen im AD Wandler-Interrupt. Das ist eine aus einem anderen Programm übernommene Lösung für die Software-UART und eigentlich keine so gute Lösung.
Die Verzögerungen sind kurze Schleifen, bzw. beim Auslesen durch den AD-Wandler gegeben.
Schon wegen des internen AD Wandlers wird man relativ langsam auslesen müssen, da sollte es auch möglich sein das Ganze in C zu schreiben. Die etwa 60 Zyklen für die ISR könnten für C hinkommen, hängt aber von der ISR ab.

Hört sich logisch an. Ich würde einen ATMega8 mit Hardware-Uart verwenden. Außerdem überlege ich nicht die ISR zu verwenden, sondern zu "zählen" wie lange der ADC benötigt (da muss ich aber noch mal genau schauen, ob sich das so genau bestimmen lässt). Das würde aber auch nur in Frage kommen, wenn das Programm sonst ausreichend stabil läuft, also eher ein Fernziel

Vielen Dank für alle Antworten,

Uwe

Besserwessi
25.10.2008, 22:23
Bei der Belichtungszeit bin ich mir nicht ganz sicher, die könnte auch von Nr. 2 bis Nr 4 gehen, aber das macht kaum einen Unterschied.

Beim Auslesen würde ich sagen, das im Bild die Zeit von 5-6 ziehmlich lang dargestellt wird. Bei einem eher langsamen Takt den man per AVR verwenden wird, ist 5-6 ziehmlich kurz und 6-7, wo das Signal anliegt dann wesenlich länger.

Hier ist der Code:


; Program for CDD interface -> UART
; 5.2006
; Target : tiny26
;************************************************* ***************************
;Hardware: CCD Line sensor with inverters to port A
; UART at port B
.include "tn26def.inc"

;***** Pin definitions
.equ RxD =6 ; option schalter high res mode (slow)
.equ TxD =3 ; Transmit pin is PB3
.equ ccdport = PORTA
.equ ccdportdr = DDRA
.equ mux = 6 ; AD input = ADC6

; Bit numbers for output pins (geaetzte Platine)
.equ P1 = 1 ; Kabel 3
.equ P2 = 0 ; Kabel 1 (weiss)
.equ TG = 6 ; Kabel 8 Transfer gate
.equ rg = 5 ; Kabel 7 read Gate
.equ CL = 4 ; Kabel 5 Clamp
; Kabel 2,9,11 = GND, Kabel 4 = +5 V, Kabel 6=15V, Kabel 10 = Signal

; Polatities (0 = high puls or 1 = low puls)
.equ P1pol = 0
.equ P2pol = 0
.equ TGpol = 1 ; Transfer gate
.equ rgpol = 0 ; read Gate
.equ CLpol = 1 ; Clamp

; combine to one word - do xor (^ is bitwise xor) with this values befor writing to port
.equ allpol = P1pol * (1<<P1) + P2pol * (1<<P2) + Tgpol * (1<<Tg) + rgpol * (1<<rg) + CLpol * (1<<CL)
.equ ddrval = (1<<P1) + (1<<P2) + (1<<Tg) + (1<<rg) + (1<<Cl)

; ccd states:
.equ ccd_P1 = allpol ^ (1<<p1) ; first shift
.equ ccd_rg = allpol ^ ((1<<p1) + (1<<rg)) ; read pulse
.equ ccd_cl = allpol ^ ((1<<p1) + (1<<CL)) ; Clamp pulse (Bit Clamp mode)
.equ ccd_P2 = allpol ^ (1<<p2) ; second shift (read out phase)
.equ ccd_tg = allpol ^ ((1<<p1) + (1<<tg)) ; transfer gate aktive

.equ cellspg = 16 ; number of cells per group
; with 1 reading per Cell max 64 and min. 22
; with 2 readings max 32 min 11
.equ cellsg1 = 16 ; number of cells in first group (fine adjust position)
.equ groups = (1500/cellspg) + 1 ; groups * cellspg >= 1200 ! (number of ccd cells)

.equ cellspg_slow = 8 ; number of cells per group: min Value = 21 / AD readings

.equ groups_slow = (1500/cellspg_slow) + 1 ; groups * cellspg >= 1200 ! (number of ccd cells)

.equ Xtal = 16000 ; Clock in kHz
.equ badr = $80 ; UART out buffer in RAM: 32 Byte cyclic buffer

;***** Global register variables
.def stsave = R2 ; status save
.def bitcnt =R18 ; bit counter UART Send
.def TXbyte =R6 ; uart send data - aktive byte
.def Txinpos =R28 ; = YL next free place for data to be transmitted
.def Txoutpos =R26 ; = XL next data to be transmitted , no data if txinpos = txoutpos

.def it = r19 ; interrupt use tmp
.def tmp =R20 ;tmporary storage register
.def t2 = R21
.def t3 = r22
.def t4 = r23
.def sumL = r13
.def sumH = r14

.cseg
.org 0
rjmp reset
rjmp EXT_INT0 ; IRQ0 handler
rjmp PIN_CHANGE ; Pin change handler
rjmp TIM1_CMP1A ; Timer1 compare match 1A
rjmp TIM1_CMP1B ; Timer1 compare match 1B
rjmp TIM1_OVF ; Timer1 overflow handler
rjmp TIM0_OVF ; Timer0 overflow handler
rjmp USI_STRT ; USI Start handler
rjmp USI_OVF ; USI Overflow handler
rjmp EE_RDY ; EEPROM Ready handler
rjmp ANA_COMP ; Analog Comparator handler
rjmp ADC_con ; ADC Conversion Handler

;dummys:
EXT_INT0:
PIN_CHANGE:
TIM1_CMP1A:
TIM1_CMP1B:
TIM0_OVF:
TIM1_OVF:
USI_STRT: ; USI Start handler
USI_OVF: ; USI Overflow handler
EE_RDY: ; EEPROM Ready handler -> unused
ANA_COMP: ; Analog Comparator handler
RETI ; just in case an interrupt happens

;************************************************* *************
;***** ADC ready
; does UART Send as well !, sendet jeweils 1 Bit
ADC_con:
in stsave,SREG
tst bitcnt ; do UART send first
brne U_send ; send rest of byte
cp Txinpos,Txoutpos ; test for new byte
breq uart_done ; no new data to send
ld txbyte,x+ ; get data and count on
andi XL,$9F ; cyclic buffer 32 bytes (A0 changes to 80)
ldi bitcnt,10 ; 8 data + 2 stop
sbi PORTB,TxD ; send a '1' = Start bit
rjmp uart_done

U_send: lsr TXbyte ; get new data to carry, stop bits at end
brcs putchar1 ;If carry set
cbi PORTB,TxD ; send a '0'
rjmp putchar2 ;else
putchar1: sbi PORTB,TxD ; send a '1'
putchar2:
dec bitcnt
uart_done:
; adc is read in main prog ! interupt is for UART only
intdone:
out SREG,stsave
set ; set t flag to signal AD done ! (do this after restoring SREG!)
reti

;************************************************* **************************
;* "putchar"
; put one byte into output buffer
putchar: ; no test for buffer overflow yet !
com tmp ; data are inverted (better here than later)
cli
st y+,tmp
andi Txinpos,$9F ; cyclic buffer $80 to $9F
sei
ret ; return

;*************************
wait: dec tmp ; load waiting time to tmp delay. Delay is 3 * tmp + 4 Cycles , (including rcall and ret)
brne wait
ret

;*************************
; CCD Specific routines:
;************************************************* **************************
; ccd shift ohne AD:

ccdshift: ; shift data out (with bitclamp)
ldi tmp,ccd_p1
ldi t2,ccd_rg
out ccdport,tmp ; P1 Signal
out ccdport,t2 ; output gate (soll 200ns?)
nop
nop
nop
ldi t2,ccd_CL
out ccdport,tmp ; P1 Signal ?? noeting ?
out ccdport,t2 ; Clamp signal: (soll ca. 200 ns ? nicht zu lang ?)
nop
nop
nop
nop
out ccdport,tmp ; P1 Signal
nop
ldi tmp,ccd_p2
out ccdport,tmp ; output data are now visible !
; delay in calling procedure !, needed only if data are needed
ret

;*******************
ccdshiftAD:
rcall ccdshift ; shift new data to output
ad_read:
clt ; clear t Flag to wait for next AD
done1: brtc done1 ; wait for AD ready
in tmp, adcl
add sumL,tmp
in tmp, adch
adc sumH,tmp
ldi tmp,30 ; wait ca 3 us (Sample and hold and highest bit to be done)
rcall wait
ret
; AD result is data from cell before this shift!

;*****************************
; READ CCD and send out data
;*****************************
ccd_loop:
ldi t3,groups ; number of groups of cells = number of data to send
ldi t4,cellsg1 ; number of cells for first group (initial zeros), no real min number because of buffer
rcall ccdshiftAD ; get first dataset; first A/D value is useless (old)
; use version with AD to get in Sync with AD timing
ccd_lp1:
clr sumL ; clear sum of AD values
clr sumH
ccd_lp2:
rcall ad_read ; get AD data (read every cell twice for longer integration)
rcall ccdshiftAD ; get AD data and shift to new cell for next AD val
dec t4
brne ccd_lp2
mov tmp,sumL
rcall putchar ; send low byte (buffered)
mov tmp,sumH
rcall putchar ; send high byte
ldi t4,cellspg ; number of cells per group, at least 20 or 21 AD Readings to get data out
dec t3
brne ccd_lp1
ret

;*****************************
; READ CCD and send out data, slow mode
;*****************************
ccds_loop:
ldi t3,groups_slow ; number of groups of cells = number of data to send
ldi t4,cellsg1 ; number of cells for first group (initial zeros), no real min number because of buffer
rcall ccdshiftAD ; get first dataset; first A/D value is useless (old)
; use version with AD to get in Sync with AD timing
ccds_lp1:
clr sumL ; clear sum of AD values
clr sumH
ccds_lp2:
rcall ad_read ; get AD data (read every cell twice for longer integration)
rcall ad_read ; get AD data (read every cell twice for longer integration)
rcall ccdshiftAD ; get AD data and shift to new cell for next AD val
dec t4
brne ccds_lp2
mov tmp,sumL
rcall putchar ; send low byte (buffered)
mov tmp,sumH
rcall putchar ; send high byte
ldi t4,cellspg_slow ; number of cells per group, at least 20 or 21 AD Readings to get data out
dec t3
brne ccds_lp1
ret

;********************************
shiftloop : ; shift out large number of bits (all cells ?)
ldi t4,groups ; low byte of number of shifts
ldi t3,6 ; high byte of number of shifts
sl_lp:
rcall ccdshift
ldi tmp,255 ; extra delay for slow readout, long exposure
rcall wait
ldi tmp,255 ; extra delay for slow readout, long exposure
rcall wait

dec t4
brne sl_lp
dec t3
brne sl_lp
ret

Tgate:
ldi tmp,ccd_p1 ; well defined start state
out ccdport,tmp
ldi tmp,6 ; wait for setteling (about 1 us)
rcall wait
ldi tmp,ccd_tg
out ccdport,tmp
ldi tmp,50 ; wait transfer time (about 10 us)
rcall wait
ldi tmp,ccd_p1
out ccdport,tmp
ldi tmp,8 ; wait for setteling after readout (about 1,5 us)
rcall wait
ret


;***** Program Execution Starts Here
reset: ldi tmp,ramend ; init stackpointer
out SP,tmp
; set data directions:
ldi tmp,0 ; initial value port A
out PORTA,tmp
ldi tmp,ddrval ; AD at PA7 (CCD) and PA2 (optionale Photodiode)
out DDRA,tmp
ldi tmp,255 ; TX passive , pullups aktivieren um floating inputs zu vermeiden
out PORTB,tmp
ldi tmp,8 ; PB3 as output, rest as inputs
out DDRB,tmp

;init AD
ldi tmp,mux ; A/D Wandler status setzen, Ref = VCC, 8 Bit Ergebnis
out ADMUX,tmp
ldi tmp, (1<<ADEN)+(1<<ADSC)+(1<<ADFR)+(1<<ADIE)+7 ; A/D einschalten , free running mode und Interupt aktivieren
; takt = 16 MHz / 2^7 = 125 kHz (-> 9600 Baud)
out ADCSRA, tmp

ldi YL,$80 ; UART out buffer start position in RAM
ldi XL,$80

meldung1: ldi R31,HIGH(2*welcome) ; setup Z pointer hi welcome is word address
ldi r30,LOW(2*welcome) ; setup Z pointer lo
meldung: LPM tmp,Z
inc ZL
brne izh1
inc ZH
izh1: cpi tmp,0
breq meldung_done
rcall putchar ; sei is done in putchar!: enable interrupts : ad,uart - send
rjmp meldung
meldung_done:
rcall wait_uart
; rjmp meldung1
;************* main loop starts here
lop:
; rcall getchar ; wait and get byte to tmp
; rcall putchar ; send;
; rjmp lop
rcall tgate ; transfer data to shift cells
ldi tmp, $FF
rcall putchar
ldi tmp, $FF ; start signal ! to allow sync on PC
rcall putchar

in tmp,pinb
andi tmp,1<<6
breq lop_slow
rcall ccd_loop ; read and send data out
rjmp lop
lop_slow:
rcall ccds_loop ; read and send data out, high resolution - slow
rjmp lop

;****** subroutines:
wait_uart:
cp Txinpos,Txoutpos
brne wait_uart ; wait for all data to be send
ret
.cseg

welcome: ; Text message to be send at beginning (good for debuging without actual signal)
; maximum = 31 bytes (geht erst in den Puffer)

.db "CCD Line Sensor Interface",0
.db "xxxxxxx "


Die Kommentare sind leider etwas Deutsch/Englisch gemischt, da zum Teil auf PC mit amerikanerscher Tastatur geschrieben. Durch die Software UART ist das ganze leider auch relativ unübersichtlich.