Forum: Mikrocontroller und Digitale Elektronik Probleme mit Herrn Interrupt


von LPC1769 (Gast)


Lesenswert?

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

von LPC1769 (Gast)


Lesenswert?

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

von Carsten S. (dg3ycs)


Lesenswert?

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

von LPC1769 (Gast)


Lesenswert?

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.

von Oliver J. (skriptkiddy)


Lesenswert?

Kannst du nicht einfach das PWM-Modul nehmen und die PWM in Hardware 
machen?

Gruß Oliver

von LPC1769 (Gast)


Lesenswert?

Hallo,

danke euch allen!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.