ov7670 cameramodul

Gast #3612376
Lesenswert?

Ich habe diesen ov7670 code und bekomme damit eine Art "Bild".
1
void getPic(void){
2
u8 zl_y=0,zl_Sp,n,ii;
3
u16 i;
4
u16 index=0;
5

6

7
for(n=0;n<4;n++){
8

9

10

11
//Bild aufnehmen
12
if(!vsync)while(!vsync);
13
while(vsync);
14
zl_buf=0;
15
while(!vsync && (zl_y<max_y)){//start frame
16
  while(!href);
17
//start row
18

19
//offset
20
if (pclk){while(pclk);}
21
for(ii=0;ii<44*n*2;ii++){
22
while(!pclk);
23
while(pclk);
24
}
25

26

27
    while(href){
28
//      if (pclk){while(pclk);}
29
      while(zl_buf<((zl_y*max_x+max_x)*2)){//start row
30
      //Warten auf steigende Flanke pclk
31
      while(!pclk);
32
      buffer[zl_buf]=PINA;
33
      zl_buf++;
34
      while(pclk);
35
      }
36
    ;//rest row
37
    }//row
38
    zl_y++;
39
}//frame
40

41

42
//Bild malen:
43
  for(i=0;i<max_y;i++){
44
  lcd_setcursor(n*44+10,120+i);
45
  lcd_write_index(0x0022);
46

47
   cs_lcd_off;
48
  LCD_Write_Data_Start();
49
  for( index = i*max_x*2; index < ((i*max_x+max_x)*2); index+=2 )  {
50
    lcd_write_data_only((buffer[index]<<8)+buffer[index+1]);
51
  }
52
  cs_lcd_on;
53
//_delay_ms(10);//  wait;
54
}//i
55
}//n
56
}//getPic


der ov ist auf QCIF = 176 x 144 Pixel eingestellt. Das Bild soll in vier 
Durchläufen jeweils um 44Pixel versetzt aufgenommen und gezeichnet 
werden.

Irgendwas klappt mit der versetzten Aufnahme nicht. Der buffer wird bei 
den Durchgängen n>0 nicht überschrieben, so dass das erste Teilbild 
4fach dargestellt wird. Was stimmt an meinem Aufnahme-Offset nicht?
Angehängte Dateien:
#3612388
Lesenswert?

Hm, du steuerst den FIFO nicht aktiv? Oder war Write Enable gar nicht 
ausgeführt?

Siehe etwa hier:
http://www.rpg.fi/desaster/blog/2012/10/20/ov7670-fifo-msp430-launchpad/
1
On request via UART, capture image to FIFO
2
Wait for VSYNC to go high
3
Set WEN high
4
Wait for VSYNC to go low
5
Set WEN low
6
Ta-da! There’s now an image waiting in the FIFO memory

Also Bild in den FIFO per WEN High/Low. Nach dem Auslesen nochmal RRST 
anschubsen, der sollte gleichzeitig WRST auslösen (habe keinen 
Link-Beleg zur Hand, aber das so in einer der zahlreichen Quellen 
gelesen).

Für den Chip finde ich diese Seite einen nützlichen Startpunkt:
http://wiki.beyondlogic.org/index.php/OV7670_Camera_Module_with_AL422_FIFO_Theory_of_Operation
Gast #3612459
Lesenswert?

mein modul hat keinen fifo. Der Datenbus geht direkt in den 
Atmega1284-buffer. Da die Kapazität des buffers beschränkt ist, muss das 
Bild in vier Teile zerlegt werden.

Das speichern des Bildes wäre erst das nächste Problem.
#3612518
Lesenswert?

Ich glaube, die Herangehensweise ist etwas verquer: Der Chip sendet ja 
ganze Zeilen, nicht vier quadratische Sektoren. Ich würde daher 
umstellen auf 4*38 Zeilen auslesen und auf das Display zeichnen.

So ganz steige ich durch den Code nicht durch, da fehlt was.

Ich sehe unter anderem die max_x und max_y-#defines nicht, ist mit denen 
alles in Ordnung?
Wie sieht buffer[zl_y] aus? Die Zeile hier:
while(zl_buf<((zl_y*max_x+max_x)*2)){//start row

wird ja schon beim zweiten Pixel riesig. Ist die Formel so korrekt? Bei 
Pixel 44 und einem max_x von 44 sind wir schon weit jenseits des 
8-Bit-Bereichs. ;)
Gast #3612788
Lesenswert?

das sind die defines:
u8 buffer[14000];//=>80x80x2=12800, 176x38x2=13376
#define max_x 176//44
#define max_y  38//144
u16 zl_buf;

Der Hinweis auf 176x38 Pixel war gut. das habe ich umgesetzt. Das 
Problem bleibt aber. Der Wert zl_buf endet beim ersten Durchgang mit 
13376, wird dann auf 0x00 gesetzt und bleibt im 2.-4. Durchgang 
merkwürdigerweise auf 0.

Warum wird zl_buf++ dann nicht mehr ausgeführt????????????????
#3612792
Lesenswert?

Der ATMega1284 ( 
http://www.atmel.com/devices/atmega1284.aspx?tab=parameters ) hat 16 
kByte SRAM. Für den Puffer verbrätst du davon schon 13,5kByte, bleiben 
noch 2,5 kByte für Stack, Variablen und Co. - vielleicht ist da einfach 
zuwenig Platz über (hast du eventuelle noch andere Puffer erstellt, für 
andere Zwecke?). Wenn der Stack nicht mehr ausreicht, gibt es nicht 
zwingend eine Fehlermeldung, sondern komisches Verhalten.

Probiere mal mehr Durchläufe mit weniger Zeilen auslesen und 
entsprechend verkleinertem Puffer.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren