Genau, Timer-Interrupt.

a) (Irgendeinen) Timer auf Interrupt im CTC-modus initialisieren. So nach dem Muster (hier für den mega168, in C, weil ich kein Basic mache):

Code:
    TCCR0A |= (1<<WGM01);		// Timer im CTC-Mode, Top=OCRA  (doc S104)
    TCCR0B |= (1<<CS01);		// Prescaler 1/8 / Clock <- CPU	(doc S106)
    OCR0A = 125;                        // Preset 125 für 50µs bei 20Mhz  
    TIMSK0 |= (1<<OCIE0A);		// Tmr/Cntr0 CompareA interrupt enabled
und dann - z.B. auf Tastendruck, den Vorteiler auf einen entsprechenden Wert setzten und den Preset OCRnx:
Code:
    OCR0A = 125;                        // Preset 125 für 50µs bei 20Mhz  
    TIMSK0 |= (1<<OCIE0A);		// Tmr/Cntr0 CompareA interrupt enabled
Dann kommt am entsprechenden Pin Deine gewünschte Frequenz (wenns richtig initialisiert ist). Und Du kannst das mit OCIEnx auch bei Bedarf aus- und wieder einschalten.

Viel Erfolg,