Autor Thema: Timer1 und CCP-Modul  (Gelesen 4219 mal)

Offline JensB

  • Newbie
  • *
  • Beiträge: 11
    • Profil anzeigen
    • jb-electronics
Timer1 und CCP-Modul
« am: Juli 29, 2011, 22:01:45 Nachmittag »
Hallo mal wieder,

nachdem ihr mir schon so toll beim SLEEP-Mode-Problem weitergeholfen habt (das hab ich als "NixieFreak" nachgefragt), habe ich mich mal angemeldet und habe direkt noch eine Frage.

Ich möchte Servos (erst mal nur einen) mit dem PIC16F627A ansteuern, dafür brauche ich Signale im Bereich 1..2ms, kennt ihr sicher. Mein Ansatz sieht so aus:

Config-Word ist 0x3f70.

Verwende den internen 4MHz-Takt, also effektiv 1MHz, schalte Timer1 ein mit 1:8 Prescaler (d.h. alle 8us zählt der hoch):

TMR1CS = 0;
T1CKPS0 = 1;
T1CKPS1 = 1;
TMR1ON = 1;

Dann aktiviere ich das CCP-Modul in den Compare-Modus, aber der CCP-Pin soll damit nichts zu tun haben. Daher
CCP1CON = 0b1010;

Interrupts enablen nicht vergessen:
CCP1IE = 1;
PEIE = 1; // danke Bernd!
GIE = 1;

Dann möchte ich testweise mal ein 1ms-Signal erzeugen. Ich setze also den Ausgangspin (RB0, TRISB0 = 0) namens "servo" auf 1, und den Compare-Wert auf 125 (125 * 8us = 1ms).
servo = 1;

// geht bei 125 einfacher, aber das folgende gilt für beliebige Zahlen.
CCPR1L = 125 & 0x00ff;
CCPR1H = (125 & 0xff00) >> 8;

In der ISR steht dann noch drin
if (CCP1IF) {

  servo ^= 1;
  CCP1IF = 0;

}

Und das sollte mir doch ein Signal geben, das immer 1ms lang ist.

Und was erhalte ich: ca. 0.5s lange Signale. Was zum Teufel? Ich kann es mir nicht erklären. Hat jemand eine Idee?

Dass die Signalpulse wirklich ca. 0.5s (= etwa eine halbe Sekunde) lang sind, habe ich optisch mittels LED überprüft und auch mit meinem 25MHz LA.

Es würde mich freuen, wenn ihr mir wieder so toll weiterhelfen könnt.

Viele Grüße
Jens

Offline Stampede

  • Hero Member
  • *****
  • Beiträge: 1026
    • Profil anzeigen
    • PicPlayer.de
Re:Timer1 und CCP-Modul
« Antwort #1 am: Juli 30, 2011, 10:51:16 Vormittag »
Hi Jens,

Zitat
Verwende den internen 4MHz-Takt, also effektiv 1MHz, schalte Timer1 ein mit 1:8 Prescaler (d.h. alle 8us zählt der hoch):
Richtig.
Zitat
Dann aktiviere ich das CCP-Modul in den Compare-Modus, aber der CCP-Pin soll damit nichts zu tun haben
Das macht keinen Sinn. Das Servo Signal ist ein Recheck (Periode ca. 20ms) und einem variablem Dutycycle. Daher ist der PWM Modul der richtig Ansatz:
http://www.sprut.de/electronic/pic/grund/pwm.htm

Dann solltest du dir überlegen, ob du nicht einen anderen Controller verwendest, der PIC16F627A ist ja nun auch nicht mehr der neueste. Billigere und bessere Alternative wäre der PIC16F687.

Gtüße
Stefan

Offline JensB

  • Newbie
  • *
  • Beiträge: 11
    • Profil anzeigen
    • jb-electronics
Re:Timer1 und CCP-Modul
« Antwort #2 am: Juli 30, 2011, 11:08:16 Vormittag »
Hallo Stefan,

danke für die Antwort. Habe das Problem mittlerweile erkannt, es lag an der Triggerung servo_x ^= 1 *ohne* dabei den Timer1 zurückzusetzen. Klar, dass er dann immer bei ca. 0.5s toggelt ;-)

Also das Programm läuft jetzt wie gewünscht, ich bekomme ca. 1ms-Signale raus. Was mich nur nervt, ist, dass der im Compare-Mode nicht automatisch den Timer1 resettet. Kann ich dem das irgendwo sagen?

Ansonsten werd ich mir die PWM-Lösung noch mal angucken, streng genommen ist es ja eher PPM als PWM ;-)

Gruß
Jens

 


* Recent Topics