CCP (Compare) und Timer ?
Dienstag, 22. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  PIC Mikrocontroller Allgemein  |  Timer (Allgemein)  |  CCP (Compare) und Timer ? « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: CCP (Compare) und Timer ?  (Gelesen 3840 mal)
 
MichiM3
Newbie
*
Offline Offline

Beiträge: 12


Profil anzeigen
« am: Februar 24, 2007, 18:08:42 »

Hallo ,

ich muss alle 1-40ms, ein pin toggeln. Hab nen Pic18f4550 bei 48Mhz, benutze den Tmr1 16bit mit 1:8 prescaler, interrupt bei überlauf. Zur Zeit mache ich es so das ich im Interrupt den Pin toggle und dann den Tmr1 mit einem Wert "vorlade" (oder wie mann das nennt).

Nun wollte ich das mal mit dem CCP Modul probieren. Also CCP1 so eingestellt das es mit Tmr1 vergleicht und nen Pin toggelt. Klappt, aber Tmr1 wird nicht auf null gestellt. Naja es gibt nen Special event trigger, toll jetzt wird der Tmr1 resetet aber das Pin nicht mehr getoggelt :-( Geht das irgendwie ohne einen Interrupt auslösen zu müssen?

Michi
Gespeichert
Steffen
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 1235


Profil anzeigen
« Antworten #1 am: Februar 26, 2007, 11:22:17 »

Sollte mit CCP1M3:CCP1M0 = 0010 = Compare mode, toggle output on match (CCPIF bit is set) funktionieren.

Gruß
Steffen
Gespeichert
Bernd
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 3815



Profil anzeigen
« Antworten #2 am: Februar 26, 2007, 20:18:43 »

Zitat
Also CCP1 so eingestellt das es mit Tmr1 vergleicht und nen Pin toggelt. Klappt, aber Tmr1 wird nicht auf null gestellt. Naja es gibt nen Special event trigger, toll jetzt wird der Tmr1 resetet aber das Pin nicht mehr getoggelt. Geht das irgendwie ohne einen Interrupt auslösen zu müssen?

Wie Du bereits korrekt festgestellt hast, ist es nicht möglich, den Pin-Toggle Modus mit dem Special Event Trigger zu kombinieren.

Ohne Interrupt würde es nur funktionieren, wenn man das CCP-Modul im PWM-Modus verwenden könnte. Bei der von Dir gewählten Taktfrequenz wird dieser Ansatz aber nicht funktionieren (der Timer2 "läuft zu schnell").


Viele Grüße

Bernd
Gespeichert

Steffen
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 1235


Profil anzeigen
« Antworten #3 am: Februar 27, 2007, 09:03:02 »

Stimmt, Bernd hat recht.
Gespeichert
MichiM3
Newbie
*
Offline Offline

Beiträge: 12


Profil anzeigen
« Antworten #4 am: Februar 28, 2007, 01:27:39 »

Naja dann hab ich das datasheet (leider) doch richtig verstanden. Also bringt mir in meinem Fall das Capture Module nichts. Wenn ich eh nen Interrupt auslösen muss kann das auch der Tmr1 machen, und im Interrupt setze ich den Timer neu.
Gespeichert
Bernd
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 3815



Profil anzeigen
« Antworten #5 am: Februar 28, 2007, 19:41:26 »

Zitat
Wenn ich eh nen Interrupt auslösen muss kann das auch der Tmr1 machen, und im Interrupt setze ich den Timer neu.

Ich würde dennoch das CCP-Modul verwenden und mir das Setzen des Timers ersparen (im Interrupt muß dann nur noch der Pin getoggelt werden).

Nur als Anmerkung: Beim Setzen des Timers entsteht eine prinzipielle zeitliche Ungenauigkeit, wenn der Prescaler nicht auf 1:1 konifguriert ist, da beim Schreiben des Timers der Zähler des Prescalers gelöscht wird.


Viele Grüße

Bernd
Gespeichert

cosin
Newbie
*
Offline Offline

Beiträge: 2


Profil anzeigen
« Antworten #6 am: Mai 11, 2007, 09:11:14 »

Hallo,

habe das selbe vor (Frequenzen an RC2 generieren) und CCP1CON auf 00000010 gesetzt, damit das toggeln selbständig funktioniert.
Da ich variable Freq. erzeugen muss (1 - 10kHz), muss ich den Comparewert eh immer wieder verändern.

Leider funktioniert das nicht zuverlässig.
Der Timer 1 wird von mir in der CCP1 - ISR gestoppt, genullt, neue Comparewerte reingeschrieben und wieder gestartet.
Trotzdem passiert es immer wieder, dass die Compareeinheit kein Compare-Ereignis erkennt.

Wie macht man das denn richtig?
Gespeichert
Bernd
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 3815



Profil anzeigen
« Antworten #7 am: Mai 11, 2007, 21:47:54 »

Zitat
Wie macht man das denn richtig?

Mit der von Dir beschriebenen Vorgehensweise sollte es eigentlich funktionieren. Könntest Du mal Deinen Code posten? Was genau meinst Du mit

Zitat
Trotzdem passiert es immer wieder, dass die Compareeinheit kein Compare-Ereignis erkennt.

Werden Interrupts "verpaßt", verändert sich der Pinzustand nicht oder funktioniert das CCP-Modul überhaupt nicht mehr?


Viele Grüße

Bernd
Gespeichert

cosin
Newbie
*
Offline Offline

Beiträge: 2


Profil anzeigen
« Antworten #8 am: Mai 21, 2007, 13:09:21 »

Hallo,

sorry, war ein paar Tage unterwegs.
Also, im Fehlerfall findet kein Compare-Event statt. Erst wenn der 16-Bit Timer überläuft tritt ein Interrupt auf. Das passiert bei 40MHz alle 6,5535ms.

Hier die Init:

Code:
T1CON = 0x80; // Output Compare mode mit Timer 1, kein Prescaler, Timer1 inkr. alle 100ns bei 40MHz
TMR1=0;
TMR1ON = 0;     // Timer stoppen, es geht erst los, wenn CAPCOM initialisiert ist
CCPR1H  = 0x10; // Erster Comparewert setzen
CCP1CON = 0b00000010;
TMR1ON = 1;     // Timer starten


Hier die CCP1-ISR:

Code:
TMR1ON      = 0; // Timer stoppen
CCPR1H = ucCompareHi;
CCPR1L = ucCompareLo;
WRITETIMER1(2);
TMR1ON      = 1; // Timer starten
B_CLEAR_BIT(CCP1IF);

Der Timer 1 läuft wohl richtig, weil er wie erwartet alle 6,5ms überläuft.
Die Variablen ucCompareHi und ucCompareLo werden in einer normalen Funktion immer wieder mit neuen
Werte beschrieben. Während diesem Schreibvborgang sperre ich alle Interrupts.
Wenn ich die Variablen ucCompareHi/Lo auf einem Wert fest belasse funktioniert das, nur wenn ich unterschiedliche Werte als neue Comparwerte vorgebe, führt das hin und wieder zu fehlenden Compare-Ereignissen.

Danke für's mitdenken
Cosin

Edit: Bitte Code-Tags verwenden.
Bernd
« Letzte Änderung: Mai 21, 2007, 21:08:13 von Bernd » Gespeichert
Bernd
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 3815



Profil anzeigen
« Antworten #9 am: Mai 21, 2007, 21:25:10 »

Verwendest Du Interrupt-Prioritäten und gibt es einen Interrupt, der den CCP-Interrupt unterbrechen kann? Nur dann könnte ich mir erklären, wie ein Interrupt "verloren" gehen könnte. Das Toggeln vom Pin muß aber selbst dann weiterhin funktionieren (wenn auch mit den "alten" Werten von ucCompareHi und ucCompareLo).

Anderenfalls würde das von Dir beobachtete Verhalten darauf hindeuten, daß es ein prinzipielles Hardware-Problem im CCP-Modul des PICs gibt.


Viele Grüße

Bernd
Gespeichert

Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.036 Sekunden mit 18 Zugriffen.
 
Top! Top!