Hi Willa,

Du weißt ja, dass ich in Bascom ein absoluter Nobody bin. Aber gerade habe ich einen tiny85 auf dem Breadbord - der im Wesentlichen von seinem Timer "lebt". Du weißt sicher, dass der tiny85 ein Bruder vom t45 ist. Läuft mit 8 MHz+CKDIV8 - also mit 1 MHz vom internen Oszillator. Daraus mache ich mit dem Timer0 einen Takt von 1 ms => 1 kHz. WENN ich den Prescaler (CLK/ 8 ) nicht nehmen würde und WENN ich die fuse CKDIV8 nicht nehmen würde - könnte ich also ohne Änderung auf einen Takt von 64 kHz kommen - 15 µs/Takt bei 8 MHz. Und hätte keinerlei interne Taktprobleme zu erwarten. Mit einem schnelleren (Quarz-)Takt ist entsprechend mehr möglich.
Zitat Zitat von Willa
... nach 250 overflows ... nach 500 overflows ... warte ich nochmal 5000 overflows ab (=20ms) ...
Dürfte also auch Deinen Ansprüchen genügen.

Obs Dir hilft weiß ich nun nicht, aber ich habe mal Initialisierung und ISR rausgeschippselt - hier ist der code. Wünsch Dir alles Gute:
Code:
/* >> 
  Sicherung 03Jan10 1630   ...C2..\PCR_80\PCR_80_tmr_x31.c 
.............
 ================================================================================ */
// ================================================================================

 
// ================================================================================
// ===  Initialisierung fuer Timer0 tiny85 bei 1 MHz (IntOsz) =====================
 void TC0TMR_init(void)         // Init Tmr/Cntr0, ca. 1,00 kHz = 1000µs = 1ms
 {	                        // COM0A1=COM0A0=0 => OC0A disconnected
  TCCR0A  |=  (1<<WGM01);       // Timer im CTC-Mode, Top=OCRA            doc S  82
  TCCR0B  |=  (1<<CS01);        // Prescaler 1/8 / Clock = 1/8 CPU-Takt   doc S  83
  OCR0A    =  122;              // Preset/Preload 121 => ca. 1,00 ms @ 1,0Mhz
  TIMSK   |=  (1<<OCIE0A);      // Tmr/Cntr0 CompareA interrupt enabled
 }                                
// ================================================================================


// ================================================================================
// ===  Nicht unterbrechbare ISR für timer0 =======================================
// zählt hoch mit 1 kHz/1,0 ms. Zählerwert (=Zeitwert) wird für Zeitmessung benutzt
 ISR(TIM0_COMPA_vect)           // Vektor 11 (0 ... 2 !!!)                doc S  50
{                                 
//### Izeit_0 = Zähler für Zeithorizont hochzählen. Izthrznt wird im main definiert
//      durch die erforderliche Interruptzahl für EINE Sekunde
//      Durch Izhrznt kann eine Feinjustage der "BoardUhr" erreicht werden
                                  
 Izeit_0 ++;                    // Mit 1 kHz hochzählen
 if (Izeit_0 >= Izthrznt)       // Interrupt-Timer = "Zeithorizont" begrenzen auf
                                //   Izthrznt = Zeit für EINE Sekunde
 {                              // Izeit_0 gleich oder größer als Izthrznt ==>
   Izeit_0   =  0;              //   ...Sekundenzähler zurückstellen auf Null
   // ..... Hier folgen noch weitere Zeitvariablen (sec, min, etc).
 }                                
 return;                          
}                                 
// ================================================================================


// ================================================================================
// =====  ENDE    Subroutinen  ====================================================
// ================================================================================

Anmerkung:

volatile uint16_t Izthrznt;     // Der zeitliche Horizont, z.B. 1000 für 1 sec
                                //   Möglich wäre 60 000 <=> 1 min
volatile uint16_t Izeit_0;      // Timertakt in timer0 <=> siehe dort

 Izthrznt =   996;      // Zeithorizont Timer0/1MHz / 1,00 ms => ergibt EINE Sekunde
                        // Abweichung im Test: 600 sec = 599,86 sec real
                        //      bzw. 600,00 sec +/- 0,5 sec