Probleme mit Herrn Interrupt

Gast #2672916
Hallo zusammen,

ich bin grad am verzweifeln :-)
Ich programmiere einen LPC1769 von NXP. Ich möchte eine Software PWM 
programmieren und habe zum testen eine LED an den PORT gehängt.

Meine Einstellungen sind:
1
LPC_TIM0->MR0 = 976;  // match register 0
2
LPC_TIM0->MCR = 0x0000;
3
LPC_TIM0->MCR |= (0x3<<0);  // Interrupt + reset
4
LPC_TIM0->MR1 = pwm_wert;
5
LPC_TIM0->MCR |= (0x1<<3);  // interrupt if MRX = TC
D.h. wenn MR0 erreicht wurde soll er den Timer zurücksetzten und einen 
Interrupt auslösen. Wenn MR1 erreicht wurde soll er nur einen Interrupt 
auslösen.
1
void TIMER0_IRQHandler(void)
2
{
3
 if (LPC_TIM0->IR & (0x1 << 0))
4
 {
5
  LPC_TIM0->IR |= (0x1 << 0); // kill flag
6
  MYPORT->FIOSET |= (1 << 12);
7
 }
8
 if (LPC_TIM0->IR & (0x1 << 1))
9
 {
10
  LPC_TIM0->IR |= (0x1 << 1);
11
  MYPORT->FIOCLR |= (1 << 12);
12
 }
13
}
Das funktioniert, so lange der pwm_wert nicht zu klein ist, sonst leutet 
die LED mit voller Power d.h. der lässt den Interrupt irgendwie aus.
Könnte ihr mir sagen was ich falsch mache?
Vielen Dank
Gast
Jetzt Antworte ich mir noch mal schnell selbst. Ich habe jetzt alles 
gelöscht und noch mal nur den Interrupt aktiviert. So ganz funktionieren 
tut es immer noch nicht. Für zu große Werte spinnt er immer noch. Ich 
habe meine Frage auch gerade noch mal hier gepostet. Dort findet sich 
auch der komplette Testcode.

http://knowledgebase.nxp.com/showthread.php?p=16360#post16360

Grüße
gillys
Hi,

LPC1769 schrieb im Beitrag #2672916:
> Das funktioniert, so lange der pwm_wert nicht zu klein ist, sonst leutet
> die LED mit voller Power d.h. der lässt den Interrupt irgendwie aus.
> Könnte ihr mir sagen was ich falsch mache?

Nur mal zwischen Tür und Angel ins blaue geraten...
Da ich gerade das vollständige Initverhalten der ARMs bei konkurierenden 
Interruptanforderungen und insbesondere die Besonderheiten und 
Einstellmöglichkeiten bei NXP (verwende ich fast nie) nicht im Kopf 
habe:

Kann es sein, das wenn du den PWM Wert hoch setzt die Zeit zwischen dem 
Auslösen des Timers 1 und dem nachfolgendem Auslösens des Timer0 einfach 
zu kurz wird.
Also Timer1 löst Interrupt aus, Interruptbearbeitung beginnt -UND NOCH 
WÄHREND DER INTERRUPTBEHANDLUNG schlägt dann der Timer0 an will 
seinerseits einen Interrupt auslösen?
Dadurch wird dann mindestens einer der beiden Interrupts ja nicht mehr 
wie vorgesehen abgearbeitet. Eventuell mal die ZEit ermitteln die eine 
Interruptabarbeitung braucht (Aufwendig versuchen zu berechnen was bei 
aRM oder MIPS schon nicht mehr so einfach ist wie bei den kleinen 8Bit 
PIC oder AVR oder durch Port Toggeln am Beginn und Ende der Schleife mit 
einem Skope einfach messen...)

Gruß
Carsten
Gast
Hallo

danke für deine Antwort. Im Moment habe ich den Wert mit dem Debugger 
geändert, später mal soll er mit in der Interruptroutine geändert 
werden. Ich glaube ich habe das Problem gefunden. Ich dachte nach dem 
auslösen des Interrupts werden alle anderen gesperrt, aber es läuft wohl 
folgendermaßen ab:
Der Interrupt für den MR1 (z.B. 995) kommt und der ruft mir den 
Interruptvektor auf. Währenddessen kommt auch noch der zweite (MR0) 
Interrupt und bei Begin der Interruptroutine sind beide Bits gesetzt. 
Daraufhin schaltet er mit die LED nicht aus und sofort wieder an sondern 
ein und dann wieder aus.

Wie ich das löse ohne hässliche lange Abfragen ist mir ein Rätsel.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.