Forum: Mikrocontroller und Digitale Elektronik ADNS3090 nur jede zweite Zeile


von Daniel V. (voda) Benutzerseite


Angehängte Dateien:

Lesenswert?

Guten Abend liebes Forum,

leider habe ich ein Problem mit meinem ADNS3090 auf einem STM32F4, und 
zwar es wird nur jede zweite Zeile übertragen.

Ich habe das SPI-Zeitdiagramm (siehe Bild) wie folgt implementiert:

Funktion adns_FrameCapure_Config:
1
void adns3090_FrameCapure_Config(void)
2
{
3
 ADNS3090_NSS_LOW;
4
  delay_us(1);
5
  /*FRAME_CAPTURE = 0x13*/
6
  adns3090_Write(SPI2,ADNS3090_FRAME_CAPTURE|0x80);
7
  delay_us(50);
8
  adns3090_Write(SPI2,0x83);
9
  delay_us(50); 
10
 ADNS3090_NSS_HIGH;
11
  /*Warte 3 Frames + 10 µs = 1/2000 * 3 + 10 = 1510 µs*/
12
  delay_us(1510);
13
}

und die Pixelübertragung:
1
{
2
  bool is_first_pixel = false;
3
  adns3090_FrameCapure_Config();
4
  ADNS3090_NSS_LOW;
5
  //adns3090_Read(SPI2, ADNS3090_FRAME_CAPTURE);
6
  delay_us(50); /*t_SRAD*/
7
   
8
   for (i=0; i<ADNS3090_RESOLUTION;)
9
   {
10
    for (j=0; j<ADNS3090_RESOLUTION;)
11
    {
12
     register_val = adns3090_Read(SPI2,ADNS3090_FRAME_CAPTURE);
13
     if(!is_first_pixel && (register_val&0x40))
14
     {
15
      i=0;
16
      j=0;
17
     /* Wird der Firstframemarker 0x40 nicht gefunden, 
18
     wird meine DEBUG-LED aktiviert, welche in der Funktion
19
     implementiert ist */
20
      adns3090_fail();          
21
     }
22
     else
23
     {
24
      is_first_pixel = true;
25
      *image = (register_val<<2);  
26
      USART_SendData(USART3, *image); /*Sende Pixel an die USART*/
27
      delay_us(10); /*t_LOAD*/
28
      image++;    
29
     }
30
    delay_us(50);
31
    j++;
32
    }  
33
     if(is_first_pixel)
34
      {
35
       i++;
36
      }
37
    }
38
  ADNS3090_NSS_HIGH;
39
  delay_us(14); /*t_BEXIT*/
40
 }

Und die main:
1
uint8_t picture[1536];
2
3
int main (void)
4
{
5
  startUp();
6
  USART_config();
7
  adns3090_STARTUP();
8
  SysTick_Init();
9
10
  while(1)
11
  {
12
   SystemCoreClockUpdate();  
13
   adns3090_Pixel_Burst(picture);
14
  }
15
}

Das Bildergebnis sieht irgendwie komisch aus. Die 
Übertragungsgeschwindigkeit passt, aber irgendwie wird etwas 
verschluckt.

Kann mir da einer einen Rat geben?

Danke und Gruß
Daniel

: Bearbeitet durch User
von Jim M. (turboj)


Lesenswert?

Kann es sein dass die USART_SendData() Funktion zu lange braucht? Ich 
hätte das gepuffert und erst danach übertragen.

von Daniel V. (voda) Benutzerseite


Lesenswert?

Jim M. schrieb:
> Kann es sein dass die USART_SendData() Funktion zu lange braucht?
> Ich
> hätte das gepuffert und erst danach übertragen.

Ja so in etwa habe ich das auch erst gemacht, da ist meine 
Übertragungsgeschwinidgkeit in den Keller gegangen.
1
int main (void)
2
{
3
 uint8_t picture [1536];
4
 int imageData;
5
 int n;
6
 while(1)
7
 {
8
   adns3090_Pixel_Burst(picture);
9
   for (n=0;n<900;)
10
   {
11
    imageData = picture [n];
12
    USART_SendData(USART3, imageData); 
13
   }
14
 }
15
}
Hmm, Moment mal,  beim schreiben fällt mir gerade auf, ich sende die 
Daten über die Funktion USART_SendData aber ich warte kein Flag ab, d.h. 
er sendet weiter auch wenn das Register leer ist (0x00)...

Muss ich verifizieren, wenn ich zuhause bin und ich halte euch weiter 
auf dem Laufenden...

Danke und Gruß
Daniel

: Bearbeitet durch User
von Daniel V. (voda) Benutzerseite


Angehängte Dateien:

Lesenswert?

So ihr Lieben,

soweit läuft das System, hab aber noch eine böse Verschiebung. Hier der 
Code:
1
void adns3090_Pixel_Burst(uint8_t *image)
2
{
3
 bool is_first_pixel = false;
4
 uint8_t adns3090_pixel;
5
 
6
 adns3090_FrameCapure_Config();
7
 ADNS3090_NSS_LOW;
8
 delay_us(50);
9
    
10
 for (i=0; i<ADNS3090_RESOLUTION;)/*=30*/
11
 {
12
   for (j=0; j<ADNS3090_RESOLUTION;)/*=30*/
13
     {
14
       /* Register: 0x40 */ 
15
       register_val = adns3090_Read(SPI2,ADNS3090_PIXEL_BURST);
16
       if(!is_first_pixel && (register_val&0x40))
17
        {
18
   i=0;
19
   j=0;
20
         /*Dies ist eine Fehlerfunktion, hier blinkt meine Debug-LED*/
21
         adns3090_fail();      
22
  }
23
  else
24
  {
25
   is_first_pixel = true;
26
   *image = (register_val<<2);  
27
   delay_us(10); 
28
   adns3090_pixel = *image;
29
   image++;
30
   send_image(adns3090_pixel); /*sendet das Bild zur USART*/ 
31
  }
32
      delay_us(50);
33
      j++;
34
     }  
35
     if(is_first_pixel)
36
     {
37
       i++;
38
     }
39
    }
40
 ADNS3090_NSS_HIGH;
41
 delay_us(14);
42
}

Der Fehler lag an die USART-Flags und ich habe das falsche Register 
abgefragt. Dennoch habe ich einen Versatz in meiner Bildausgabe (siehe 
Bild). Dieser wandert auch von Frame zu Frame. Ich habe auch einen 
wandernen Versatz.

Was kann das sein?

Danke und Gruß
Daniel

Beitrag #4954796 wurde vom Autor gelöscht.
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.