hagbart06
16.11.2009, 19:31
Hallo,
möchte mit einem PIC (16F628A bzw 12F675) eine Frequenz an einem PIN erzeugen. Sie soll von ca. 20 Hz bis 1,6 kHz in 10 Hz Schritten mittels zweier Taster einstellbar sein. Eine Frequenz zu erzeugen war auch nicht das Problem, nur ist es so das es keine Lineare Funktion ist. Es lassen sich die niedrigen Werte sehr genau, die hohen Werte sehr ungenau einstellen.
Um das zu verdeutlichen hab ich eine Wertetabelle im Anhang. Die Werte passen zwar nicht mehr zu dem Programm, verdeutlichen das Problem aber.
Hier noch das Programm:
#pragma config |= 0b.0011.0101.0000.0010 //Prozessor Konfiguration
void pause1(uns16 ms)
{
while(ms)
{
OPTION = 2;
TMR0 = 131;
while (TMR0);
ms--;
}
}
void pause(void)
{
OPTION = 2;
TMR0 = 131;
while (TMR0);
}
void main(void) // Hier beginnt das Hauptprogramm
{
TRISA = 0b.0000.0000;
TRISB = 0b.1111.1111;
bit Plus @ PORTB.1 ; // Pin RB1 erhält Name "Plus"
bit Minus @ PORTB.2 ; // Pin RB2 erhält Name "Minus"
char w; // W für Tasterentprellung
unsigned int Zahler; // Zähler für Taster
Zahler=100; // Zähler-Startwert = 100
Sprungmarke:
if (Plus) // Wenn "Plus"-Taster gedrückt ist, dann
{
Zahler = Zahler + 10; // Zähler + 10
}
for (w=0;w<50;w++)
{
pause(); // Hier wird zum Entprellen gewartet
}
if (Minus) // Wenn "Minus"-Taster gedrückt ist, dann
{
Zahler = Zahler - 10; // Zähler - 10
}
for (w=0;w<50;w++)
{
pause(); // Hier wird zum Entprellen gewartet
}
PORTA.0 = 1; // PIN wird high
pause1(Zahler); // Warte durch Zähler definierte Zeit
PORTA.0 = 0; // PIN wird low
pause1(Zahler); // Warte durch Zähler definierte Zeit
goto Sprungmarke;
}
Ich hatte auch schon versucht das ganze mittels Switch und case umzusetzen, also jedem Wert eine Frequenz zuzuordnen. Das hat auch funktioniert allerdings wird das Programm dadurch natürlich viel zu groß. Deshalb hab es es dann nach 10 Werten gelassen, abgesehen davon wird es bei den hohen Frequenzen auch wieder unmöglich die 10er Schritte beizubehalten. Wenn jemand noch eine andere Idee hat, wie man es hinbekomm eine Frequenz zu erzeugen die man in 10er Schritten hoch bzw. runter stellen kann wäre ihm sehr dankbar.
Gruß
Kevin
möchte mit einem PIC (16F628A bzw 12F675) eine Frequenz an einem PIN erzeugen. Sie soll von ca. 20 Hz bis 1,6 kHz in 10 Hz Schritten mittels zweier Taster einstellbar sein. Eine Frequenz zu erzeugen war auch nicht das Problem, nur ist es so das es keine Lineare Funktion ist. Es lassen sich die niedrigen Werte sehr genau, die hohen Werte sehr ungenau einstellen.
Um das zu verdeutlichen hab ich eine Wertetabelle im Anhang. Die Werte passen zwar nicht mehr zu dem Programm, verdeutlichen das Problem aber.
Hier noch das Programm:
#pragma config |= 0b.0011.0101.0000.0010 //Prozessor Konfiguration
void pause1(uns16 ms)
{
while(ms)
{
OPTION = 2;
TMR0 = 131;
while (TMR0);
ms--;
}
}
void pause(void)
{
OPTION = 2;
TMR0 = 131;
while (TMR0);
}
void main(void) // Hier beginnt das Hauptprogramm
{
TRISA = 0b.0000.0000;
TRISB = 0b.1111.1111;
bit Plus @ PORTB.1 ; // Pin RB1 erhält Name "Plus"
bit Minus @ PORTB.2 ; // Pin RB2 erhält Name "Minus"
char w; // W für Tasterentprellung
unsigned int Zahler; // Zähler für Taster
Zahler=100; // Zähler-Startwert = 100
Sprungmarke:
if (Plus) // Wenn "Plus"-Taster gedrückt ist, dann
{
Zahler = Zahler + 10; // Zähler + 10
}
for (w=0;w<50;w++)
{
pause(); // Hier wird zum Entprellen gewartet
}
if (Minus) // Wenn "Minus"-Taster gedrückt ist, dann
{
Zahler = Zahler - 10; // Zähler - 10
}
for (w=0;w<50;w++)
{
pause(); // Hier wird zum Entprellen gewartet
}
PORTA.0 = 1; // PIN wird high
pause1(Zahler); // Warte durch Zähler definierte Zeit
PORTA.0 = 0; // PIN wird low
pause1(Zahler); // Warte durch Zähler definierte Zeit
goto Sprungmarke;
}
Ich hatte auch schon versucht das ganze mittels Switch und case umzusetzen, also jedem Wert eine Frequenz zuzuordnen. Das hat auch funktioniert allerdings wird das Programm dadurch natürlich viel zu groß. Deshalb hab es es dann nach 10 Werten gelassen, abgesehen davon wird es bei den hohen Frequenzen auch wieder unmöglich die 10er Schritte beizubehalten. Wenn jemand noch eine andere Idee hat, wie man es hinbekomm eine Frequenz zu erzeugen die man in 10er Schritten hoch bzw. runter stellen kann wäre ihm sehr dankbar.
Gruß
Kevin