mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zeitverzögerung IAR AT91SAM7S


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey Leute,

habe schon gesucht, aber irgendwie die Lösung für mein Problem nicht 
gefunden. Sorry. Deswegen hier meine Frage:

Ich programmiere den AT91SAM7S25 mit IAR. Jetzt möchte ich in meinen 
Code eine kleine Zeitverzögerung einbauen. Bisher kannte ich bei anderen 
Programmen:
Sleep()
delay_ms()
delay_us()
#asm(nop);
#asm nop #endasm;

Habe auch schon Varianten ausprobiert, aber ohne Erfolg.


Welche Headerdatei muss ich denn einbinden und welcher Befehl ist hier 
der richtige?

Vielen Dank
Schönes Wochenende
Peter

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab Beispiele Programme gesehen, die dafür den 
"Periodic-Interval-Timer" verwenden ... Kuck mal auf der Seite von 
Martin Thomas ... Da gibt's Beispielprogramme ...

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

Bewertung
0 lesenswert
nicht lesenswert
Oder so ...
#include "interrupt_utils.h"



#ifdef ERAM  /* Fast IRQ functions Run in RAM  - see board.h */

#define ATTR RAMFUNC

#else

#define ATTR

#endif


#define TCK  1000                           /* Timer Clock  */
#define PIV  ((MCK/TCK/16)-1)               /* Periodic Interval Value */

volatile unsigned long timeval;             /* Current Time Tick */

void  NACKEDFUNC ATTR system_int (void) {        /* System Interrupt Handler */

  volatile AT91S_PITC * pPIT = AT91C_BASE_PITC;
  ISR_ENTRY();
  if (pPIT->PITC_PISR & AT91C_PITC_PITS) {  /* Check PIT Interrupt */
    timeval++;                              /* Increment Time Tick */
    *AT91C_AIC_EOICR = pPIT->PITC_PIVR;     /* Ack & End of Interrupt */
  } else {
    *AT91C_AIC_EOICR = 0;                   /* End of Interrupt */
  }
  ISR_EXIT();
}

void init_pit (void) {                    /* Setup PIT with Interrupt */
  volatile AT91S_AIC * pAIC = AT91C_BASE_AIC;
  *AT91C_PITC_PIMR = AT91C_PITC_PITIEN |    /* PIT Interrupt Enable */ 
                     AT91C_PITC_PITEN  |    /* PIT Enable */
                     PIV;                   /* Periodic Interval Value */ 

  /* Setup System Interrupt Mode and Vector with Priority 7 and Enable it */
  // mt pAIC->AIC_SMR[AT91C_ID_SYS] = AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED | 7;
  pAIC->AIC_SMR[AT91C_ID_SYS] = AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE | 7;
  pAIC->AIC_SVR[AT91C_ID_SYS] = (unsigned long) system_int;
  pAIC->AIC_IECR = (1 << AT91C_ID_SYS);
}

und Verwendet wird das dann so:
static void wait(unsigned long time)
{
  unsigned long tick;
  tick = timeval;
  // Wait for specified Time 
  while ((unsigned long)(timeval - tick) < time);
}

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Btw: Bist du es, Peter? Der Assembler-SID-Peter? :-)

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.