Forum: Mikrocontroller und Digitale Elektronik AT89C51CC02 PWM-Interrupt


von AT89-Fan (Gast)


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... :(

von Matthias (Gast)


Lesenswert?

> void pca_interrupt(void) interrupt 4  using 1
PCA Interrupt müsst Nr. 6 sein. 4 ist die UART.

> EC = 1;
Das ist ok.

von AT89-Fan (Gast)


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...

von Matthias (Gast)


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.

von AT89-Fan (Gast)


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?

von Matthias (Gast)


Angehängte Dateien:

Lesenswert?

Müsste so klappen...

Kennst Du die Intel PCA-Beschreibung der Anlage? Hat mir schon oft 
geholfen. Zwar nicht von Atmel, aber weitgehend kompatibel.

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.