Oliver B. schrieb:
> Zeile 42? :)
Im Gegenteil. Zeile 42 ist eine Leerzeile und damit ohne Fehler!
Leider kann man das von den anderen Zeilen nicht sagen...
Ein Blick auf die Hardware:
1 | /*
|
2 | 3 Buttons on Pins: PD6 - kalibrieren
|
3 | PD7 - messen
|
4 | PB0 - pfeilart
|
5 | PC4 - Uart on/off
|
6 |
|
7 | CCD_CONTROL pins: PB1 - rog
|
8 | PB2 - clock
|
9 |
|
10 | PC0 - ccd output signal
|
11 |
|
12 | LASER pin: PB5
|
13 |
|
14 | LCD pins: PD2 - D7
|
15 | PD3 - D6
|
16 | PD4 - D5
|
17 | PD5 - D4
|
18 | PB3 - E
|
19 | PB4 - RS
|
20 | */
|
21 | /*output from ccd*/
|
22 | #define ccd A0 // = PC0
|
23 | /*pins to control ccd and laser*/
|
24 | #define rog 9 // = PB1
|
25 | #define clock 10 // = PB2
|
26 | #define laser 13 // = PB5
|
27 | /*pins for buttons*/
|
28 | #define kalibrieren_pin 6 // = PD6
|
29 | #define messen_pin 7 // = PD7
|
30 | #define pfeilart_pin 8 // = PB0
|
Da passt auch nicht ein einziges Define (bzw. Kommentar) zum Schaltplan!
Beispiel: "ROG"-Signal, angeblich Wert "9", Kommentar "PB1" aber
angeschlossen an "PC0".
Ein Blick auf den Funktionalen Teil der Software:
1 | // --> 1kbyte SRAM --> Using 512 Pixel: 512*2byte = 1024byte
|
2 | #define PIXEL 512
|
3 | #define COMPLETE 2087
|
4 | const uint8_t EXP_HOLZPFEIL = 1000;
|
5 | const uint8_t EXP_CARBONPFEIL = 2000;
|
6 | int ccd_array [PIXEL];
|
7 |
|
8 | void ccd_routine (const uint8_t exposure) {
|
9 |
|
10 | //DUMMY RUN
|
11 | digitalWrite(rog,LOW); //RESET ROG
|
12 | delayMicroseconds(200);
|
13 | digitalWrite(rog,HIGH); //SET ROG
|
14 |
|
15 | for(int i=0;i<PIXEL;i++) {
|
16 |
|
17 | digitalWrite(clock,LOW); //RESET CLOCK
|
18 | delayMicroseconds(1);
|
19 | digitalWrite(clock,HIGH); //SET CLOCK
|
20 | }
|
Aha, ein Dummy run über alle 512 Pixel. Was ist mit den anderen ~1500
Pixel? Der Sensor hat effektiv 2048 Pixel und real noch ein paar mehr.
1 | //EXPOSURE TIME
|
2 | digitalWrite(laser,HIGH); //LASER HIGH
|
3 | digitalWrite(rog,LOW); //RESET ROG
|
4 | delay(exposure);
|
5 | digitalWrite(rog,HIGH); //SET ROG
|
6 | digitalWrite(laser,LOW); //LASER LOW
|
Zwei Sekunden Belichtungszeit fühlt sich ein bischen lang an.
Oder schaltest du das Licht vorher aus? Laser an hört sich nicht nach
wenig Licht an...
1 | //MEASURE
|
2 | for(int i=0;i<COMPLETE;i++) {
|
3 |
|
4 | if (i>29 && i<2081) {
|
5 | j++;
|
6 | digitalWrite(clock,LOW); //RESET CLOCK
|
7 | analogRead(A1); //low phase so lange wie high phase
|
8 | digitalWrite(clock,HIGH); //SET CLOCK
|
9 | if(j == 4) {
|
10 | ccd_array[x] = analogRead(ccd);
|
11 | j=0;
|
12 | x++;
|
13 | }
|
14 | }
|
15 | }
|
16 | }
|
1. Das Auslesen des ADC damit die high und low Phasen der Clock
gleichlang sind ist so wie es programmiert wurde wirkungslos, denn so
sind die Clock Phasen abhängig vom adressierten Pixel.
2. Die Clock wird garnicht erzeugt für Pixel <=29 und >=2081. Damit
werden nicht die Pixel gelesen welche der Programmierer eigentlich lesen
wollte, weil bei Pixel 30 erst Pixel 1 aus dem Sensor kommt...
3. Datenblatt Fig.2 sagt, dass VOUT gültig ist wenn die Clock low ist.
Das heißt der Wert ccd_array[x] wird beim falschen analogRead()
gespeichert und ist damit immer undefiniert.