AT89C51CC02 PWM-Interrupt

Gast #942156
Lesenswert?

Hallo, ich möchte mit meinem AT89C51CC02 ein PWM-Signal erzeugen, was 
auch prima klappt. Nun möchte ich über High/Low-Wechsel per Interrupt 
benachrichtigt werden.

Dazu kann man anscheinend das ECCFn-Bit im CCAPMn-Register zu den Bits 
PWMn und ECOMn hinzuschalten. Das sollte nach einem EC = 1 (enable 
counter interrupt) dazu führen, daß ein PCA-Compare zu einem 
PCA-Interrupt führt.  Die Interrupts sind schon global eingestellt (ich 
verwende bereits erfolgreich Timer, ADC und CAN-Receive).

Meine PCA-Interrupt sieht so aus (ohne Inhalt):

void pca_interrupt(void) interrupt 4  using 1
{
   ... z. B. High/Lows mitzählen ...
}

Fehlt hier noch was? Mein PCA-Interrupt wird nie aufgerufen... :(
Gast #942440
Lesenswert?

Hm. Da ich total verzweifelt war, hab ich mal einen 
Highspeed-output-Mode programmiert. Dabei bin ich nun auch auf Interrupt 
6 in einem Beispiel aus dem Web gestoßen, was auch prima läuft:

void pca_interrupt interrupt 6 using 1
{
  CCF0 = 0;
  CCAP0H += 0x30; // Increase compare values by 3000h counts
}

void main()
{
  CMOD = 0x02; // Setup PCA Timer
  CL = 0x00;
  CH = 0x00;
  CCAP0L = 0xFF; // Set Event trigger values
  CCAP0H = 0xFF;
  CCAPM0 = 0x4D; // Set PCA module 0 for HSO mode
  IE = 0xC0;
  CR = 1; // Start PCA timer.
  while(1) {}
}

Kann man diese High/Low-Wechsel-Benachrichtigung über Interrupt 6 auch 
mit der PWM-Einstellung machen? Bei PWM (statt High-speed-Output-Mode) 
klappte es bei mir auch nach Wechsel auf Interrupt 6 nicht...
Gast #942464
Lesenswert?

Ich glaube im 8-Bit PWM-Mode wird nur der PCA-Timer einen Interrupt beim 
Überlauf auslösen. Die einzelnen Flankenwechsel nicht. Du kannst Dir das 
zeitlich aber im Programm berechnen. Ein Eckpunkt ist der PCA-Interrupt, 
den 2. kennst Du auch, der Dutty-Wert. Eventuell könnte man in einen 
schnellen Timerinerrupt auch den Portpin samplen.
Gast #942985
Lesenswert?

Was ich im Prinzip nur haben möchte, ist eine limitierte Anzahl von 
Flanken. Ich sende "6 Flanken bitte", der uC sendet sie auch und fällt 
dann wieder auf 0 bis zu einer neuen Anfrage.

Ist eine Lösung über die PCA-based High-speed-Output-Methode ok? Ich 
zähle im Interrupt einfach mit und setze CR = 0 (counter off), wenn die 
gewünschte Anzahl erreicht ist. Gibt es keine Nachteile oder Probleme, 
so daß ich mir die PWM-Methode (mit komplizierten) Timer-Berechnungen 
sparen kann?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren