www.mikrocontroller.net

Forum: Compiler & IDEs ARM9 - Interruptprobleme


Autor: Christian K. (chriskl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,

ich habe mit meinem ATMEL-ARM9 (at91sam) ein TimerInterrupt Problem. Ich 
brauche einen Timer, der mir einen Takt einer bestimmten Frequenz 
vorgibt. Die Taktung funktioniert schon. Jedoch habe ich das Problem, 
dass eine globale Variable isr_state immer 0 bleibt, obwohl ich 
isr_state in der ISR explizit auf 1 setze. Zu erkennen ist dies durch 
die Ausgabe von isr_state im Interrupt.

Hier ist mein Code. Er ist übernommen und ein wenig modifiziert von der 
ATMEL Seite.

Vielleicht hat einer von Euch einen Tipp und kann mir weiterhelfen.
#include <aic/aic.h>
#include <tc/tc.h>

volatile unsigned int isr_state = 0;

//------------------------------------------------------------------------------
/// Interrupt handler for TC0 interrupt. 
//------------------------------------------------------------------------------
void ISR_TC0(void)
{
  // Setze isr_state und gebe isr_state aus
  isr_state = 1;
  printf("iTick mit %i", isr_state);
  
  // Clear status bit to acknowledge interrupt
  AT91C_BASE_TC0->TC_SR;
}


//------------------------------------------------------------------------------
/// Configure Timer Counter 0 to generate an with specific frequency
//------------------------------------------------------------------------------
void ConfigureTC(unsigned int freq)
{
    unsigned int div;
    unsigned int tcclks;

    // Enable peripheral clock
    AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_TC0;

    // Configure TC for a 4Hz frequency and trigger on RC compare
    TC_FindMckDivisor(freq, BOARD_MCK, &div, &tcclks);
    TC_Configure(AT91C_BASE_TC0, tcclks | AT91C_TC_CPCTRG);
    AT91C_BASE_TC0->TC_RC = (BOARD_MCK / div) / freq; // timerFreq / desiredFreq

    // Configure and enable interrupt on RC compare
    AIC_ConfigureIT(AT91C_ID_TC0, AT91C_AIC_PRIOR_LOWEST, ISR_TC0);
    AT91C_BASE_TC0->TC_IER = AT91C_TC_CPCS;
    AIC_EnableIT(AT91C_ID_TC0);
}

Und dann in der Funktion, wo ich den Timer benötige:
void TimerFunction(unsigned int freq, unsigned int loops)
{
  int i;
  
  // Inititalisierung des Timers
  ConfigureTC(freq);
  
  isr_state = 0;
  // Start des Timers
  TC_Start(AT91C_BASE_TC0);
  
  
  for(i=0;i<loops;i++)
        {
    while (isr_state == 0)
                {
      // Warten bis Interrupt ausgelöst wurde
    }
          isr_state = 0;  // Rücksetzen des Status
    printf("Tick"); // Meldung
  }
  
  // Stopp des Timers
  TC_Stop(AT91C_BASE_TC0);
}

Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Evtl. ein ; in der while-loop (leeres statement)?
Looped die Funktion TimerFunction nicht völlig unnötig (=>performance)?

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.