mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik die zeit vom interrupt bis zum pin toggle


Autor: sputnik (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

ich arbeite gerade an meinem ersten arm projekt, ich versuche mit dem 
olimex AT91SAM7X256 + TFT+ Ethernet (SAM7-EX256) board über ein vga 
interface einen monitor anzusteuern....
das ganze funktioniert auch, jedoch hab ich probleme mit der zeit bis 
der erste pixel gesetzt wird.

Das hsync signal mit dem jeder neue zeilenbeginn signalisiert wird, wird 
durch ein pwm signal generiert. d.h.: ich bin in der funktion draw() und 
warte bis ein neuer zeilenbeginn durch den pwm interrupt
signalisiert wird, die funktion draw() wartet bis das draw_flag gesetzt 
worden ist um dann mit der pixel-ausgabe zu beginnen.

die pixelausgabe erfolgt durch das setzen von portpins, das problem ist
das die zeit zwischen dem interrupt und der ausgabe des ersten pixels 
variiert, somit erhalte ich keine schönen geraden balken am monitor 
sondern balken mit zacken...siehe Bild
jetzt wollte ich euch fragen wie kann ich das verhindern das die zeit
vom interrupt bis zum setzen der portpins nicht variiert?
hier ist einmal der interruptrequest handler in der startup datei
/* ======================================================================== */
AT91F_Irq_Handler:

/* Manage Exception Entry          */
/* Adjust and save LR_irq in IRQ stack  */
        sub      lr, lr, #4
        stmfd    sp!, {lr}

/* Save r0 and SPSR (need to be saved for nested interrupt)  */
        mrs      r14, SPSR
        stmfd    sp!, {r0,r14}

/* Write in the IVR to support Protect Mode          */
/* No effect in Normal Mode                  */
/* De-assert the NIRQ and clear the source in Protect Mode  */
        ldr      r14, =AT91C_BASE_AIC
        ldr      r0 , [r14, #AIC_IVR]
        str      r14, [r14, #AIC_IVR]

/* Enable Interrupt and Switch in Supervisor Mode  */
        msr      CPSR_c, #ARM_MODE_SVC

/* Save scratch/used registers and LR in User Stack  */
        stmfd    sp!, { r1-r3, r12, r14}

/* Branch to the routine pointed by the AIC_IVR  */
        mov      r14, pc
        bx      r0

/* Manage Exception Exit                    */
/* Restore scratch/used registers and LR from User Stack  */
        ldmia    sp!, { r1-r3, r12, r14}

/* Disable Interrupt and switch back in IRQ mode  */
        msr      CPSR_c, #I_BIT | ARM_MODE_IRQ

/* Mark the End of Interrupt on the AIC  */
        ldr      r14, =AT91C_BASE_AIC   
        str      r14, [r14, #AIC_EOICR]  

/* Restore SPSR_irq and r0 from IRQ stack  */
        ldmia    sp!, {r0,r14}
        msr      SPSR_cxsf, r14

/* Restore adjusted  LR_irq from IRQ stack directly in the PC  */
        ldmia    sp!, {pc}^   


hier die pwm Interrupt routine...
void ISR_PWM(void){

  draw_flag   = 1;
  //acknowledge interrupt
  if ((AT91C_BASE_PWMC->PWMC_ISR & AT91C_PWMC_CHID2) == AT91C_PWMC_CHID2){   
  }
}

und hier die funktion draw()
void draw(void){

  unsigned int pix_count;
  unsigned int delay;

  while(1){

    while(draw_flag != 1);
    
    for(pix_count=0;pix_count<13;pix_count++){ //38
      __asm__ __volatile__( "NOP" );
    }

    for(pix_count=0;pix_count<8;pix_count++){
      for(delay=0;delay<2;delay++){
        pPIO_B->PIO_ODSR   =   0x78840000;
      }
      for(delay=0;delay<2;delay++){
        pPIO_B->PIO_ODSR   =   0x00000000;
      }
       
    }
  draw_flag = 0;

  }

  //line_count++;
}

wäre echt cool wenn jemand ne idee hätte was man da tun kann

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.