Forum: Mikrocontroller und Digitale Elektronik ADNS3090 nur jede zweite Zeile


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Daniel V. (voda) Benutzerseite


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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


Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.