- Labornetzteil AliExpress         
Ergebnis 1 bis 9 von 9

Thema: Cortex M3 unerklärliches Interrupt Verhalten

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076

    Cortex M3 unerklärliches Interrupt Verhalten

    Ich habe ein Problem mit dem LPC1768 Timer generell:
    Ich habe den Timer so initialisiert, daß er jede milli Sekunde aufgerufen wird.
    Im Timerinterrupt drehe ich lediglich ein Portbit um, damit ich mit dem Ossi messen kann ob das Timing stimmt.
    Das Timiung stimmt absolut. Da ich das Portbit bei jedem Interrupt umdrehe XOR müste aber ein symetrisches Rechteck herauskommen.
    Aber, es kommt eine 650 nano Sekunden Flanke gefolgt von dem Rest der gewünschten einen milli Sekunde heruas.
    Ähnlich einer extrem schmalen PWM. Wenn ich die letzte blödsinnige Zeile x-- mit reinkompiliere geht es einwandfrei.
    Wo ist denn da der Zusammenhang. Ich Suche schon den ganzen Tag.
    Erstaunlich aber auch, wenn ich zuerst das Interrupt Bit MR0INT lösche und dann das Portbit umdrehe geht es auch ohne das
    blödsinnige x--. Der Zusammenhang ist mir bisher nicht erklärlich.
    ich kann aber statt x-- auch for (x=0; x < 100; x++) ; benutzen, dann geht es auch wieder richtig.
    Der eigentliche Code scheint also keine Rolle zu speilen, Hauptsache da kommt noch was.
    Ich kann das Interruptbit auch 2 mal löschen dann geht es auch wieder richtig.
    Es sieht so aus, als wenn der Prozossor es nicht mag, wenn als letzte Aktion in der Interrupt Routine das entsprechende
    Interruptbit gelöscht wird. Ich habe es auch mit den Timern 1 2 und 3 probiert, die verhalten sich alle gleich "falsch"
    Steht ein Stück Progrmmcode hinter dem Löschen des Interruptbits ist alles in Ordnung.


    Code:
    int x;
    
    void TMR3_IRQHandler (void)
    {
    
      LPC_FIO1PIN.value   ^= 2;    /* Portbit umdrehen (Oszilloskope Signal) */
      LPC_T3IR.bits.MR0INT = 1;    /* Interrupt Bit loeschen */                 
    
      x--;     /* voelliger Blödsinn, aber ohne geht es nicht richtg ??????? */
    }
    Ein bischen Google und das Problem wurde mir tatsächlich exakt so bestätigt.
    Ganz egal ob NXP oder Analog Devices, der Cortex M3 Kern ist schuld. Das ist jetzt aber nicht negtiv gemeint.
    Ein "DSB" Befehl "Data Synchronization Barrier" als letzter Befehl wirkt Wunder.
    Hiermit wird sichergestellt, daß alle Speicherzugriffe komplett erledigt sind bevor ein neuer Befehl eingeleitet wird.
    Also entweder das Interruptbit NICHT als LETZTES löschen dann z.B. mittels "DSB" Befehl dafür sorgen, das alles reibungslos abläuft.
    Ich hätt mal vorher googlen sollen, aber dafür bin ich stolz es selbst gefunden zu haben.

    Bei IAR Embedded Workbench kann ich den DSB Befehl in der C-Source-Datei so eingeben:

    __asm("DSB"); /* Data Synchronization Barrier */


    ein schönes Wochenende wünsche ich allen.
    Siro
    Geändert von Siro (01.07.2011 um 15:24 Uhr)

Ähnliche Themen

  1. Software Reset Cortex M3
    Von Siro im Forum ARM - 32-bit-Mikrocontroller-Architektur
    Antworten: 8
    Letzter Beitrag: 30.01.2011, 23:06
  2. ARM Cortex M3 KettenRoboter
    Von Pajonilaus im Forum ARM - 32-bit-Mikrocontroller-Architektur
    Antworten: 2
    Letzter Beitrag: 30.06.2010, 19:59
  3. Cortex M3 Ramfunction
    Von Siro im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 2
    Letzter Beitrag: 27.04.2010, 09:34
  4. Unerklärliches Zurücksetzen von Variablen im SRAM
    Von autoguider im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 9
    Letzter Beitrag: 04.10.2007, 16:07
  5. Antworten: 9
    Letzter Beitrag: 17.07.2006, 23:47

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress