Hallo.
Ich wollte jetzt als nächstes einen Timer für meinen PIC16F876 @ 10MHz machen um ein PWM Signal zu erzeugen um dann zwei Servos anzuschliessen.
Ich programiere in C und würde den Timer0 nehmen, der laut Sprut ein 8-Bit Timer ist und von 0 bis 255 zählen kann.
Im Internet habe ich verschiedene Code Fragmente oder Formeln gefunden, weiss aber nicht ob und wie ich sie verwenden kann.
Das erste wäre:
time = 1/frequenz * 4 * Timerwert * vorteiler
Jetzt habe ich aber auf einer anderen Seite diesen Code gefunden:
Code:
// Für Taktfrequenz des PIC = 4 MHz
void Delay1ms( uns16 ms) //verstehe nicht warum "16ms". Ist nur ein Name,
//da kann ich schreiben was ich will, oder?
{
while(ms) // Schleife verlassen wenn ms=0 ist
{
OPTION = 2; // Vorteiler auf 8 einstellen
OK, die Tabelle mit den Vorteilern habe ich
im Datenblatt auf Seite 47-48 vom PIC gefunden und bis da hin
vertehe ich es auch.
TMR0 = 131; // 125 * 8 = 1000 (= 1 ms)
while (TMR0); // abwarten einer Milisekunde
ms--; // "ms" mit jeder Milisekunde erniedrigen
}
}
Wenn ich die Formel von oben benutze um TMR0 auszurechnen kommt bei mir was anderes raus:
1/4M * 4 * 125 *8 = 1ms TMR= ist also 125 und nicht 131
Der Unterschied ist vieleicht nicht wichtig, aber ich verstehe nicht wie man auf 131 kommt.
Nächster Code:
Code:
//Für Taktfrequenz des PIC = 20 MHz
//Timerauflösung=13us
//1ms/13us=77
//delay<=255 !!
//Nicht sonderlich genau !!
void Delay1ms( uns16 time)
{
char next = 0;
OPTION = 6; // prescaler divide TMR0 rate by 128
TMR0 = 0; //
do {
next += 39; // 4992=128*39 ,4992+15=5007/5=1,0014ms
clrwdt(); // needed only if watchdog is enabled
while (TMR0 != next) // 125 * 8 = 1000 (= 1 ms)
;
} while ( -- time != 0);
}
Laut Formel:
1/20MHz *4 * 39 * 128 = 1ms Hm... OK, dann stimmt die Formel ja.
Wenn ich bei meinem PIC jetzt einen 10MHz Quarz benutze, gilt dann für mich:
1/10MHz * 4 * 20 *128 = 1ms ?
Falls das so stimmt, könnte der timer in C dann so sein?
Wie ihr seht habe ich den Code von oben genommen und verändert.
Code:
{
void Delay_1ms( uns16 ms)
while(ms)
{
OPTION = 6;
TMR0=20;
while (TMR0);
ms--;
}
}
Muss ich sonnst noch etwas in den Code schreiben oder könnte ich das so in den PIC brennen?
Wenn das funktioniert, habe ich dann noch eine Frage zum PWM zur Servo Steuerung, aber das später.
Viele GrÜsse,
Tornado
Lesezeichen