Timer1 und CCP-Modul
Mittwoch, 23. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  PIC Mikrocontroller Allgemein  |  Timer (Allgemein)  |  Timer1 und CCP-Modul « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: Timer1 und CCP-Modul  (Gelesen 876 mal)
 
JensB
Newbie
*
Offline Offline

Beiträge: 11


Profil anzeigen WWW
« am: Juli 29, 2011, 22:01:45 »

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):

Code:
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
Code:
CCP1CON = 0b1010;

Interrupts enablen nicht vergessen:
Code:
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).
Code:
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
Code:
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
Gespeichert
Stampede
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 969



Profil anzeigen WWW
« Antworten #1 am: Juli 30, 2011, 10:51:16 »

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
Gespeichert

JensB
Newbie
*
Offline Offline

Beiträge: 11


Profil anzeigen WWW
« Antworten #2 am: Juli 30, 2011, 11:08:16 »

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
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.039 Sekunden mit 19 Zugriffen.
 
Top! Top!