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... :(
> void pca_interrupt(void) interrupt 4 using 1 PCA Interrupt müsst Nr. 6 sein. 4 ist die UART. > EC = 1; Das ist ok.
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...
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.
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.