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