Forum: Mikrocontroller und Digitale Elektronik ov7670 cameramodul


von leluno (Gast)


Angehängte Dateien:

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?

von Dirk K. (dekoepi)


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

: Bearbeitet durch User
von leluno (Gast)


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.

von Dirk K. (dekoepi)


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. ;)

: Bearbeitet durch User
von leluno (Gast)


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????????????????

von Dirk K. (dekoepi)


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.

von leluno (Gast)


Lesenswert?

Der Speicher reicht:
Device: atmega1284p

Program:   19056 bytes (14.5% Full)
(.text + .data + .bootloader)

Data:      14472 bytes (88.3% Full)
(.data + .bss + .noinit)

von leluno (Gast)


Lesenswert?

Dirk K. schrieb:
> Probiere mal mehr Durchläufe mit weniger Zeilen auslesen und
> entsprechend verkleinertem Puffer.

Auch das hab ich probiert.  Ich hör jetzt erst mal auf. Wenn ich wieder 
Lust dazu habe, werde ich das Programm au einen LPC1768 laden und dann 
mit dem Debugger nach dem Fehler suchen.

von leluno (Gast)


Lesenswert?

Aufhören hilft immer. Hier steckte der Fehler:

while(!vsync && (zl_y<(max_y*(n+1)))){//start frame

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.